在Jam中定义跨目录依赖项

时间:2008-10-13 19:30:15

标签: build build-tools jam

使用make多年后,我刚刚开始为我的项目使用jam(实际上是ftjam)。

在我的项目工作区中,我有两个目录:

  • src我构建可执行文件和库
  • test我的测试程序在哪里

我正在尝试建立对测试程序的依赖,这样每次编译它们时,库都会被重新编译(如果需要的话)。

有关如何操作的任何建议吗?

2 个答案:

答案 0 :(得分:2)

好吧这似乎不像我想的那么简单,所以我自己制定了一个解决方案。它使用脚本来实现最终结果,所以我仍然希望Jam大师能够使用仅限卡纸的解决方案。

  • 使用通用定义在项目的根目录中创建一个Jamrules。

  • 在项目的根目录中创建一个Jamfile,其中包含以下内容:


    SubDir . ;
    SubInclude . src ;
    SubInclude . test ;

  • 在src目录中创建一个Jamfile

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

  • 在测试目录中创建一个Jamfile

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

使用此设置,只要我在根目录中,每当我尝试构建mytest时,库也将被重新编译(如果需要)。我在干扰邮件列表上发现了一条描述它的旧消息。

如果我在test子目录中,这不起作用,因为jam只能将 down 看成子目录。

因此,我创建了一个名为jmk的简单脚本,并将其与jam可执行文件放在一起(以便两者都在路径中):

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

我将JMKROOT环境变量设置为项目的根目录。

当我在Windows shell中编译时(这就是我想使用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%

答案 1 :(得分:0)

我在one of my projects使用Jam,我遇到了你的情况。我在bin子目录中有可执行程序,我的静态库保存在lib子目录中。

在我的顶级Jamfile中,我输入SubDir TOP ;。这会初始化$(TOP)变量以指向包含此Jamfile的目录。然后我添加SubInclude TOP bin llvm-tblgenSubInclude TOP lib Support等行,这些行将bin/llvm-tblgenlib/Support中的Jamfiles的内容添加到构建中。

bin/llvm-tblgen的Jam文件中,我输入SubDir TOP bin llvm-tblgen ;。我在lib/Support的Jamfile中也这样做,但我使用的是SubDir TOP lib Support ;。输入SubDir规则时的关键是输入从TOP到包含此Jamfile的目录的每个子目录的名称。

然后,当我需要设置可执行目标的链接时,我会像这样引用支持库:$(TOP)/lib/Support/libLLVMSupport.a。 Jam将此路径扩展到libLLVMSupport.a的位置,相对于我运行Jam的位置,即使我进入bin/llvm-tblgen目录并从那里手动运行Jam。

这使得管理包含跨目录依赖项的大型项目变得非常容易。与以前的解决方案不同,此解决方案允许您直接运行Jam。希望它能帮到你!