Wenn man sich `debian/rules` aus
dem Source-Paket anguckt, findet man ab Zeile 133:
Code: Alles auswählen
-rm $(CURDIR)/debian/$(p3)/usr/lib/python3/dist-packages/matplotlib/backends/web_backend/jquery/js/jquery-1.7.1.min.js
-rm $(CURDIR)/debian/$(p3)/usr/lib/python3/dist-packages/matplotlib/backends/web_backend/jquery/js/jquery-ui.min.js
-rm $(CURDIR)/debian/$(p3)/usr/lib/python3/dist-packages/matplotlib/backends/web_backend/jquery/css/themes/base/jquery-ui.min.css
Da wird also beim Bauen vom Debian-Paket extra `jquery` entfernt, damit es als Abhängigkeit über `apt` genutzt wird.
Wenn man ein wenig im
Matplotlib-Repo sucht (`git grep jquery` und `git log -G jquery`), findet man, dass die jquery bis vor ein paar Versionen einfach per Copy-Paste in ihrem Repo hatten und dass das dementsprechend in den Wheels und Source-Paketen enthalten war. Mit Version 3.3.0 ist das dann überflüssig geworden (
PR hier) und entfernt worden. Das ist anscheinend bei Debian einfach noch nicht angekommen, sodass die Abhängigkeit jetzt unnötig ist.
Allgemein gilt, dass Python-Pakete, die per `pip` installiert werden, alles Mögliche enthalten können. Nativen Code, Programme, Python-Code, HTML- und CSS-Dateien, ...
Für die restlichen nativen Abhängigkeiten:
Code: Alles auswählen
$ cd /tmp
$ virtualenv venv
$ . venv/bin/activate
$ pip install matplotlib
$ fd '.so(\.\d+)*$' venv/lib/ --print0 | xargs -0 ldd | rg -o '^\s+[/\w\.-]+( => [^(]+)' | sort | uniq
libc.so.6 => /usr/lib/libc.so.6
libdl.so.2 => /usr/lib/libdl.so.2
libfreetype-21ca3c10.so.6.18.2 => not found
libfreetype-21ca3c10.so.6.18.2 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libfreetype-21ca3c10.so.6.18.2
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1
libgfortran-040039e1.so.5.0.0 => not found
libgfortran-040039e1.so.5.0.0 => /tmp/venv/lib/python3.10/site-packages/numpy/core/../../numpy.libs/libgfortran-040039e1.so.5.0.0
libgfortran-040039e1.so.5.0.0 => /tmp/venv/lib/python3.10/site-packages/numpy/linalg/../../numpy.libs/libgfortran-040039e1.so.5.0.0
libharfbuzz-3e5a9845.so.0.40200.0 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libharfbuzz-3e5a9845.so.0.40200.0
libjpeg-dffd3595.so.62.3.0 => not found
libjpeg-dffd3595.so.62.3.0 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libjpeg-dffd3595.so.62.3.0
liblcms2-1e643a89.so.2.0.13 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/liblcms2-1e643a89.so.2.0.13
liblzma-d540a118.so.5.2.5 => not found
liblzma-d540a118.so.5.2.5 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/liblzma-d540a118.so.5.2.5
libm.so.6 => /usr/lib/libm.so.6
libopenblas64_p-r0-2f7c42d4.3.18.so => /tmp/venv/lib/python3.10/site-packages/numpy/core/../../numpy.libs/libopenblas64_p-r0-2f7c42d4.3.18.so
libopenblas64_p-r0-2f7c42d4.3.18.so => /tmp/venv/lib/python3.10/site-packages/numpy/linalg/../../numpy.libs/libopenblas64_p-r0-2f7c42d4.3.18.so
libopenjp2-430a98fc.so.2.4.0 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libopenjp2-430a98fc.so.2.4.0
libpng16-52f22300.so.16.37.0 => not found
libpng16-52f22300.so.16.37.0 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libpng16-52f22300.so.16.37.0
libpthread.so.0 => /usr/lib/libpthread.so.0
libquadmath-96973f99.so.0.0.0 => not found
libquadmath-96973f99.so.0.0.0 => /tmp/venv/lib/python3.10/site-packages/numpy/core/../../numpy.libs/libquadmath-96973f99.so.0.0.0
libquadmath-96973f99.so.0.0.0 => /tmp/venv/lib/python3.10/site-packages/numpy/linalg/../../numpy.libs/libquadmath-96973f99.so.0.0.0
libtiff-d0580107.so.5.7.0 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libtiff-d0580107.so.5.7.0
libwebp-8efe125f.so.7.1.3 => not found
libwebp-8efe125f.so.7.1.3 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libwebp-8efe125f.so.7.1.3
libwebpdemux-016472e8.so.2.0.9 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libwebpdemux-016472e8.so.2.0.9
libwebpmux-5c00cf3e.so.3.0.8 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libwebpmux-5c00cf3e.so.3.0.8
libXau-00ec42fe.so.6.0.0 => not found
libXau-00ec42fe.so.6.0.0 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libXau-00ec42fe.so.6.0.0
libxcb-1122e22b.so.1.1.0 => /tmp/venv/lib/python3.10/site-packages/PIL/../Pillow.libs/libxcb-1122e22b.so.1.1.0
libz.so.1 => /usr/lib/libz.so.1
Wie du siehst: Sehr viele shared libraries (== nativer Code, in C oder Fortran oder Rust oder ... geschrieben), die untereinander sehr viele Abhängigkeiten haben. Aber das allermeiste sind Abhängigkeiten
innerhalb der venv, also mitgelieferte. Die einzigen Abhängigkeiten, die nicht mitgeliefert werden, sind Sachen wie `libc` und `libpthread`, die auf jedem Linux-System
immer existieren. Man kann zum Beispiel sehen, dass libpng16 und libharfbuzz in die venv installiert wurden, allerdings auch in den Abhängigkeiten des Debian-Pakets stehen (libharfbuzz transitiv via libfreetype6).
Wie das realisiert wird? Die Entwickler von matplotlib bauen für jede Plattform und jede Python-Version ein eigenes Wheel (
hier ist die Liste), das jeweils alle nativen Abhängigkeiten zur Plattform passend kompiliert enthält. Und wenn es kein passendes Wheel gibt (weil man eine exotische Architektur wie S390x oder so benutzt), muss man sich selbst darum kümmern, dass die passenden Abhängigkeiten auf dem System installiert sind und `pip` wählt das Source-Paket aus und kompiliert beim Installieren alles nötige automatisch im Hintergrund.