Определите зависимости между каталогами в 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. Надеюсь, это поможет вам!