O MLIBC é uma biblioteca padrão C totalmente em destaque, projetada com a portabilidade em mente.
Apoiamos uma série de arquiteturas (x86-64, AARCH64, RISC-V, IA-32, M68K) e fornecemos uma camada limpa de abstração syscall para novas portas de sistema operacional para se conectar.
Ao contrário de outras bibliotecas padrão C portáteis, como o Newlib, pretendemos paridade com o GLIBC/MUSL, ou seja, o suporte completo do PTHread e as extensões GNU.
O MLIBC é capaz o suficiente para executar uma variedade de software, incluindo Xorg, vários compositores Wayland, Mesa e navegadores da Web como o WebkitGTK - embora alguns recursos ainda estejam ausentes.
Os sistemas operacionais individuais podem optar por dentro ou fora de certos recursos, conforme desejado; Por exemplo, APIs POSIX como pthread estão fechadas por trás do POSIX 'Option', as APIs Linux como epoll são fechadas por trás da opção Linux, etc.
Servidor Oficial Discord: https://discord.gg/7wb6ur3
Pacote AUR (fornece mlibc-gcc ): https://aur.archlinex.org/packages/mlibc
| Diretório | Propósito |
|---|---|
options/ | (Mais ou menos) cabeçalhos e código independentes do OS.options/ é dividido em subdiretos que podem ser ativados ou desativados por portas. |
sysdeps/ | Cabeçalhos e código específicos do SO.sysdeps/ é dividido em subdiretos por porta. Exatamente um desses subdiretos está ativado em cada compilação. |
abis/ | Cabeçalhos de interface específicos do OS ("cabeçalhos ABI"). Eles contêm as constantes e estruturas da interface do sistema operacional. Por exemplo, os valores numéricos de SEEK_SET ou O_CREAT vivem aqui, bem como estruturas como struct stat . Os cabeçalhos da ABI só podem conter constantes, estruturas e sindicatos, mas nenhuma declaração de função ou lógica.abis/ é dividido em subdiretos PER-OS, mas essa divisão é apenas para fins organizacionais. As portas ainda podem misturar cabeçalhos de diferentes abis/ subdiretos. |
Portos para novos sistemas operacionais são bem -vindos. Para portar MLIBC para outro sistema operacional, as seguintes mudanças precisam ser feitas:
sysdeps/ subdiretório sysdeps/some-new-os/ e um meson.build para compilá-lo. Integrar sysdeps/some-new-os/meson.build no toplevel meson.build .abis/some-new-os/ . Adicione os symblinks em sysdeps/some-new-os/include/abi-bits aos seus cabeçalhos da ABI. Veja as portas existentes para descobrir os cabeçalhos da ABI necessários para as opções ativadas pelo sysdeps/some-new-os/meson.build .sysdeps/some-new-os/ , adicione código para implementar (um subconjunto de) as funções de options/internal/include/mlibc/internal-sysdeps.hpp . Qual subconjunto você precisa depende das opções que sysdeps/some-new-os/meson.build permite. Recomendamos que novas portas não construam a partir do master , pois ocasionalmente fazemos alterações internas que fazem com que os sistemas fora de árvore quebrem. Em vez disso, recomendamos que você prenda uma liberação específica (ou confirme), ou a montar suas alterações neste repositório para que possamos construí-las em nosso CI e, portanto, qualquer quebra será corrigido por nós na árvore.
As seguintes opções personalizadas de meson são aceitas, além das opções internas. As opções abaixo são booleanos que padrão para false (consulte meson_options.txt ).
headers_only : instale apenas cabeçalhos; Não construa libc.so ou ld.sono_headers : Não instale cabeçalhos; Construa apenas libc.so e ld.sobuild_tests : construa o conjunto de testes (veja abaixo).x_option : Ativar x componente da funcionalidade MLIBC. Consulte meson_options.txt para obter uma lista completa de valores possíveis para x . Isso pode ser usado para desativar as extensões POSIX e GLIBC.linux_kernel_headers : permite direcionar os cabeçalhos do MLIBC para o Linux instalado. Estes podem ser obtidos facilmente, colocados em um diretório e esta opção definida no caminho correspondente. Isso é necessário se a opção Linux estiver ativada, ou seja, quando a opção Linux não estiver desativada.debug_allocator : substitua o alocador normal por um alocador de depuração (consulte mlibc/options/internal/generic/allocator.cpp para obter detalhes da implementação).use_freestnd_hdrs : use freestnd-c {, xx} -hdrs em vez de procurar cabeçalhos do compilador. Útil se não estiver usando um compilador com o triplo de destino correto. O tipo de biblioteca a ser construído (estático, compartilhado ou ambos) é controlado pela opção default_library de Meson. Passagem -Ddefault_library=static efetivamente desativa o ligante dinâmico.
Também apoiamos a construção com -Db_sanitize=undefined para usar o UBSAN dentro do MLIBC. Observe que isso não habilita o UBSAN para aplicativos externos que se conectam ao libc.so , mas pode ser útil durante o desenvolvimento para detectar erros internos (por exemplo, ao adicionar novos sistemas).
Para formatar seu código antes de enviar um PR, você deve instalar pre-commit . Em seguida, faça pre-commit install para instalar o gancho git que é executado sempre que você se compromete. Como alternativa, você pode fazer pre-commit run -a para formatar manualmente todos os arquivos.
O conjunto de testes mlibc pode ser executado sob um host Linux. Para fazer isso, primeiro instale um conjunto de cabeçalhos do kernel (como descrito aqui) e depois execute a partir da raiz do projeto:
meson setup -Dbuild_tests=true -Dlinux_kernel_headers=/path/to/kernel/headers/include build
Isso criará um diretório build . Em seguida, cd build e execute os testes (mostrando saída) com:
meson test -v