使用make多年后,我刚刚开始为我的项目使用jam(实际上是ftjam)。
在我的项目工作区中,我有两个目录:
src
我构建可执行文件和库test
我的测试程序在哪里我正在尝试建立对测试程序的依赖,这样每次编译它们时,库都会被重新编译(如果需要的话)。
有关如何操作的任何建议吗?
答案 0 :(得分:2)
好吧这似乎不像我想的那么简单,所以我自己制定了一个解决方案。它使用脚本来实现最终结果,所以我仍然希望Jam大师能够使用仅限卡纸的解决方案。
使用通用定义在项目的根目录中创建一个Jamrules。
在项目的根目录中创建一个Jamfile,其中包含以下内容:
SubDir . ; SubInclude . src ; SubInclude . test ;
SubDir .. src ; Library mylib : mylib.c ;
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-tblgen
和SubInclude TOP lib Support
等行,这些行将bin/llvm-tblgen
和lib/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。希望它能帮到你!