使用介子/忍者构建需要多次执行才能完成

Posted

技术标签:

【中文标题】使用介子/忍者构建需要多次执行才能完成【英文标题】:Building with meson/ninja takes multiple executions to complete 【发布时间】:2017-08-10 00:11:52 【问题描述】:

我正在尝试将项目切换到 meson/ninja,但需要多次执行 ninja 才能成功完成,乍一看,早期失败似乎是由于构建步骤不完整应该在它之前。看起来不正常的步骤通常是在我通过custom_target 调用sed 来修复依赖于另一个库(lib-a) 的库(lib-b) 编译期间自动生成的输出。这基本上就是我想要的 (lib-b):

lib_b = shared_library('lib-b-' + apiversion, lib_b_sources,
     link_args: [ '-Wl,--version-script' ],
   vala_header: 'lib-b.h',
     vala_args: lib_b_vala_args,
     vala_vapi: 'lib-b-@0@.vapi'.format(apiversion),
      vala_gir: 'Lib-@0@.gir'.format(apiversion),
  dependencies: lib_b_deps,
        c_args: lib_b_args,
     soversion: soversion,
       install: true,
   install_dir: [ true, true, true, false ],
)

custom_target('LibB-@0@.gir'.format(apiversion),
      command: [ sed,
                 '-e', 's|Lib[.]|LibB.|g',
                 '-e', 's|namespace name="Lib"|namespace name="LibB"|g',
                 '-e', 's|LibB[.]Foo|LibA.Foo|g',
                 '-e', 's|<package name="lib-b-@0@"/>|<include name="LibA" version="@0@"/><package name="lib-b-@0@"/>|'.format(apiversion),
                 join_paths(meson.current_build_dir(), 'Lib-@0@.gir'.format(apiversion)),
               ],
       output: 'LibB-@0@.gir'.format(apiversion),
      capture: true,
      install: true,
  install_dir: dir_gir,
)

if g_ir_compiler.found()
  custom_target('LibB-@0@.typelib'.format(apiversion),
        command: [ g_ir_compiler,
                   '--shared-library', lib_b.full_path(),
                   '--includedir', lib_a_girdir,
                   '--output', '@OUTPUT@',
                   join_paths(meson.current_build_dir(), 'LibB-@0@.gir'.format(apiversion)),
                 ],
         output: 'LibB-@0@.typelib'.format(apiversion),
        depends: lib_b,
        install: true,
    install_dir: dir_typelib,
)
endif

ninja 第一次运行后,我收到如下错误:

FAILED: src/lib/b/LibB-1.0.gir 
/usr/bin/python3 /usr/bin/meson --internal exe /home/user/proj/_build/meson-private/meson_exe_sed_3429069bbdfaffa2d113b782ce02a55d5fd96973.dat
/usr/bin/sed: can't read /home/user/proj/_build/src/lib/b/Lib-1.0.gir: No such file or directory

Lib-1.0.gir 应该是shared_library 命令的输出之一。如果我再次运行它,它会创建文件,进一步制作,并抱怨类似的错误。我再次运行它,这次更进一步,但依赖于未创建文件的其他内部项目出现错误。我最后一次运行它,它完成了。

如果meson/ninja 不能按照一个必须先于另一个的顺序执行构建步骤,我会感到惊讶。我在这里做了什么恶心/愚蠢的事情吗?我基本上是在移植一个 autotools 设置,它可以工作,但是很慢。

【问题讨论】:

【参考方案1】:

您必须将输出放入您的custom_targetinput 关键字中,以便他们了解依赖关系并以正确的顺序运行。

您还应该使用 gnome 模块来生成 gir 文件:http://mesonbuild.com/Gnome-module.html#gnomegenerate_gir

【讨论】:

嗯,当valac 直接输出gir 时,似乎没有必要使用gnome 模块。无论如何我都试过了,gnome.generate_gir 没有输出可以用作另一个custom_targetinput 的文件。编译时出现'src/lib/b/Lib-1.0.gir', needed by 'src/lib/b/LibB-1.0.gir', missing and no known rule to make it 错误。也许使用meson 做我想做的事情是错误的,但我认为我应该能够在编译器生成的文件上运行sed|awk|whatever 经过更多的混乱之后,我很有信心说在一组 Vala 源上调用 gnome.generate_gir 是行不通的。您需要 Vala 来生成在构建自省文件时包含的头文件,而 g-ir-scanner 显然不将 Vala 文件作为输入。所以你需要valac 来生成gir 文件。不幸的是,看起来手动生成比使用介子更容易。 抱歉忽略了它是 Vala 的事实。不过,可能会有关于支持输出 gir 的讨论。

以上是关于使用介子/忍者构建需要多次执行才能完成的主要内容,如果未能解决你的问题,请参考以下文章

使用介子和忍者安装 DPDK

卸载使用 ninja 安装的 dpdk

在介子中指定忍者版本?

如何将文件名作为 C++ 编译参数传递以在介子构建中使用?

介子构建:手动添加可执行文件的依赖路径

同时运行一个进程多次