我试图让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.hmain.cincludestest.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的创建在我的印象中,scan中的c预处理器不应该在所有节点创建之前运行,但是如果我从prog目录运行,waf似乎不知道这些生成的头,即使它们被定义为其他目录的wscript文件中的目标。
[编辑:这有一定的意义,我刚刚意识到-当从顶层运行时,它将安排构建头文件,然后依赖关系将得到很好的解决Waf似乎没有“如果需要,可以构建”的项目列表]
有一些解决方法,例如使用name并在C文件wscript中添加use = ...指令有办法吗不过,让它自动工作似乎waf应该拥有使其自动工作所需的所有信息。
(使用waf 1.7.8和2.0.8进行测试)

最佳答案

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

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

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

关于c - 在WAF中,如何定义对另一个子目录中生成的 header 的依赖性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50752856/

10-12 18:36