MLIBC ist eine vollständig vorgestellte C -Standardbibliothek, die im Hinblick auf Portabilität entwickelt wurde.
Wir unterstützen eine Reihe von Architekturen (x86-64, AARG64, RISC-V, IA-32, M68K) und bieten eine saubere Abstraktionsschicht für neue Betriebssysteme an, an die sich neue Betriebssystemports anschließen können.
Im Gegensatz zu anderen tragbaren C -Standardbibliotheken wie Newlib streben wir eine Parität mit Glibc/Musl, dh Vollphread -Unterstützung und GNU -Erweiterungen an.
MLIBC ist in der Lage, eine Reihe von Software auszuführen, darunter XORG, verschiedene Wayland Compositors, MESA und Webbrowser wie Webkitgtk -, obwohl noch einige Funktionen fehlen.
Einzelne Betriebssysteme können sich wie gewünscht an oder aus bestimmten Merkmalen entscheiden. Zum Beispiel sind POSIX -APIs wie pthread hinter der Option "POSIX", Linux -APIs wie epoll hinter der Linux -Option usw. geschaltet.
Offizieller Discord -Server: https://discord.gg/7wb6ur3
AUR-Paket (bietet mlibc-gcc ): https://aur.archlinux.org/packages/mlibc
| Verzeichnis | Zweck |
|---|---|
options/ | (Mehr oder weniger) OS-unabhängige Header und Code.options/ sind in Unterverzeichnisse unterteilt, die durch Ports aktiviert oder deaktiviert werden können. |
sysdeps/ | OS-spezifische Header und Code.sysdeps/ sind in subdirektorien pro port unterteilt. Genau eines dieser Unterverzeichnisse ist in jedem Build aktiviert. |
abis/ | OS-spezifische Schnittstellenheader ("ABI Header"). Diese enthalten die Konstanten und Strukturen der OS -Schnittstelle. Zum Beispiel die numerischen Werte von SEEK_SET oder O_CREAT Live hier sowie Strukturen wie struct stat . ABI -Header dürfen nur Konstanten, Strukturen und Gewerkschaften enthalten, aber keine Funktionserklärungen oder Logik.abis/ ist in Subdirektorien pro OS unterteilt, aber diese Aufteilung dient nur zu organisatorischen Zwecken. Ports können immer noch Header aus verschiedenen abis/ Subditionorien mischen. |
Ports zu neuen Osen sind willkommen. In Port MLIBC zu einem anderen Betriebssystem müssen die folgenden Änderungen vorgenommen werden:
sysdeps/ subditionory sysdeps/some-new-os/ und ein meson.build hinzu, um es zu kompilieren. Integrieren Sie sysdeps/some-new-os/meson.build in das toplevel meson.build .abis/some-new-os/ . Fügen Sie Ihren ABI-Headern Symlinks in sysdeps/some-new-os/include/abi-bits hinzu. Sehen Sie sich vorhandene Ports an, um die ABI-Header zu ermitteln, die für die Optionen erforderlich sind, die von sysdeps/some-new-os/meson.build aktiviert sind.sysdeps/some-new-os/ CODE, um die Funktionen aus options/internal/include/mlibc/internal-sysdeps.hpp zu implementieren (eine Teilmenge von) zu implementieren. Welche Teilmenge Sie benötigen, hängt von den Optionen ab, die sysdeps/some-new-os/meson.build ermöglichen. Wir empfehlen, dass neue Ports nicht vom master aufgebaut werden, da wir gelegentlich interne Änderungen vornehmen, die dazu führen, dass Sysdeps außerhalb der Bräuche brechen. Stattdessen empfehlen wir Ihnen, eine bestimmte Veröffentlichung (oder ein bestimmtes Bestimmungen) festzuhalten oder Ihre Änderungen an diesem Repository zu stromaufwärts, damit wir sie auf unserem CI erstellen können, und daher werden alle Breakagen von uns in Tree behoben.
Die folgenden maßgefertigten Meson-Optionen werden zusätzlich zu den integrierten Optionen akzeptiert. Die folgenden Optionen sind Booleans, die zu False standardmäßig sind (siehe meson_options.txt ).
headers_only : Nur Header installieren; Bauen Sie nicht libc.so oder ld.sono_headers : Installieren Sie keine Header; Bauen Sie nur libc.so und ld.sobuild_tests : Erstellen Sie die Testsuite (siehe unten).x_option : Aktivieren Sie x -Komponente der MLIBC -Funktionalität. Eine vollständige Liste möglicher Werte für x finden Sie unter meson_options.txt . Dies kann verwendet werden, um z. B. POSIX- und GLIBC -Erweiterungen zu deaktivieren.linux_kernel_headers : Ermöglicht die Anweisung von MLIBC auf installierte Linux -Header. Diese können leicht erhalten werden, in einem Verzeichnis platziert und diese Option auf den entsprechenden Pfad eingestellt werden. Dies ist erforderlich, wenn die Linux -Option aktiviert ist, dh wenn die Linux -Option nicht deaktiviert ist.debug_allocator : Ersetzen Sie den normalen Allokator durch einen Debug -Allocator (siehe mlibc/options/internal/generic/allocator.cpp für Implementierungsdetails).use_freestnd_hdrs : Verwenden Sie Freestnd-C {, xx} -hdrs, anstatt nach Compiler-Headern zu suchen. Nützlich, wenn Sie keinen Compiler mit dem richtigen Target -Triple verwenden. Die zu erstellende Art der Bibliothek (statisch, geteilt oder beides) wird durch die Option default_library von Meson gesteuert. Das Bestehen -Ddefault_library=static deaktiviert effektiv den dynamischen Linker.
Wir unterstützen auch das Gebäude mit -Db_sanitize=undefined , um UBSAN in MLIBC zu verwenden. Beachten Sie, dass dies UBSAN nicht für externe Anwendungen ermöglicht, die sich mit libc.so verknüpfen, aber es kann während der Entwicklung nützlich sein, interne Fehler zu erkennen (z. B. beim Hinzufügen neuer Systeme).
Um Ihren Code vor dem Einreichen eines PR zu formatieren, sollten Sie pre-commit installieren. Anschließend pre-commit install Sie den Git-Hook, der jedes Mal ausgeführt wird, wenn Sie sich verpflichten. Alternativ können Sie pre-commit run -a durchführen, um alle Dateien manuell zu formatieren.
Die mlibc -Testsuite kann unter einem Linux -Host ausgeführt werden. Installieren Sie dazu zuerst eine Reihe von Kernel -Headern (wie hier beschrieben) und rennen Sie dann aus der Projektwurzel:
meson setup -Dbuild_tests=true -Dlinux_kernel_headers=/path/to/kernel/headers/include build
Dadurch wird ein build -Verzeichnis erstellt. Dann cd build und führen Sie die Tests (Ausgabe anzeigen) mit: Führen Sie mit:
meson test -v