在使用 make 多年之后,我刚刚开始在我的项目中使用 jam(实际上是 ftjam)。
在我的项目工作区中,我有两个目录:
src
我在哪里构建可执行文件和库test
我的测试程序在哪里
我正在尝试建立对测试程序的依赖关系,以便每次编译它们时,库也会重新编译(如果需要的话)。
关于如何做的任何建议?
在使用 make 多年之后,我刚刚开始在我的项目中使用 jam(实际上是 ftjam)。
在我的项目工作区中,我有两个目录:
src
我在哪里构建可执行文件和库test
我的测试程序在哪里我正在尝试建立对测试程序的依赖关系,以便每次编译它们时,库也会重新编译(如果需要的话)。
关于如何做的任何建议?
好的,这似乎不像我想的那么简单,所以我自己想出了一个解决方案。它使用脚本来实现最终结果,所以我仍然希望 Jam 大师将有一个仅果酱的解决方案。
使用通用定义在项目的根目录中创建一个 Jamrules。
在项目根目录下创建一个Jamfile,内容如下:
子目录。; 子包括 。源代码; 子包括 。测试 ;
子目录 .. src ; 图书馆 mylib : mylib.c ;
子目录 .. 测试; 主要 mytest : mytest.c ; 取决于 mytest : mylib$(SUFLIB) ;
使用此设置,只要我在根目录中,每当我尝试构建 mytest 时,库也将被重新编译(如果需要)。我在干扰器邮件列表上发现了一条旧消息,描述了它。
唉,如果我在 test 子目录中,这不起作用,因为 jam 只能查看子目录。
因此,我创建了一个名为的简单脚本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%
我在我的一个项目中使用 Jam ,我遇到了你的情况。我在子目录中有我的可执行程序bin
,我的静态库保存在lib
子目录中。
在我的顶级 Jamfile 中,我输入SubDir TOP ;
. 这会将变量初始化$(TOP)
为指向包含此 Jamfile 的目录。然后我添加诸如SubInclude TOP bin llvm-tblgen
and之类的行SubInclude TOP lib Support
,它将 Jamfiles 的内容添加到构建中bin/llvm-tblgen
和lib/Support
构建中。
在 Jamfile in 中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 的位置的位置,即使我 cd 进入该bin/llvm-tblgen
目录并从那里手动运行 Jam。
这使得管理包含跨目录依赖项的大型项目变得非常容易。此解决方案与您之前的解决方案不同,它允许您直接运行 Jam。希望对你有帮助!