2

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

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

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

我正在尝试建立对测试程序的依赖关系,以便每次编译它们时,库也会重新编译(如果需要的话)。

关于如何做的任何建议?

4

2 回答 2

2

好的,这似乎不像我想的那么简单,所以我自己想出了一个解决方案。它使用脚本来实现最终结果,所以我仍然希望 Jam 大师将有一个仅果酱的解决方案。

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

  • 在项目根目录下创建一个Jamfile,内容如下:

    子目录。;
    子包括 。源代码;
    子包括 。测试 ;

  • 在 src 目录下创建一个 Jamfile
    子目录 .. src ;
    图书馆 mylib : mylib.c ;

  • 在 test 目录下创建一个 Jamfile
    子目录 .. 测试;
    主要 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%
于 2008-10-14T16:02:53.263 回答
0

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

在我的顶级 Jamfile 中,我输入SubDir TOP ;. 这会将变量初始化$(TOP)为指向包含此 Jamfile 的目录。然后我添加诸如SubInclude TOP bin llvm-tblgenand之类的行SubInclude TOP lib Support,它将 Jamfiles 的内容添加到构建中bin/llvm-tblgenlib/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。希望对你有帮助!

于 2013-08-26T00:03:50.660 回答