我试图让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进行测试)