在 Jam 中定义跨目录依赖关系

发布于 2024-07-07 08:36:05 字数 245 浏览 12 评论 0原文

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

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

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

我试图建立对测试程序的依赖关系,所以每次我编译它们时,这些库也会被重新编译(如果需要的话)。

关于如何做有什么建议吗?

After many years of using make, I've just started using jam (actually ftjam) for my projects.

In my project workspaces, I have two directories:

  • src where I build executables and libraries
  • test where my test programs are

I'm trying to set up a dependency on test programs so that each time I compile them, the libraries will be recompiled as well (if they need to).

Any suggestion on how to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绳情 2024-07-14 08:36:05

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

  • 在项目的根目录中创建一个具有公共定义的 Jamrules。

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

    SubDir . ;
    SubInclude . src ;
    SubInclude . test ;

  • 在src目录下创建Jamfile
    SubDir .. src ;
    Library mylib : mylib.c ; 

  • 在test中创建Jamfile目录
    SubDir .. test ;
    Main mytest : mytest.c ; 
    Depends 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%

Ok this seems to be not an as easy question as I thought so I worked out a solution on my own. It uses a script to achieve the end result so I still hope that a Jam guru will have a jam-only solution.

  • Create a Jamrules in the root directory of the project with the common definitions.

  • Create a Jamfile in the root directory of the project with the following content:

    SubDir . ;
    SubInclude . src ;
    SubInclude . test ;

  • Create a Jamfile in the src directory
    SubDir .. src ;
    Library mylib : mylib.c ; 

  • Create a Jamfile in the test directory
    SubDir .. test ;
    Main mytest : mytest.c ; 
    Depends mytest :  mylib$(SUFLIB) ;

With this setting, as long as I am in the root directory, whenever I try to build mytest the library will also be recompiled (if needed). I found an old message on the jammer mailing list describing it.

Alas this doesn't work if I'm in the test subdirectory since jam can only look down into subdirectories.

So, I created a simple script called jmk and put it together with the jam executable (so that both are in the path):

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

and I set the JMKROOT environment variable to the root of my project.

For when I compile in a Windows shell (that's why I want to use Jam) I simply use this small jmk.bat batch file:

@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%
冷夜 2024-07-14 08:36:05

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

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

bin/llvm-tblgen 中的 Jamfile 中,我输入 SubDir TOP bin llvm-tblgen ;。 我在 lib/Support 中的 Jamfile 中执行了相同的操作,但我使用 SubDir TOP lib Support ; 代替。 输入 SubDir 规则时的关键是输入从 TOP 到包含此 Jamfile 的目录的每个子目录的名称。

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

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

I'm using Jam in one of my projects, and I am encountering your very situation. I have my executable programs in the bin subdirectory, and my static libraries are kept in the lib subdirectory.

In my top-level Jamfile, I type in SubDir TOP ;. This initializes the $(TOP) variable to point to the directory containing this Jamfile. I then add lines such as SubInclude TOP bin llvm-tblgen and SubInclude TOP lib Support, which adds the contents of the Jamfiles in bin/llvm-tblgen and lib/Support to the build.

In the Jamfile in bin/llvm-tblgen, I type in SubDir TOP bin llvm-tblgen ;. I do the same in the Jamfile in lib/Support, but I use SubDir TOP lib Support ; instead. The key when entering SubDir rules is to type in the names of each subdirectory from the TOP to the directory containing this Jamfile.

Then, when it is time to set the linkline of my executable target, I reference the support library like this: $(TOP)/lib/Support/libLLVMSupport.a. Jam expands this path into the location of libLLVMSupport.a, relative to where I run Jam, even if I cd into the bin/llvm-tblgen directory and run Jam manually from there.

This makes it very easy to manage large projects that contain cross-directory dependencies. This solution, unlike your earlier one, lets you run Jam directly. Hope it helps you!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文