waf:嵌套项目和_cache.py:不支持

waf: nested projects and _cache.py: not supported?

本文关键字:cache py 不支持 嵌套 项目 waf      更新时间:2023-10-16

我正在将一个项目从autotools转换为waf,希望它也能在windows中轻松编译。

我正在使用一个超级项目,其中有两个子文件夹,这是两个项目。

其中一个是库,另一个是程序,像这样:

  1. 超级项目/wscript
  2. 超级项目/libraryproject/wscript
  3. 超级项目/programproject/wscript

看来waf对子项目的支持非常糟糕。我在每个目录中都有一个wscript。

我从superproject递归到另外两个项目,但两个项目都共享_cache.py文件。这有以下副作用(问题):

  1. 当使用boost工具时,我不得不这样使用它来避免名称冲突:

    # In library project
    cfg.check_boost('boost_program_options', uselib_store='BOOST_LIBRARYPROJECT')
    # In program project
    cfg.check_boost('boost_program_options', uselib_store='BOOST_PROGRAMPROJECT')
    

    boost-libs和boost-includs命令行选项默认情况下也会丢失,所以我必须手动设置它们,如下所示:

    cfg.env.LIBPATH_BOOST_PROGRAMPROJECT = cfg.options.boost_libs
    ...
    
  2. _cache.py文件被programproject/wscript覆盖,从而丢失所有标志的配置

问题:

  1. 有没有什么好的方法来嵌套项目并至少避免问题2
  2. 有没有什么合理的方法可以避免不需要脚本和单独构建项目的情况

配置文件不会写入两次。

我的错误是这样做:

cfg.env = ConfigSet()

我想要一个新的干净的ConfigSet,但在两个项目中都这样做会丢失第一组标志。

既然环境似乎是在所有项目配置之间共享的,那么用自定义名称命名变量是一种好的风格吗?例如,不使用:

cfg.check_boost('program_options')

我应该使用:

cfg.check_boost('program_options', uselib_store='BOOST_MYPROGRAMPROJECT')
  1. 这种风格好吗?还是通常用另一种方式
  2. 是否可以以更干净的方式导出ConfigSets