gpt4 book ai didi

c - 在 waf 中,如何定义对来自另一个子目录的生成 header 的依赖

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com