08 марта 2011

Первая сборка (Шаг 2)

Привет. С чего начинается программа? Странный вопрос. Ответ на него простой. Начинается все с вывода Hello World!!!. Зачем? Затем что это хороший способ проверить как работает система сборки, завести репозиторий и сделать первый комит.

Что мы делаем:

  1. Скрипт сборки для CMake
  2. Простой код, выводящий на экран "Hello World!!!"
  3. Первый комит в систему контроля версий (git)
Скрипт сборки для CMake

Начнем со скрипта сборки. CMake это не банан. Все о CMake. Хотите знать больше, посмотрите в Википедии. Для нас CMake будет генерировать Makefile. Собирать проект мы будем с помощью make.

cmake_minimum_required (VERSION 2.8)

# Имя для нашего исполняемого файла
set(BIN_NAME tankofdestiny)
# Директория в которую ляжет наш исполняемый файл
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin)
# Флаги сборки
set(CMAKE_C_FLAGS "-g -O0 -Wall -Werror -pedantic -pedantic-errors")

# Имя и язык проекта
project (${BIN_NAME} C)

# Находим все *.c в директории src и сохраняем их
# в переменной SRC_FILES
aux_source_directory(src SRC_FILES)

# Говорим где искать *.h файлы
include_directories(include)

# Добавляем цель для сборки нашего исполняемого файла
add_executable(${BIN_NAME} ${SRC_FILES})

# Цель для запуска программы, люблю когда такая возможность есть
add_custom_target(run ${BIN_NAME})

# Цель для удаления всех сгенерированных файлов CMake.
# Тут кстати нужно добавить префикс для удаляемых файлов
# ${CMAKE_BINARY_DIR}, но сейчас в этом нет необходимости.
# Просто запомните, что пути желательно использовать абсолютные.
add_custom_target(clean_all rm -rf CMakeCache.txt
  CMakeFiles cmake_install.cmake Makefile bin)

Язык проекта полезно указывать для того, что бы упростить задачу CMake. Это не окончательный вариант скрипта сборки, в дальнейшем он разрастется и будет больше. Пока мы будем довольствоваться малым. Не все сразу.

Пару слов почему C. Это простой язык. Он легкий в использовании и быстрый в исполнении. На нем легко описывать основную часть игры. Более запутанные части, вроде взаимодействия объектов, можно легко перенести на плечи скриптового языка. И самое главное, мне он нравиться.

Простой код, выводящий на экран "Hello World!!!"

Давайте теперь напишем код для проверки скрипта сборки. Нам нужны два файла с расширением .c и один с расширением .h. Так же стоит обзавестись файлами COPYING и README.

Обо всем по порядку.

print.h

/* Tank of Destiny
 * Copyright (C) 2011  Alexander A. Prusov
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef PRINT_H__
#define PRINT_H__

#include <stdio.h>

#define HELLO "Hello World!!!\n"

void
print();

#endif /* PRINT_H__ */

print.c

/* Tank of Destiny
 * Copyright (C) 2011  Alexander A. Prusov
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "print.h"

void
print()
{
  printf(HELLO);
}

main.c

/* Tank of Destiny
 * Copyright (C) 2011  Alexander A. Prusov
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "print.h"

int
main(int argc, char *argv[])
{
  (void)argc;
  (void)argv;
  print();
  return 0;
}

Простой код, в комментариях не нуждается. Копирайт, он же копилефт.

Файл COPYING - это GPLv3.

Файл README - простая инструкция по сборке программы и ее запуску. Пока этот файл полупустой, в дальнейшем он наполниться информацией о управлении и прочими буквами.

В итоги мы должны получить что-то вроде такого:

.
|-- CMakeLists.txt
|-- COPYING
|-- include
|   `-- print.h
|-- README
`-- src
    |-- main.c
    `-- print.c
Сделать первый комит в систему контроля версий (git)

Почему git? Мне он нравиться. И я признаю только распределенные системы управления версиями файлов. Нам понадобиться всего несколько команд: git init, git add ., git commit -m "Initial commit".

Правда перед тем как делать комит, убедитесь что ничего лишнего в репозиторий не попадет. Создайте файл .gitignore следующего содержания:

CMakeFiles
CMakeCache.txt
bin
cmake_install.cmake
Makefile

Так же советую воспользоваться весьма полезным хуком для git. Он позволит вам избежать комита с файлами у которых есть ненужные пробелы в конце строки, а так же проследить за кошерностью перевода строк в файле.

В результате у нас появляется репозиторий. Который мы сможем разместить например на github. Вот кстати и он.

В заключение

Перед использованием CMake можно ознакомиться с его документацией, она очень большая и очень подробная (man cmake).

Для использования git можно ознакомиться с документацией с сайта. Для каждой команды есть свой man.

Теперь будем писать тесты. Дела тут не в том что разработка через тестирование это круто, просто тесты очень облегчают написания кода, дают хоть какую-то уверенность что тут все же что-нибудь да работает.