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

Boost bjam-如何在构建目标之前始终执行shell脚本?,boost,boost-build,bjam,b2,Boost,Boost Build,Bjam,B2,我的目标是建立一个包含版本信息的库 我有一个脚本,只有在版本实际发生更改时才会更新/version.cpp。这是为了防止不必要的重建 我有一个库目标globs*.cpp,它包括version.cpp 问题是,如果我运行bjam,我可以看到它执行脚本,并更新version.cpp,但是库不会重建。 只有当我再次运行bjam时,它才会看到version.cpp已更改,并重建库 我的jam文件: Echo [ SHELL "./write_version.sh" ] ; lib foo :

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

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

我有一个库目标globs
*.cpp
,它包括
version.cpp

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

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

我的jam文件:

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

lib foo
    : [ glob *.cpp ]
    ;
$ 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...
Echo [ SHELL "./write_version.sh" ] ;

build-project foo ;
运行bjam的输出(两次):

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

lib foo
    : [ glob *.cpp ]
    ;
$ 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...
Echo [ SHELL "./write_version.sh" ] ;

build-project foo ;
问题:

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

lib foo
    : [ glob *.cpp ]
    ;
$ 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...
Echo [ SHELL "./write_version.sh" ] ;

build-project foo ;

如何使脚本和库构建一起工作?

问题是,在加载
Jamfile
时,依赖关系会得到解决

ie:在示例
Jamfile
中:

lib foo
    : [ glob *.cpp ]
    ;
lib foo
    : [ glob *.cpp ]
    ;
加载
Jamfile
时,cpp文件是
globbed
stat'd
。任何没有过时的都不会重建

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

解决方法是在
Jamroot
中执行shell脚本。这样,在加载使用它的
Jamfile
之前,会更新
version.cpp
。该文件是
stat'd
,发现该文件已更新,并且
lib foo
已重建

Jamroot:

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

lib foo
    : [ glob *.cpp ]
    ;
$ 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...
Echo [ SHELL "./write_version.sh" ] ;

build-project foo ;
foo-Jamfile:

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

lib foo
    : [ glob *.cpp ]
    ;
$ 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...
Echo [ SHELL "./write_version.sh" ] ;

build-project foo ;