Отдельный каталог сборки и включаемый каталог в Jam - PullRequest
0 голосов
/ 22 октября 2011

Я бы хотел использовать Jam в качестве системы сборки. В настоящее время у меня есть каталоги src, include и build, и мне интересно, как я могу заставить Jam помещать объектные файлы в каталог сборки и искать включаемые файлы в каталоге include.

1 Ответ

3 голосов
/ 25 октября 2011

Хорошо для использования Jam! Я думаю, вы найдете это намного проще, чем make-файлы, как только вы преодолеете несколько его странностей.

Вы спрашиваете о настройке, которую я часто использовал. На верхнем уровне у меня есть три каталога: 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("%s\n", 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 ;. Строка LinkLibraries говорит Jam связать исполняемый файл helloworld с библиотекой, также называемой helloworld. В этом случае нормально, что исполняемый файл и библиотека имеют одно и то же имя, но в реальной программе вы можете захотеть дать им разные (и лучшие) имена. Строка SubInclude сообщает Jam, что нужно искать в каталоге src больше кода для сборки. Так разрешается зависимость между исполняемым файлом и библиотекой. Важно, чтобы эта строка была последней.

Теперь, если вы перейдете в каталог сборки и выполните команду jam, Jam создаст файл helloworld.a в src и свяжет его с исполняемым файлом helloworld в сборке.

Поскольку весь код в src компилируется в библиотеку, файлы .o не остаются. Все они хранятся в файле .a, который, в конце концов, является архивом. Если у вас есть дополнительные исходные файлы в сборке (например, гипотетический файл foo.c, упомянутый выше), то после компиляции у вас останутся файлы .o в каталоге сборки.

Удачи вам во всем этом. Большую часть того, что я знаю о джеме, я узнал на веб-сайте Perforce и экспериментах. Главная страница перформанса для Jam: здесь .

...