Определите зависимости между каталогами в Jam

После многих лет использования make я только начал использовать jam (на самом деле ftjam) для своих проектов.

В рабочих областях моего проекта у меня есть две директории:

  • src где я строю исполняемые файлы и библиотеки
  • test где мои тестовые программы

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

Любое предложение о том, как это сделать?

2 ответа

Хорошо, это кажется не таким простым вопросом, как я думал, поэтому я разработал решение самостоятельно. Он использует скрипт для достижения конечного результата, поэтому я все еще надеюсь, что у гуру Jam будет решение только для варенья.

  • Создайте Jamrules в корневом каталоге проекта с общими определениями.

  • Создайте Jamfile в корневом каталоге проекта со следующим содержимым:

    SubDir.;
    SubInclude . срк;
    SubInclude . тестовое задание;

  • Создайте Jamfile в каталоге src
    SubDir .. src;
    Библиотека mylib: mylib.c; 

  • Создать Jamfile в тестовой директории
    SubDir .. test; Главный mytest: mytest.c; Зависит от mytest:  mylib$(SUFLIB); 

С этим параметром, пока я нахожусь в корневом каталоге, всякий раз, когда я пытаюсь собрать mytest, библиотека также будет перекомпилироваться (при необходимости). Я нашел старое сообщение в списке рассылки jammer, описывающее его.

Увы, это не работает, если я нахожусь в подкаталоге test, так как jam может смотреть только в подкаталоги.

Итак, я создал простой скрипт jmk и положить его вместе с jam исполняемый файл (так что оба находятся в пути):

if [ "$JMKROOT" = "" ] ; then
   JMKROOT=`pwd`
   export JMKROOT
fi
cd $JMKROOT
jam $*

и я установил переменную среды JMKROOT в корень моего проекта.

Когда я компилирую в оболочке Windows (вот почему я хочу использовать Jam), я просто использую этот маленький jmk.bat командный файл:

@echo off
if "%JMKROOT%" EQU "" set JMKROOT=%CD%

set OLDCD=%CD%
cd %JMKROOT%
jam %1 %2 %3 %4 %5 %6 %7 %8 %9

cd %OLDCD%

Я использую Jam в одном из своих проектов и сталкиваюсь с самой вашей ситуацией. У меня есть исполняемые программы в bin подкаталог, и мои статические библиотеки хранятся в lib подкаталог.

В моем Jamfile верхнего уровня я набираю SubDir TOP ;, Это инициализирует $(TOP) переменная, указывающая на каталог, содержащий этот Jamfile. Затем я добавляю такие строки, как SubInclude TOP bin llvm-tblgen а также SubInclude TOP lib Support, который добавляет содержимое Jamfiles в bin/llvm-tblgen а также lib/Support для сборки.

В джемфайле в bin/llvm-tblgenНабираю SubDir TOP bin llvm-tblgen ;, Я делаю то же самое в Jamfile в lib/Supportно я пользуюсь SubDir TOP lib Support ; вместо. Ключ при входе SubDir правила, чтобы ввести имена каждого подкаталога из TOP в каталог, содержащий этот Jamfile.

Затем, когда пришло время установить линию связи моей исполняемой цели, я ссылаюсь на библиотеку поддержки следующим образом: $(TOP)/lib/Support/libLLVMSupport.a, Jam расширяет этот путь в местоположение libLLVMSupport.aотносительно того, где я использую Jam, даже если я bin/llvm-tblgen каталог и запустить Jam вручную оттуда.

Это позволяет очень легко управлять большими проектами, которые содержат зависимости между каталогами. Это решение, в отличие от предыдущего, позволяет напрямую запускать Jam. Надеюсь, это поможет вам!

Другие вопросы по тегам