我想切换到使用Jam作为我的构建系统。目前,我有一个src,包含和构建目录,我想知道如何让Jam将目标文件放在build目录中并在include目录中搜索包含文件。
答案 0 :(得分:3)
使用Jam对你有好处!一旦你克服了一些奇怪的东西,我认为你会发现它比makefile容易得多。
您所询问的是我经常使用的设置。在顶层,我有三个目录:src,inc和build。还有一个名为Jamfile的文件:
# top-level Jamfile
SubDir . ;
SubInclude src ;
SubInclude build ;
SubDir行在目录结构中建立此文件的位置,并且似乎是Jam工作所必需的。 (我认为Jam本来可以设计成不需要它,但它就是,所以就是这样。)SubInclude行告诉Jam包含两个子目录。 inc子目录不包括在内,因为那里没有任何东西需要直接编译;其所有内容都将包含在其他文件中。
在inc中,我有一个名为header.h的头文件:
/* header.h */
#define MESSAGE "Hello world!"
在src中,我有主程序源代码main.c:
/* main.c */
#include "header.h"
#include <stdio.h>
int main(int argc, char** argv)
{
printf("%s\n", MESSAGE);
return 0;
}
在src中还有另一个包含以下内容的Jamfile:
# src/Jamfile
SubDir .. src ;
HDRS += ../inc ;
Library helloworld : main.c ;
SubDir行在目录结构中定位Jamfile。 HDRS线告诉Jam可以找到其他标头(当时间到来时它会将其传递给编译器)。请注意使用+ =运算符,它附加到现有变量。 Library行告诉Jam用main.c构建一个库(是的,带有main()的库有点奇怪,但在这样的小项目上没问题。)
在build中是一个Jamfile:
# build/Jamfile
SubDir .. build ;
Main helloworld ;
LinkLibraries helloworld : helloworld ;
SubInclude .. src ;
SubDir行在目录结构中定位Jamfile。主线告诉Jam构建一个名为helloworld的可执行文件。请注意,它没有源文件依赖项。如果是,它看起来像Main hello world : foo.c ;
。 LinkLibraries行告诉Jam将helloworld可执行文件与库(也称为helloworld)链接起来。在这种情况下,可执行文件和库具有相同的名称,但在实际程序中,您可能希望为它们提供不同(和更好)的名称。 SubInclude行告诉Jam在src目录中查找要构建的更多代码。这就是可执行文件和库之间的依赖关系得到解决的方式。重要的是这条线路最后一次。
现在,如果您导航到build目录并执行jam命令,Jam将在src中构建一个helloworld.a文件,并将其链接到build中的helloworld可执行文件。
因为src中的所有代码都被编译到库中,所以没有剩余的.o文件。毕竟,它们都存储在.a文件中,这是一个存档。如果你在构建中有其他源文件(比如上面提到的假设的foo.c),那么在编译之后你会在build目录中留下.o文件。
祝你好运。我从Perforce website和实验中学到了大部分关于Jam的知识。 Jam的主要Perforce页面为here。