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

标签 c code-generation waf

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

相关文章:

c++ - 很长的编译时间

python - 在waf中指定不同的编译器

c 预处理器字符串连接

c - 矩阵乘法与 mpi

calloc 是否可以在没有 free 的情况下安全地使用?

eclipse - 将外部构建工具集成到 Eclipse 中的最佳方法是什么?

c - 通过静态分析查找 C 项目中未使用的函数

java - 在 Eclipse 中使用的最佳 Java 代码生成工具或插件是什么?

c# - 如何通过t4生成自定义类?

c++ - 交叉编译器/平台裸包装函数,无条件跳转到函数指针