如何使用Jam make工具构建不同版本的项目?

时间:2009-03-08 21:39:28

标签: c++ makefile jam

我有一个C ++项目,它编译成不同的版本,包括发行版,调试版,共享库和可执行文件,每个版本都有不同的编译器标志。我正在尝试Jam作为Make的替代品,因为它看起来像一个更简单的系统。

Jam能够做到这一点吗?主要问题是它始终将.o文件放在与源文件相同的文件夹中,因此在构建多个版本时会覆盖它们。

更新

我找到了似乎有效的解决方案。使用此文件,我可以构建库或可执行文件的调试和发布配置。

构建发布库的命令:

jam -s config=lib -s release=1

如果只键入jam,则会构建调试可执行文件。这是Jamfile:

FILES = 
    main.cpp 
    ;

BASENAME = steve ;
OBJ = obj ;

if $(release) 
{
    OBJ = $(OBJ)r ;
} 
else 
{
    DEFINES += DEBUG ;
    OBJ = $(OBJ)d ;
}

if $(config) = lib 
{
    OBJ = $(OBJ)_lib ;
    OUTFILE = lib$(BASENAME).so ;
    DEFINES += SHARED_LIBRARY ;
    LINKFLAGS += 
        -shared -Wl,-soname,$(OUTFILE) -fvisibility=hidden -fPICS 
    ;
} 
else 
{
    OUTFILE = $(BASENAME) ;
}

LOCATE_TARGET = $(OBJ) ;
MkDir $(LOCATE_TARGET) ;
Main $(OUTFILE) : $(FILES) ;

3 个答案:

答案 0 :(得分:2)

我不熟悉Perforce的Jam但是bjam允许这样做 - 而且这很简单。 bjam不会将中间文件放在与源相同的目录中;它根据您正在构建的项目类型创建调试/发布/静态/共享目录。

例如,如果您想构建库的发行版和调试版,并且想要静态构建它:

bjam debug release link=static

bjam确实有一些怪癖,但我们发现它非常有效。目前我们使用(几乎)相同的构建脚本来构建我们的系统使用msvc(8.0和9.0),x86上的gcc 4.3,ARM上的gcc 3.4和PowerPC的gcc 4.3。非常好。

答案 1 :(得分:1)

是的,它有能力做到这一点。它被称为'变体',boost.build带有'debug'和'release'预定义。也可以添加自己的“功能”,定义它们 因为链接不兼容会将生成的对象文件放入不同的子目录:

feature magic:off on:传播复合;

feature.compose on:USE_MAGIC;

我发现维护共存变体的难易程度是其中最强大的功能之一 boost.build。此外,维护项目层次结构(例如,应用程序)非常容易 要求图书馆);这是在文件级别完成的,而不是通过递归到目录中,使并行构建非常有效。

答案 2 :(得分:-2)

构建系统的受欢迎程度很重要,因为这意味着您组织中的更多人(以及未来的员工)可能会了解它并能够支持它。

我会说不要这样做。不要使用Jam。无论如何,有人提升使用它吗?我认为Ant是一个更受欢迎的系统,我觉得它更容易学习。帮助您的组织,不要碰到堵塞。