MLIBCは、携帯性を念頭に置いて設計された完全に機能するC標準ライブラリです。
多くのアーキテクチャ(X86-64、AARCH64、RISC-V、IA-32、M68K)をサポートし、新しいオペレーティングシステムポートに接続するためのクリーンなSyscall抽象化レイヤーを提供します。
NewLibのような他のポータブルC標準ライブラリとは異なり、GLIBC/MUSL、つまり完全なPTHREADサポート、GNU拡張機能の特徴パリティを目指しています。
MLIBCは、XORG、いくつかのWayland Compositors、MESA、WebKitgtkなどのWebブラウザーなど、さまざまなソフトウェアを実行するのに十分な能力がありますが、一部の機能はまだありません。
個々のオペレーティングシステムは、必要に応じて特定の機能を選択できます。たとえば、 pthreadのようなPOSIX APIは、POSIXオプションの背後にあるゲートです。Epoll epollようなLinux APIはLinuxオプションの背後にあるなどです。
公式Discord Server: https://discord.gg/7wb6ur3
AURパッケージ( mlibc-gccを提供):https://aur.archlinux.org/packages/mlibc
| ディレクトリ | 目的 |
|---|---|
options/ | (多かれ少なかれ)OSに依存しないヘッダーとコード。options/は、ポートで有効または無効にできるサブディレクトリに分割されます。 |
sysdeps/ | OS固有のヘッダーとコード。sysdeps/は、ポートごとのサブディレクトリに分割されます。これらのサブディレクトリの1つが各ビルドで有効になっています。 |
abis/ | OS固有のインターフェイスヘッダー(「ABIヘッダー」)。それらには、OSインターフェイスの定数と構造が含まれています。たとえば、 SEEK_SETまたはO_CREAT struct stat数値値は、ここに住んでいます。 ABIヘッダーは、定数、構造体、および組合のみを含めることができますが、機能宣言やロジックはありません。abis/は、Per-OSサブディレクトリに分かれていますが、この部門は組織の目的のみを目的としています。ポートは、さまざまなabis/サブディレクトリのヘッダーを混ぜることができます。 |
新しいOSへのポートは大歓迎です。 MLIBCを別のOSに移植するには、次の変更を行う必要があります。
sysdeps/ subdirectory sysdeps/some-new-os/ and meson.buildを追加してコンパイルします。 sysdeps/some-new-os/meson.buildをトップレベルのmeson.buildに統合します。abis/some-new-os/でABIヘッダーを作成します。 sysdeps/some-new-os/include/abi-bitsにSymlinksをABIヘッダーに追加します。既存のポートを見て、 sysdeps/some-new-os/meson.buildで有効なオプションに必要なABIヘッダーを把握します。sysdeps/some-new-os/で、 options/internal/include/mlibc/internal-sysdeps.hppから関数を実装するためにコードを追加します(のサブセット)。必要なサブセットはsysdeps/some-new-os/meson.buildが有効にするオプションによって異なります。私たちは、新しいポートがmasterから構築されないことをお勧めします。代わりに、特定のリリース(またはコミット)をピン留めするか、このリポジトリの変更を上流にして、CIにそれらを構築できるようにすることをお勧めします。
組み込みオプションに加えて、次のカスタムメソンオプションが受け入れられます。以下のオプションは、デフォルトでfalseになります( meson_options.txtを参照)。
headers_only :ヘッダーのみをインストールします。 libc.soまたはld.soを構築しないでください。no_headers :ヘッダーをインストールしないでください。 libc.soとld.soのみを構築します。build_tests :テストスイートを構築します(以下を参照)。x_option :MLIBC機能のxコンポーネントを有効にします。 xの可能な値の完全なリストについては、 meson_options.txt参照してください。これは、POSIXおよびGLIBC拡張機能を無効にするために使用できます。linux_kernel_headers :MLIBCにLinuxヘッダーをインストールするように指示することができます。これらは簡単に取得でき、ディレクトリに配置され、このオプションは対応するパスに設定されます。 Linuxオプションが有効になっている場合、つまりLinuxオプションが無効になっていない場合にこれが必要です。debug_allocator :通常のアロケーターをデバッグアロケーターに置き換えます(実装の詳細については、 mlibc/options/internal/generic/allocator.cppを参照)。use_freestnd_hdrs :コンパイラヘッダーを探す代わりに、freestnd-c {、xx} -hdrsを使用します。正しいターゲットトリプルを持つコンパイラを使用しない場合に便利です。構築されるライブラリのタイプ(静的、共有、またはその両方)は、Mesonのdefault_libraryオプションによって制御されます。渡される-Ddefault_library=static動的リンカーを効果的に無効にします。
また、 -Db_sanitize=undefined建物をサポートして、mlibc内でウブサンを使用します。これにより、 libc.soに対してリンクする外部アプリケーションのUBSANが有効になるわけではありませんが、開発中に内部バグを検出するのに役立つ可能性があります(たとえば、新しいsysDepsを追加する場合)。
PRを送信する前にコードをフォーマットするには、 pre-commitをインストールする必要があります。次に、 pre-commit installます。または、すべてのファイルを手動でフォーマットするために、 pre-commit run -a実行できます。
mlibcテストスイートは、Linuxホストの下で実行できます。これを行うには、最初にカーネルヘッダーのセット(ここで説明しているように)をインストールし、次にプロジェクトルートから実行します。
meson setup -Dbuild_tests=true -Dlinux_kernel_headers=/path/to/kernel/headers/include build
これにより、 buildディレクトリが作成されます。次に、テストcd buildて実行します(出力を表示):
meson test -v