我试图让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
includestest.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/