Compiler-Auswahl und Anpassung eines Builds#

Auswählen eines bestimmten Compilers#

Meson unterstützt die Standard-Umgebungsvariablen CC, CXX und FC zur Auswahl spezifischer C-, C++- und/oder Fortran-Compiler. Diese Umgebungsvariablen sind in den Referenztabellen in der Meson-Dokumentation dokumentiert.

Beachten Sie, dass Umgebungsvariablen nur bei einem sauberen Build angewendet werden, da sie die Konfigurationsphase (d. h. meson setup) beeinflussen. Ein inkrementeller Neubau reagiert nicht auf Änderungen an Umgebungsvariablen – Sie müssen git clean -xdf ausführen und einen vollständigen Neubau durchführen oder meson setup --reconfigure ausführen.

Hinzufügen eines benutzerdefinierten Compiler- oder Linker-Flags#

Meson bevorzugt naturgemäß Builds, die über Befehlszeilenoptionen konfiguriert werden, die an meson setup übergeben werden. Es bietet viele eingebaute Optionen

  • Zum Aktivieren eines Debug-Builds und der Optimierungsstufe siehe den nächsten Abschnitt über „Build-Typen“.

  • Das Aktivieren von -Werror auf portable Weise geschieht über -Dwerror=true.

  • Das Aktivieren von Warnstufen geschieht über -Dwarning_level=<val>, wobei <val> einer von {0, 1, 2, 3, everything} ist.

  • Es gibt viele weitere eingebaute Optionen, von der Aktivierung von Visual Studio (-Dvsenv=true) und dem Build mit Linkzeitoptimierung (-Db_lto) bis hin zur Änderung des Standard-C++-Sprachniveaus (-Dcpp_std='c++17') oder von Linker-Flags (-Dcpp_link_args='-Wl,-z,defs').

Eine umfassende Übersicht über die Optionen finden Sie auf der Seite mit den integrierten Optionen von Meson.

Meson unterstützt auch die Standard-Umgebungsvariablen CFLAGS, CXXFLAGS, FFLAGS und LDFLAGS, um zusätzliche Flags einzufügen – mit der gleichen Einschränkung wie im vorherigen Abschnitt, dass diese Umgebungsvariablen nur für einen sauberen Build und nicht für einen inkrementellen Build berücksichtigt werden.

Verwendung verschiedener Build-Typen mit Meson#

Meson bietet während der Konfiguration des Projekts verschiedene Build-Typen. Die verfügbaren Optionen für Build-Typen finden Sie im Abschnitt „Core-Optionen“ der Meson-Dokumentation: „Core Options“.

Unter der Annahme, dass Sie von Grund auf neu bauen (führen Sie bei Bedarf git clean -xdf aus), können Sie den Build wie folgt konfigurieren, um den Build-Typ debug zu verwenden

meson setup build --buildtype debug  --prefix=$PWD/build-install

Sie können nun die dev.py-Oberfläche für weitere Build-, Installations- und Testvorgänge von SciPy nutzen.

python dev.py -s linalg

Dies funktioniert, da Meson nach der anfänglichen Konfiguration die Konfigurationsoptionen speichert.

Steuerung der Build-Parallelität#

Standardmäßig startet ninja 2*n_cpu + 2 parallele Build-Jobs, wobei n_cpu die Anzahl der physischen CPU-Kerne ist. Dies ist in den allermeisten Fällen in Ordnung und führt zu nahezu optimalen Build-Zeiten. In einigen Fällen, auf Maschinen mit wenig RAM im Verhältnis zur Anzahl der CPU-Kerne, führt dies dazu, dass ein Job den Speicher überschreitet. Falls dies geschieht, verringern Sie die Anzahl der Jobs N so, dass Sie mindestens 2 GB RAM pro Job haben. Zum Beispiel, um 6 Jobs zu starten

python -m pip install . -Ccompile-args="-j6"

oder

python dev.py build -j6

Parallele Builds mit GCC und Clang#

Es kann nützlich sein, mehrere Builds von SciPy im selben Repository zu haben, um beispielsweise die Unterschiede zwischen zwei Compilern zu vergleichen, um ein Problem zu diagnostizieren. Wie bereits erwähnt, ist Meson vollständig out-of-place, sodass sich unterschiedliche Builds nicht gegenseitig beeinträchtigen. Wir gehen im Folgenden davon aus, dass GCC der Standard ist. Bauen wir zum Beispiel mit GCC und Clang.

  1. Mit GCC bauen

    python dev.py build
    

Mit dem obigen Befehl wird Meson mit den (Standard-)GCC-Compilern im Verzeichnis build erstellen und im Verzeichnis build-install installieren.

  1. Mit Clang bauen

    CC=clang CXX=clang++ FC=gfortran python dev.py --build-dir=build-clang build
    

Mit den obigen Befehlen erstellt Meson mit den Compilern Clang, Clang++ und Gfortran im Verzeichnis build-clang und installiert dann SciPy in build-clang-install.

Meson wird die Compiler-Auswahl für das Verzeichnis build-clang speichern und kann nicht geändert werden. Daher wird bei jeder zukünftigen Ausführung von python dev.py --build-dir=build-clang <command> automatisch Clang verwendet.

Tipp: Verwenden Sie einen Alias, um die Verwendung zu vereinfachen, z. B. alias dev-clang="python dev.py --build-dir=build-clang" und dann dev-clang build.

Ein häufiger Grund für zwei Builds ist der Vergleich zwischen ihnen. Führen Sie beispielsweise die Tests für scipy.linalg für Builds mit beiden Compilern wie folgt aus:

python dev.py -s linalg                          # run tests for the GCC build
python dev.py --build-dir build-clang -s linalg  # run tests for the Clang build