我试图让 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
包含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
的创建。我的印象是,在创建所有节点之前,scan 中的 c 预处理器不应该运行,但似乎如果我从 prog
目录运行,waf
不会了解这些生成的 header ,即使它们在其他目录的 wscript
文件中被定义为目标。
[编辑:我刚刚意识到这在一定程度上是有道理的——当从顶层运行时,它将安排构建 header ,然后依赖关系将很好地解析。 Waf 似乎没有“如果需要,可以构建”的项目列表]
有一些解决方法,例如使用 name
并在 C 文件 wscript 中添加 use = ...
指令。有没有办法。但是,让它自动工作?看起来 waf
应该拥有让它自动工作所需的所有信息。
(使用 waf 1.7.8 和 2.0.8 测试)
最佳答案
当您在子目录中启动 waf 时,它只会发布子树中定义的任务生成器。这是为了允许部分构建。 waf 知道您的依赖项扫描包含在您的 C 文件中,但由于包含可以是系统包含,因此不会触发任何内容。要在树的另一部分触发任务生成器,最好的办法是 use =
,我认为这是最好的方法。您还可以使用:
bld.program(source = ["main.c", "../gen/test.h"], ...)
但我发现它的模块化程度较低。
关于c - 在 waf 中,如何定义对来自另一个子目录的生成 header 的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50752856/