在Jam中单独构建目录并包含目录

时间:2011-10-22 08:10:01

标签: build include directory jam

我想切换到使用Jam作为我的构建系统。目前,我有一个src,包含和构建目录,我想知道如何让Jam将目标文件放在build目录中并在include目录中搜索包含文件。

1 个答案:

答案 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