編譯 D 應用程式

Meson 支援編譯 D 程式。一個最小的 D meson.build 檔案看起來像這樣

project('myapp', 'd')

executable('myapp', 'app.d')

條件編譯

如果您使用 version() 功能進行條件編譯,您可以使用 d_module_versions 目標屬性來使用它

project('myapp', 'd')
executable('myapp', 'app.d', d_module_versions: ['Demo', 'FeatureA'])

為了進行除錯,debug() 條件會在除錯建置中自動編譯,並且可以使用 d_debug 參數加入額外的識別符

project('myapp', 'd')
executable('myapp', 'app.d', d_debug: [3, 'DebugFeatureA'])

declare_dependency

自 0.62.0 版本起,當使用 declare_dependency 宣告您自己的相依性時,可以為 D 特定的功能加入參數,例如傳播條件編譯版本

my_dep = declare_dependency(
    # ...
    d_module_versions: ['LUA_53'],
    d_import_dirs: include_directories('my_lua_folder'),
)

接受的 D 特定參數為 d_module_versionsd_import_dirs (DMD 的 -J 開關)。

使用嵌入式單元測試

如果您使用嵌入式 unittest 函式,您的原始碼需要編譯兩次,一次為常規模式,另一次則啟用單元測試。這是透過將 d_unittest 目標屬性設定為 true 來完成的。 Meson 只會傳遞各自編譯器的 -unittest 標誌,而絕不會讓編譯器產生空的 main 函式。如果需要以可移植的方式使用該功能,請自行建立一個空的 main() 函式來進行單元測試,因為 GNU D 編譯器不具有此功能。

這是一個在 Meson 中使用 D 單元測試的範例

project('myapp_tested', 'd')

myapp_src = ['app.d', 'alpha.d', 'beta.d']
executable('myapp', myapp_src)

test_exe = executable('myapp_test', myapp_src, d_unittest: true)
test('myapptest', test_exe)

編譯 D 函式庫並安裝它們

建置 D 函式庫是一個直接的過程,與在 Meson 中建置 C 函式庫的方式沒有不同。您應該產生一個 pkg-config 檔案並安裝它,以便系統上的其他軟體在安裝後可以找到該相依性。

這是一個如何建置 D 共享函式庫的範例

project('mylib', 'd', version: '1.2.0')

project_soversion = 0
glib_dep = dependency('glib-2.0')

my_lib = library('mylib',
    ['src/mylib/libfunctions.d'],
    dependencies: [glib_dep],
    install: true,
    version: meson.project_version(),
    soversion: project_soversion,
    d_module_versions: ['FeatureA', 'featureB', 1]
)

pkgc = import('pkgconfig')
pkgc.generate(name: 'mylib',
              libraries: my_lib,
              subdirs: 'd/mylib',
              version: meson.project_version(),
              description: 'A simple example D library.',
              d_module_versions: ['FeatureA', 1]
)
install_subdir('src/mylib/', install_dir: 'include/d/mylib/')

重要的是要讓 D 原始碼安裝在包含路徑的子目錄中,在本例中為 /usr/include/d/mylib/mylib。所有 D 編譯器預設都會包含 /usr/include/d 目錄,如果您的函式庫安裝到 /usr/include/d/mylib 中,當您在安裝它的機器上再次編譯您的專案時,編譯器很有可能會優先選擇舊的已安裝 include,而不是原始碼樹中的新版本,從而導致非常令人困惑的錯誤。

這是一個如何在應用程式中使用我們剛建置和安裝的 D 函式庫的範例

project('myapp', 'd')

mylib_dep = dependency('mylib', version: '>= 1.2.0')
myapp_src = ['app.d', 'alpha.d', 'beta.d']
executable('myapp', myapp_src, dependencies: [mylib_dep])

請記住,函式庫和可執行檔都需要使用完全相同的 D 編譯器和 D 編譯器版本進行建置。 D ABI 在不同的編譯器及其版本之間是不穩定的,混合使用編譯器會導致問題。

與 DUB 整合

DUB 是一個完全整合的 D 建置系統,但它也是提供相依性的一種方式。從 D 套件註冊表 中添加相依性非常簡單。您可以在 相依性 中找到如何執行此操作的方法。您也可以如 Dlang 中所解釋的,自動產生一個 dub.json 檔案。

搜尋結果為