Verständnis von Meson#
Das Erstellen von SciPy stützt sich auf die folgenden Werkzeuge, die als Teil des Build-Systems betrachtet werden können
meson: das Meson-Build-System, installierbar als reines Python-Paket von PyPI oder conda-forgeninja: das von Meson aufgerufene Build-Tool, das den eigentlichen Build durchführt (z. B. Compiler aufrufen). Ebenfalls von PyPI (auf allen gängigen Plattformen) oder conda-forge installierbar.pkg-config: das Werkzeug zur Erkennung von Abhängigkeiten (insbesondere BLAS/LAPACK). Verfügbar auf conda-forge (und Homebrew, Chocolatey und Linux-Paketmanagern), aber nicht auf PyPI verpackt.meson-python: das Python-Build-Backend (d. h. das Ding, das über einen Hook inpyproject.tomlvon einem Build-Frontend wiepipoderpypa/buildaufgerufen wird). Dies ist eine dünne Schicht über Meson, mit den Hauptaufgaben (a) Schnittstelle zu Build-Frontends und (b) Erzeugung von sdists und Wheels mit gültigen Dateinamen und Metadaten.
Das Erstellen mit Meson erfolgt in mehreren Schritten
Ein Konfigurationsschritt (
meson setup) zum Erkennen von Compilern, Abhängigkeiten und Build-Optionen sowie zum Erstellen des Build-Verzeichnisses und der Dateibuild.ninja,Ein Kompilierungsschritt (
meson compileoderninja), bei dem die Erweiterungsmodule, die Teil eines gebauten SciPy-Pakets sind, kompiliert werden,Ein Installationsschritt (
meson install) zum Installieren der installierbaren Dateien aus den Quell- und Build-Verzeichnissen in das Zielinstallationsverzeichnis,
Meson verfügt über ein gutes System zur Nachverfolgung von Build-Abhängigkeiten. Ein erneuter Aufruf des Builds baut daher nur die Ziele neu, bei denen sich Quellen oder Abhängigkeiten geändert haben.
Mehr über Meson erfahren#
Meson verfügt über sehr gute Dokumentation; es lohnt sich, sie zu lesen, und sie ist oft die beste Quelle für Antworten auf die Frage „Wie mache ich X?“. Darüber hinaus kann ein umfangreiches PDF-Buch über Meson kostenlos unter https://nibblestew.blogspot.com/2021/12/this-year-receive-gift-of-free-meson.html bezogen werden
Um mehr über die Designprinzipien von Meson zu erfahren, sind die aktuellen Vorträge, die von mesonbuild.com/Videos verlinkt sind, ebenfalls eine gute Ressource.
Erläuterung der Build-Schritte#
Dies dient nur zu Lehrzwecken; es sollte kein Bedarf bestehen, diese Schritte separat auszuführen. Die dev.py-Skripte im Stammverzeichnis des Repos enthalten ebenfalls diese Schritte und können zur Einsichtnahme studiert werden.
Angenommen, wir starten von einem sauberen Repository und einer vollständig eingerichteten Conda-Umgebung
git clone git@github.com:scipy/scipy.git
git submodule update --init
mamba env create -f environment.yml
mamba activate scipy-dev
Um nun den Konfigurationsschritt des Builds auszuführen und Meson anzuweisen, die Build-Artefakte in build/ und eine lokale Installation unter build-install/ relativ zum Stammverzeichnis des Repos zu speichern, führen Sie Folgendes aus:
meson setup build --prefix=$PWD/build-install
Um dann den Kompilierungsschritt des Builds auszuführen, tun Sie
ninja -C build
Im obigen Befehl folgt auf -C der Name des Build-Verzeichnisses. Sie können mehrere Build-Verzeichnisse gleichzeitig haben. Meson ist vollständig out-of-place, sodass diese Builds sich nicht gegenseitig beeinträchtigen. Sie können beispielsweise einen GCC-Build, einen Clang-Build und einen Debug-Build in verschiedenen Verzeichnissen haben.
Um dann SciPy in das Präfix (build-install/ hier, aber beachten Sie, dass dies nur ein willkürlicher Name ist, den wir hier gewählt haben) zu installieren
meson install -C build
Es wird dann nach build-install/lib/python3.11/site-packages/scipy installiert, das sich nicht auf Ihrem Python-Pfad befindet. Um es hinzuzufügen, tun Sie (auch hier gilt, dies dient nur zu Lernzwecken, die explizite Verwendung von ``PYTHONPATH`` ist normalerweise nicht die beste Idee)
export PYTHONPATH=$PWD/build-install/lib/python3.11/site-packages/
Jetzt sollten wir scipy importieren und die Tests ausführen können. Denken Sie daran, dass wir uns aus dem Stammverzeichnis des Repos bewegen müssen, um sicherzustellen, dass wir das Paket und nicht das lokale scipy/ Quellverzeichnis verwenden.
cd doc
python -c "from scipy import constants as s; s.test()"
Das Obige führt die Tests für ein einzelnes Modul, constants, aus. Andere Möglichkeiten, die Tests auszuführen, sollten ebenfalls funktionieren, zum Beispiel
pytest --pyargs scipy
Die vollständige Testsuite sollte bestehen, ohne Build-Warnungen unter Linux (mit der GCC-Version, für die -Werror in der CI zumindest erzwungen wird) und mit höchstens einer moderaten Anzahl von Warnungen auf anderen Plattformen.