我试图让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.h
(main.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测试)
答案 0 :(得分:1)
在子目录中启动waf时,它仅发布子树中定义的任务生成器。这是为了允许部分构建。 waf知道您的依赖项扫描包括在C文件中,但是系统包含项可以包括includes,它不会触发任何操作。我认为,要触发树另一部分的任务生成器,最好的办法是use =
。您还可以使用:
bld.program(source = ["main.c", "../gen/test.h"], ...)
但我发现它的模块化程度较低。