2017-08-10 76 views
0

我試圖將項目切換到meson/ninja,但需要多次執行ninja才能成功完成,初看起來早期故障是由於應該在它之前完成不完整的構建步驟。看起來不按順序的步驟通常是在我調用sedcustom_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: '[email protected]@.vapi'.format(apiversion), 
     vala_gir: '[email protected]@.gir'.format(apiversion), 
    dependencies: lib_b_deps, 
     c_args: lib_b_args, 
    soversion: soversion, 
     install: true, 
    install_dir: [ true, true, true, false ], 
) 

custom_target('[email protected]@.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="[email protected]@"/>|<include name="LibA" version="@[email protected]"/><package name="[email protected]@"/>|'.format(apiversion), 
       join_paths(meson.current_build_dir(), '[email protected]@.gir'.format(apiversion)), 
       ], 
     output: '[email protected]@.gir'.format(apiversion), 
     capture: true, 
     install: true, 
    install_dir: dir_gir, 
) 

if g_ir_compiler.found() 
    custom_target('[email protected]@.typelib'.format(apiversion), 
     command: [ g_ir_compiler, 
        '--shared-library', lib_b.full_path(), 
        '--includedir', lib_a_girdir, 
        '--output', '@[email protected]', 
        join_paths(meson.current_build_dir(), '[email protected]@.gir'.format(apiversion)), 
       ], 
     output: '[email protected]@.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設置移植,但是工作起來很慢。

回答

0

您必須將輸出放入custom_targetinput關鍵字中,以便他們瞭解依賴關係並按正確順序運行。

而且你應該使用GNOME模塊生成GIR文件:http://mesonbuild.com/Gnome-module.html#gnomegenerate_gir

+0

嗯,似乎沒有必要使用'gnome'模塊時'valac'輸出'gir'直接。我反正試過了,'gnome.generate_gir'不會輸出一個可以用作另一個'custom_target'輸入的文件。當我編譯時,我得到'src/lib/b/LibB-1.0.gir'所需的'src/lib/b/Lib-1.0.gir'的錯誤,缺少並且沒有已知的規則來創建它。也許這樣做是錯誤的,我正在嘗試使用'meson',但我會爭辯說我應該能夠在編譯器生成的文件上運行'sed | awk | whatever'。 – geoffjay

+0

經過更多的搞亂之後,我覺得很自信地說,在一組Vala源代碼中調用'gnome.generate_gir'不起作用。您需要Vala來生成構建自檢文件時包含的頭文件,而'g-ir-scanner'顯然不會將Vala文件作爲輸入。所以你需要'valac'來生成'gir'文件。不幸的是,它看起來像手動生成比使用介子更容易。 – geoffjay

+0

抱歉忽略了它是瓦拉的事實。儘管如此,可能會討論支持輸出吉爾。 – TingPing

相關問題