Kompilieren von D-Anwendungen

Meson unterstützt das Kompilieren von D-Programmen. Eine minimale meson.build-Datei für D sieht so aus:

project('myapp', 'd')

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

Bedingte Kompilierung

Wenn Sie die version()-Funktion für bedingte Kompilierung verwenden, können Sie diese über die Target-Eigenschaft d_module_versions nutzen.

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

Für das Debugging werden debug()-Bedingungen in Debug-Builds automatisch kompiliert. Zusätzliche Bezeichner können mit dem Argument d_debug hinzugefügt werden.

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

In declare_dependency

Seit Version 0.62.0 ist es bei der Deklaration eigener Abhängigkeiten mithilfe von declare_dependency möglich, Parameter für D-spezifische Features hinzuzufügen, z. B. um bedingte Kompilierungsversionen weiterzugeben.

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

Akzeptierte D-spezifische Parameter sind d_module_versions und d_import_dirs (DMD -J Switch).

Einbettete Unittests verwenden

Wenn Sie eingebettete unittest-Funktionen verwenden, muss Ihr Quellcode zweimal kompiliert werden: einmal im regulären Modus und einmal mit aktivierten Unittests. Dies geschieht durch Setzen der Target-Eigenschaft d_unittest auf true. Meson übergibt immer nur das -unittest-Flag des jeweiligen Compilers und generiert nie eine leere main()-Funktion vom Compiler. Wenn Sie diese Funktion auf portable Weise benötigen, erstellen Sie selbst eine leere main()-Funktion für Unittests, da der GNU D-Compiler diese Funktion nicht hat.

Dies ist ein Beispiel für die Verwendung von D-Unittests mit Meson.

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-Bibliotheken kompilieren und installieren

Das Erstellen von D-Bibliotheken ist ein unkomplizierter Prozess, nicht anders als das Erstellen von C-Bibliotheken in Meson. Sie sollten eine pkg-config-Datei generieren und installieren, damit andere Software auf dem System die Abhängigkeit finden kann, sobald sie installiert ist.

Dies ist ein Beispiel, wie man eine D-Shared-Bibliothek erstellt.

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/')

Es ist wichtig, die D-Quellen in einem Unterverzeichnis im Include-Pfad zu installieren, in diesem Fall /usr/include/d/mylib/mylib. Alle D-Compiler inkludieren standardmäßig das Verzeichnis /usr/include/d. Wenn Ihre Bibliothek in /usr/include/d/mylib installiert würde, besteht eine hohe Wahrscheinlichkeit, dass der Compiler beim erneuten Kompilieren Ihres Projekts auf einer Maschine, auf der Sie es installiert haben, die alte installierte Include-Datei der neuen Version im Quellcodebaum vorzieht, was zu sehr verwirrenden Fehlern führt.

Dies ist ein Beispiel dafür, wie die gerade erstellte und installierte D-Bibliothek in einer Anwendung verwendet wird.

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])

Bitte beachten Sie, dass die Bibliothek und die ausführbare Datei mit exakt demselben D-Compiler und derselben D-Compiler-Version erstellt werden müssen. Die D-ABI ist nicht stabil über Compiler und deren Versionen hinweg, und das Mischen von Compilern führt zu Problemen.

Integration mit DUB

DUB ist ein vollständig integriertes Build-System für D, aber es ist auch eine Möglichkeit, Abhängigkeiten bereitzustellen. Das Hinzufügen von Abhängigkeiten aus dem D-Paket-Repository ist ziemlich einfach. Wie das geht, erfahren Sie unter Dependencies. Sie können auch automatisch eine dub.json-Datei generieren lassen, wie in Dlang erläutert.

Die Ergebnisse der Suche sind