2014-07-01 51 views
1

我的目標是建立一個包含版本信息的庫。bjam - 如何在構建目標之前始終執行shell腳本?

我有一個腳本,只有當版本實際發生變化時纔會更新./version.cpp。這可以防止不必要的重建。

我有一個lib目標,其中globes *.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

的問題是,當Jamfile加載

即依賴得到解決:在本例中Jamfile

lib foo 
    : [ glob *.cpp ] 
    ; 

的cpp文件是globbedstat'd加載Jamfile時。任何未過期的都不會被重建。

加載Jamfile後,bjam執行腳本,該腳本生成更新的version.cpp,即太遲。

解決方法是執行Jamroot中的shell腳本。以這種方式version.cpp更新之前Jamfile它使用它被加載。該文件是stat'd,發現要更新,並且lib foo重建。

Jamroot中:

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

build-project foo ; 

富的Jamfile:

lib foo 
    : [ glob *.cpp ] 
    ; 
相關問題