Определите зависимости между каталогами в Jam - PullRequest
2 голосов
/ 13 октября 2008

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

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

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

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

Есть предложения о том, как это сделать?

Ответы [ 2 ]

2 голосов
/ 14 октября 2008

Хорошо, кажется, это не такой простой вопрос, как я думал, поэтому я самостоятельно разработал решение. Он использует скрипт для достижения конечного результата, поэтому я все еще надеюсь, что у гуру 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 голосов
/ 26 августа 2013

Я использую Jam в одном из моих проектов , и я сталкиваюсь с самой вашей ситуацией. У меня есть исполняемые программы в подкаталоге 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. Надеюсь, это поможет вам!

...