bjam - 如何在构建目标之前始终执行shell脚本?

时间:2014-07-01 05:04:02

标签: boost bjam boost-build boost-bjam b2

我的目标是建立一个包含版本信息的库。

我有一个脚本,只有在版本实际更改时才会更新./version.cpp 。这样可以防止不必要的重建。

我有一个lib目标,其中包含*.cpp,其中包含version.cpp

问题在于,如果我运行bjam我可以看到它执行脚本,并更新version.cpp,但库未重建。

只有当我再次运行bjam时才会看到version.cpp已更改,并重建lib

我的果酱文件:

Echo [ SHELL "./write_version.sh" ] ;

lib foo
    : [ glob *.cpp ]
    ;

运行bjam的输出(两次):

$ bjam
Updating version.cpp

...found 119 targets...

$ bjam
...found 121 targets...
...updating 3 targets...
gcc.compile.c++ ../foo/bin/gcc-4.8/debug/link-static/version.o
gcc.archive ../foo/bin/gcc-4.8/debug/link-static/libfoo.a
...updated 3 targets...

问题:

如何让两者脚本和库构建一起工作?

1 个答案:

答案 0 :(得分:1)

问题是在加载Jamfile时解析了依赖关系

ie:在示例中Jamfile

lib foo
    : [ glob *.cpp ]
    ;

加载globbed时,cpp文件为stat'dJamfile。任何未过期的都不会被重建。

加载Jamfile后,bjam执行生成更新version.cpp的脚本,太晚了。

解决方法是在Jamroot中执行shell脚本。以这种方式version.cpp更新之前加载使用它的Jamfile。该文件为stat'd,已找到要更新,并且lib foo已重建。

<强> Jamroot中:

Echo [ SHELL "./write_version.sh" ] ;

build-project foo ;

foo Jamfile:

lib foo
    : [ glob *.cpp ]
    ;