MLIBC est une bibliothèque standard C entièrement en vedette conçue avec la portabilité à l'esprit.
Nous prenons en charge un certain nombre d'architectures (x86-64, AARCH64, RISC-V, IA-32, M68K), et fournissons une couche d'abstraction syscall propre pour les nouveaux ports du système d'exploitation.
Contrairement à d'autres bibliothèques standard C Portables comme Newlib, nous visons la parité des fonctionnalités avec GLIBC / MUSL, c'est-à-dire le support Pthread complet et les extensions GNU.
MLIBC est suffisamment capable pour exécuter une gamme de logiciels, notamment Xorg, plusieurs compositeurs Wayland, Mesa et des navigateurs Web comme WebKitGTK - bien que certaines fonctionnalités soient toujours manquantes.
Les systèmes d'exploitation individuels peuvent s'opposer dans ou hors de certaines fonctionnalités comme vous le souhaitez; Par exemple, les API POSIX comme pthread sont déclenchées derrière l'option POSIX 'Option', les API Linux comme epoll sont déclenchées derrière l'option Linux, etc.
Serveur de discorde officiel: https://discord.gg/7wb6ur3
Package AUR (fournit mlibc-gcc ): https://aur.archlinux.org/packages/mlibc
| Annuaire | But |
|---|---|
options/ | (Plus ou moins) en-têtes et code indépendants du système d'exploitation.options/ sont divisées en sous-répertoires qui peuvent être activés ou désactivés par les ports. |
sysdeps/ | En-têtes et code spécifiques au système d'exploitation.sysdeps/ est divisé en sous-répertoires per-ports. Une de ces sous-répertoires est activée exactement dans chaque version. |
abis/ | En-têtes d'interface spécifiques au système d'exploitation ("en-têtes ABI"). Ceux-ci contiennent les constantes et les structures de l'interface OS. Par exemple, les valeurs numériques de SEEK_SET ou O_CREAT vivent ici, ainsi que des structures comme struct stat . Les en-têtes ABI ne sont autorisés à contenir que des constantes, des structures et des syndicats, mais aucune déclaration de fonction ni logique.abis/ est divisé en sous-répertoires Per-OS, mais cette division est à des fins organisationnelles uniquement. Les ports peuvent toujours mélanger les en-têtes de différents abis/ sous-répertoires. |
Les ports vers les nouvelles OS sont les bienvenus. Pour porter MLIBC à un autre système d'exploitation, les modifications suivantes doivent être apportées:
sysdeps/ sous-résectory sysdeps/some-new-os/ et un meson.build pour le compiler. Intégrez sysdeps/some-new-os/meson.build dans le Toplevel meson.build .abis/some-new-os/ . Ajoutez des liens systématiques dans sysdeps/some-new-os/include/abi-bits à vos en-têtes ABI. Regardez les ports existants pour déterminer les en-têtes ABI requis pour les options activées par sysdeps/some-new-os/meson.build .sysdeps/some-new-os/ , Ajoutez du code pour implémenter (un sous-ensemble de) les fonctions d' options/internal/include/mlibc/internal-sysdeps.hpp . Le sous-ensemble dont vous avez besoin dépend des options que sysdeps/some-new-os/meson.build permet. Nous recommandons que les nouveaux ports ne construisent pas à partir de master car nous apportons occasionnellement des modifications internes qui provoquent la rupture des systèmes hors arbre. Au lieu de cela, nous vous recommandons d'épingler une version (ou un engagement) spécifique, ou pour en amont vos modifications à ce référentiel afin que nous puissions les construire sur notre CI et donc toute rupture sera fixée par nous.
Les options de méson personnalisées suivantes sont acceptées, en plus des options intégrées. Les options ci-dessous sont des booléens qui par défaut sont faux (voir meson_options.txt ).
headers_only : Installez uniquement les en-têtes; Ne construisez pas libc.so ou ld.sono_headers : N'installez pas en-têtes; Construisez uniquement libc.so et ld.sobuild_tests : Build the Test Suite (voir ci-dessous).x_option : Activer le composant x de la fonctionnalité MLIBC. Voir meson_options.txt pour une liste complète des valeurs possibles pour x . Cela peut être utilisé pour désactiver les extensions POSIX et GLIBC.linux_kernel_headers : permet de diriger MLIBC à des en-têtes Linux installés. Ceux-ci peuvent être obtenus facilement, placés dans un répertoire et cette option définie sur le chemin correspondant. Ceci est requis si l'option Linux est activée, c'est-à-dire lorsque l'option Linux n'est pas désactivée.debug_allocator : Remplacez l'allocateur normal par un allocateur de débogage (voir mlibc/options/internal/generic/allocator.cpp pour les détails de l'implémentation).use_freestnd_hdrs : utilisez freestnd-c {, xx} -hdrs au lieu de chercher des en-têtes de compilateur. Utile s'il n'utilise pas un compilateur avec le triple cible correct. Le type de bibliothèque à construire (statique, partagé ou les deux) est contrôlé par l'option default_library de Meson. Passing -Ddefault_library=static désactive efficacement le lieur dynamique.
Nous soutenons également la construction avec -Db_sanitize=undefined pour utiliser UBSAN à l'intérieur de MLIBC. Notez que cela ne permet pas à Ubsan pour les applications externes qui relient libc.so .
Pour formater votre code avant de soumettre un PR, vous devez installer pre-commit . Ensuite, effectuez pre-commit install pour installer le crochet GIT qui s'exécute chaque fois que vous vous engagez. Alternativement, vous pouvez effectuer pre-commit run -a pour formater manuellement tous les fichiers.
La suite de test mlibc peut être exécutée sous un hôte Linux. Pour ce faire, installez d'abord un ensemble d'en-têtes de noyau (comme décrit ici), puis exécutez à partir de la racine du projet:
meson setup -Dbuild_tests=true -Dlinux_kernel_headers=/path/to/kernel/headers/include build
Cela créera un répertoire build . Ensuite, cd build et exécutez les tests (montrant la sortie) avec:
meson test -v