2008-10-13 1 views
2

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

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

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

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

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

ответ

2

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

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

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

 

    SubDir . ; 
    SubInclude . src ; 
    SubInclude . test ; 

  • Создайте Jamfile в каталоге Src
 

    SubDir .. src ; 
    Library mylib : mylib.c ; 

  • Создайте Jamfile в тестовом каталоге
 

    SubDir .. test ; 
    Main mytest : mytest.c ; 
    Depends mytest : mylib$(SUFLIB) ; 

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

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

Итак, я создал простой скрипт 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% 
0

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

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

В файле Jamfile в 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 напрямую. Надеюсь, это поможет вам!

Смежные вопросы