代码之家  ›  专栏  ›  技术社区  ›  wds

在waf中,如何定义对另一个subdir生成的头的依赖关系

  •  2
  • wds  · 技术社区  · 8 年前

    我试图让waf生成由任务链生成的头文件,并使用c预处理器的 scan 功能。

    下面是一个示例项目。在项目的 gen 目录,将在项目的“prog”目录中使用。

    布局:

    ├── gen
    │   ├── test.txt
    │   └── wscript
    ├── prog
    │   ├── main.c
    │   └── wscript
    ├── waf
    └── wscript
    

    这一代人 .h 文件通过顶级文件中声明的任务链发生:

    top = '.'
    
    def configure(cfg):
        cfg.load('compiler_c')
    
    def build(bld):
        from waflib import TaskGen
        TaskGen.declare_chain(name = 'int',
                          rule = 'cat ${SRC} > ${TGT}',
                          ext_in = '.txt', ext_out = '.int')
        TaskGen.declare_chain(name = 'inttoh',
                          rule = 'cat ${SRC} > ${TGT}',
                          ext_in = '.int', ext_out = '.h')
        bld.recurse(['prog', 'gen'])
    

    在Gen中,我们只需要定义 build 作为 bld(source = 'test.txt', target='test.h') .

    在prog中,我们构建一个程序,只设置include路径,不用说 test.h 直接( main.c 包括 测试h ):

    def build(bld):
        includes = [ bld.path.parent.find_dir('gen').get_bld().abspath() ]
        bld.program(source = 'main.c', target = 'prog', includes = includes)
    

    当我奔跑 waf 在顶层,一切都按预期进行。当我从 prog 但是,它从不触发 测试h . 在我的印象中,scan中的c预处理器应该在创建所有节点之前才运行,但是如果我从 掠夺 目录, WAF 不知道这些生成的头,即使它们被定义为其他目录的目标 wscript 文件。

    [编辑:这有一定的意义,我刚刚意识到-当从顶层运行时,它将安排构建头文件,然后依赖关系将得到很好的解决。waf似乎没有“如果需要,可以构建”的项目列表]

    有一些解决方法,例如使用 name 添加一个 use = ... C文件wscript中的指令。有办法吗?不过,让它自动工作?似乎 WAF 应该有使它自动工作所需的所有信息。

    (使用WAF 1.7.8和2.0.8进行测试)

    1 回复  |  直到 7 年前
        1
  •  1
  •   neuro    7 年前

    在子目录中启动waf时,它只发布子树中定义的任务生成器。这是为了允许部分生成。waf知道您的依赖项扫描包含在您的c文件中,但正如includes可以是system includes一样,它不会触发任何事情。要在树的另一部分触发任务生成器,最好的做法是 use = ,在我看来这是最好的方法。您还可以使用:

    bld.program(source = ["main.c", "../gen/test.h"], ...)
    

    但我发现它没有那么模块化。