Отдельный каталог сборки и каталог включения в Jam

#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 находится здесь.