#build #include #directory #jam
#сборка #включить #каталог #jam
Вопрос:
Я хотел бы переключиться на использование Jam в качестве моей системы сборки. В настоящее время у меня есть каталоги src, include и build, и мне интересно, как я могу заставить Jam помещать объектные файлы в каталог сборки и искать включаемые файлы во включаемом каталоге.
Ответ №1:
Спасибо за использование Jam! Я думаю, вы найдете это намного проще, чем makefiles, как только вы преодолеете некоторые из его странностей.
То, о чем вы спрашиваете, — это настройка, которую я часто использовал. На верхнем уровне у меня есть три каталога: src, inc и build. Существует также файл с именем Jamfile:
# top-level Jamfile
SubDir . ;
SubInclude src ;
SubInclude build ;
Строка SubDir определяет местоположение этого файла в структуре каталогов и, по-видимому, необходима для работы Jam. (Я думаю, что Jam мог быть разработан так, чтобы он не нуждался в нем, но так оно и есть, пусть будет так.) Строки SubInclude сообщают Jam включить два подкаталога. Подкаталог inc не включен, потому что там нет ничего, что нужно компилировать напрямую; все его содержимое будет включено другими файлами.
В inc у меня есть файл заголовка с именем header.h:
/* header.h */
#define MESSAGE "Hello world!"
В src у меня есть исходный код основной программы main.c:
/* main.c */
#include "header.h"
#include <stdio.h>
int main(int argc, char** argv)
{
printf("%sn", MESSAGE);
return 0;
}
Также в src есть еще один Jamfile с этим содержимым:
# src/Jamfile
SubDir .. src ;
HDRS = ../inc ;
Library helloworld : main.c ;
Строка SubDir определяет местонахождение файла Jamfile в структуре каталогов. Строка HDRS сообщает Jam, где можно найти дополнительные заголовки (он передаст это компилятору, когда придет время). Обратите внимание на использование оператора =, который добавляется к существующей переменной. Строка Library сообщает Jam о создании библиотеки из main.c (да, библиотека с main() немного странная, но подходит для такого небольшого проекта, как этот).
Внутри сборки находится один файл Jamfile:
# build/Jamfile
SubDir .. build ;
Main helloworld ;
LinkLibraries helloworld : helloworld ;
SubInclude .. src ;
Строка SubDir определяет местонахождение файла Jamfile в структуре каталогов. Основная строка сообщает Jam о создании исполняемого файла с именем helloworld. Обратите внимание, что у него нет зависимостей от исходного файла. Если бы это было так, это выглядело бы Main hello world : foo.c ;
так. Строка linklibrary сообщает Jam связать исполняемый файл helloworld с библиотекой, также называемой helloworld. В этом случае нормально, что исполняемый файл и библиотека имеют одно и то же имя, но в реальной программе вы можете захотеть дать им разные (и лучшие) имена. Строка SubInclude указывает Jam искать в каталоге src дополнительный код для сборки. Так устраняется зависимость между исполняемым файлом и библиотекой. Важно, чтобы эта строка была последней.
Теперь, если вы перейдете в каталог сборки и выполните команду jam, Jam создаст файл helloworld.a в src и свяжет его с исполняемым файлом helloworld в build.
Поскольку весь код в src компилируется в библиотеку, файлов .o не осталось. Все они хранятся внутри файла .a, который, в конце концов, является архивом. Если у вас есть дополнительные исходные файлы в сборке (например, гипотетический foo.c, упомянутый выше), то после компиляции в каталоге сборки останутся файлы .o.
Удачи со всем этим. Большую часть того, что я знаю о Jam, я узнал с веб-сайта Perforce и в результате экспериментов. Основная страница Perforce для Jam находится здесь.