在 Jam 中定义跨目录依赖关系
使用 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 librariestest
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
好吧,这似乎不是一个像我想象的那么简单的问题,所以我自己想出了一个解决方案。 它使用脚本来实现最终结果,所以我仍然希望 Jam 大师能有一个仅限 jam 的解决方案。
在项目的根目录中创建一个具有公共定义的 Jamrules。
在项目根目录下创建Jamfile,内容如下:
通过此设置,只要我位于根目录中,每当我尝试构建 mytest 时,该库也会被重新编译(如果需要)。 我在干扰器邮件列表上发现了一条描述它的旧消息。
唉,如果我在 test 子目录中,这不起作用,因为 jam 只能向下查看子目录。
因此,我创建了一个名为
jmk
的简单脚本,并将其与jam
可执行文件放在一起(以便两者都在路径中):并将 JMKROOT 环境变量设置为我的项目的根。
当我在 Windows shell 中编译时(这就是我想使用 Jam 的原因),我只需使用这个小的
jmk.bat
批处理文件: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:
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 thejam
executable (so that both are in the path):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:我在我的一个项目中使用Jam,并且遇到了您的情况。 我的可执行程序位于
bin
子目录中,静态库保存在lib
子目录中。在我的顶级 Jamfile 中,我输入
SubDir TOP ;
。 这将初始化$(TOP)
变量以指向包含此 Jamfile 的目录。 然后,我添加诸如SubInclude TOP bin llvm-tblgen
和SubInclude 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 thelib
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 asSubInclude TOP bin llvm-tblgen
andSubInclude TOP lib Support
, which adds the contents of the Jamfiles inbin/llvm-tblgen
andlib/Support
to the build.In the Jamfile in
bin/llvm-tblgen
, I type inSubDir TOP bin llvm-tblgen ;
. I do the same in the Jamfile inlib/Support
, but I useSubDir TOP lib Support ;
instead. The key when enteringSubDir
rules is to type in the names of each subdirectory from theTOP
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 oflibLLVMSupport.a
, relative to where I run Jam, even if I cd into thebin/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!