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

时间:2018-06-08 03:19:56

标签: c code-generation waf

我试图让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中,我们构建一个程序并且只设置包含路径,不要直接提及test.hmain.c包括test.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目录运行它时,它永远不会触发test.h的创建。我的印象是,在创建所有节点之前,扫描的c预处理器不应该运行,但是如果我从prog目录运行,waf似乎不知道这些生成的头,即使它们被定义为另一个目录的wscript文件中的目标。

[编辑:这有点意义我刚刚意识到 - 当从顶层运行它会安排构建标题,然后依赖关系将解决好。 Waf似乎没有“可以构建的项目列表,如果需要的话”]

有一些解决方法,例如使用name并在C文件wscript中添加use = ...指令。有办法吗?但是,让它自动工作?似乎waf应该拥有使其自动运行所需的所有信息。

(用waf 1.7.8和2.0.8测试)

1 个答案:

答案 0 :(得分:1)

在子目录中启动waf时,它仅发布子树中定义的任务生成器。这是为了允许部分构建。 waf知道您的依赖项扫描包括在C文件中,但是系统包含项可以包括includes,它不会触发任何操作。我认为,要触发树另一部分的任务生成器,最好的办法是use =。您还可以使用:

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

但我发现它的模块化程度较低。