Boost.Build每个项目的条件库编译

时间:2009-08-07 15:38:55

标签: c++ boost-build

我有使用Boost.Build构建的C ++项目。该项目由3个子项目组成。

    . [root]
    \-- source
        \-- common
            \-- config
                \-- config.cpp
        \-- project_1
            \-- Jamfile.jam
        \-- project_2
            \-- Jamfile.jam
        \-- project_3
            \-- Jamfile.jam
    \-- Jamroot.jam

Jamroot.jam:

    project my_project 
        : requirements 
          multi 
          debug:DEBUG
        : default-build
          static
        : build-dir bin
        ;

    alias project_1 : source/project_1 ;
    alias project_2 : source/project_2 ;
    alias project_3 : source/project_3 ;

    install dist : project_1 project_2 project_3
        : on EXE
        ;

根据此模板,每个项目都有Jamfile.jam:

    project project_N
      : requirements 
          CONFIG_DEFINE_1=
          CONFIG_DEFINE_2=
      ; 

    lib config : [ glob ../common/config/*.cpp ] ;

    exe project_N 
        : [ glob *.cpp ]  config
        :  
        ;

config.cpp使用定义CONFIG_DEFINE_1CONFIG_DEFINE_2进行条件编译(实际上它们只是常量),因此每个项目都有一个单独的config库版本。

问题是这样的方法会导致每次构建整个项目时都重建config库,无论文件是否更改。即构建第一次编译和链接所有内容,第二次构建而不进行任何修改 - 只为每个config构建project_N库。我应该如何正确设置建筑物,以免发生冗余和编译?

1 个答案:

答案 0 :(得分:1)

据我了解,您的配置库在不同的项目中共享,并为每个项目使用不同的定义。

在这种情况下无法克服重新编译,无论是boost build还是其他任何构建系统。在编译cpp文件之间,预处理文件已经更改。

如果你想避免重新编译,一个选项就是将配置库拆分为每个项目的不同库,但是根据config的样子,很多代码重复很少需要......

我能想到的唯一其他选择是减少每次都需要重新编译的代码量。

e.g。你有一个带有

的源文件LargeFunction.cpp
 #if CONFIG_DEFINE_1
     void VeryLargeFunction() {
        ...
     }
 #elif CONFIG_DEFINE_2
     void VeryLargeFunction() {
        ...
     }
 #endif

将其拆分为三个文件,一个包含为DEFINE_1定义的VeryLargeFunction,一个为DEFINE_2定义,另一个根据定义的值仅包含这两个文件。

 #if CONFIG_DEFINE_1
    #include "definitionFileFor1"
 #elif CONFIG_DEFINE_2
    #include "definitionFileFor2"
 #endif

此文件仍然需要每次都重新编译,但包含“真实”代码的目标文件不会。

您实际上只会在每次编译时重新链接现有的目标文件i.s.o.重新编译一切。

缺点是维护更多,并且不同的函数定义驻留在不同的文件中,因此代码变得有点难以阅读。