我正在尝试将项目切换到meson
/ninja
但它需要多次执行ninja
才能成功完成,乍一看,早期的失败似乎是由于应该在它之前的不完整的构建步骤。看起来乱序的步骤通常是在我调用一个sed
通过来修复依赖于另一个库 ()custom_target
的库 () 编译期间的一些自动生成的输出时。这基本上就是我对 ( ) 所拥有的:lib-b
lib-a
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
whereLib-1.0.gir
应该是shared_library
命令的输出之一。如果我再次运行它,它会创建文件,使其更进一步,并抱怨类似的错误。我再次运行它,这次更进一步,但依赖于未创建文件的其他内部项目出现错误。我最后一次运行它并完成。
如果meson
/ninja
不能按照一个必须先于另一个的顺序执行构建步骤,我会感到惊讶。我在这里做了什么恶心/愚蠢的事情吗?我基本上是在移植一个autotools
有效的设置,但是很慢。