По мере роста кодовой базы проекта появляется смысл в распределении фрагментов исходного кода по отдельным файлам. Это позволит сократить накладные расходы на его сопровождение и упростить модификацию и доработку кода в будущем.
При этом распределение кода программы по множеству файлов затрудняет процесс компиляции. Обычная команда для компиляции заменяется на последовательность команд.
$ gcc hello.c hellomain.c
При передаче множества имен файлов компилятор самостоятельно вызывает линковщик для связывания объектных файлов в результирующий исполняемый файл.
Альтернативным решением, используемым при сборке сложных проектов, является компиляция отдельных файлов исходного кода с последующим связыванием объектных файлов.
$ gcc -c hello.c -o hello.o
$ gcc -c hellomain.c -o hellomain.o
$ gcc hello.o hellomain.o -o hello
Преимущество такого подхода заключается в том, что при внесении модификаций в кодовую базу проекта приходится перекомпилировать лишь изменившиеся файлы исходного кода. В случае сложных проектов, сборка которых занимает достаточно много времени, это обстоятельство помогает сэкономить достаточно много времени. В то же время, сам процесс сборки значительно усложняется и требует особого внимания.
Компиляция каждого из файлов исходного кода в ручном режиме может значительно усложниться ввиду увеличения количества таких файлов в проекте. Для этой цели был разработан инструментарий Meson, позволяющий осуществлять сборку проектов в автоматическом режиме. Он использует файлы с описанием правил сборки с именами meson.build. Сама сборка осуществляется в отдельной директории силами утилиты ninja в параллельном режиме.
Рассмотрим простейший файла meson.build для сборки простой рассмотренной ранее программы. Для начала рассмотрим код самой программы.
Это содержимое файла исходного кода hello.c:
Загрузить исходный код примера
Это — содержимое файла исходного кода hello.h:
Загрузить исходный код примера
А это — содержимое файла исходного кода hellomain.c:
Загрузить исходный код примера
Это файл для передачи параметров конфигурации от системы сборки приложению (config.h.meson). На этапе конфигурации сборочного окружения будут установлены значения описанных констант.
Загрузить исходный код примера
А это файл meson.build. Зависимость от библиотеки glib приведена для демонстрации и не имеет практического значения.
Загрузить исходный код примера
В данном случае функция project() используется для задания параметров проекта, а именно, его имени ('Hello'), языка программирования ('c'), версии (version: '0.0.1'), лицензии (license: 'GPL3+') и минимальной версии Meson (meson_version: '>=0.31'). Функция dependency() используется для поиска зависимостей с помощью pkg-config и возвращает объекты найденных библиотек для последующего связывания в рамках функции executable(). Функция executable() задает параметры результирующего исполняемого файла, а именно, его имя ('hello'), список файлов исходного кода ('c_sources'), указание на необходимость установки (install: true) и список связываемых библиотек (dependencies: [glib]).
Для сборки проекта достаточно вызвать утилиту meson в директории с файлами исходного кода.
$ meson build
После этого нужно перейти в созданную директорию build и выполнить команду ninja.
$ cd build
$ ninja
Установка в систему осуществляется с помощью отдельной команды.
$ ninja install