Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
175 changes: 175 additions & 0 deletions pkgs/by-name/mu/musl/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
{
lib,
callPackage,
fetchurl,
linuxHeaders,
stdenv,
# Boolean flags
hasLinuxHeaders ? true,
useBSDCompatHeaders ? true,
}:
let
sources = callPackage ./sources.nix { };
arch =
if stdenv.hostPlatform.isx86_64 then
"x86_64"
else if stdenv.hostPlatform.isx86_32 then
"i386"
else null;
in
stdenv.mkDerivation (finalAttrs: {
inherit (sources.musl) pname version src;

env = {
NIX_DONT_SET_RPATH = true;
CFLAGS = toString ([
"-fstack-protector-strong"
] ++ lib.optionals stdenv.hostPlatform.isPower [
"-mlong-double-64"
]);
};

configureFlags = [
(lib.enableFeature true "shared")
(lib.enableFeature true "static")
(lib.enableFeature true "debug")
(lib.enableFeatureAs true "wrapper" "all")
"--syslibdir=${placeholder "out"}/lib"
];

outputs = [
"out"
"bin"
"dev"
];

outputLib = "out";

# Disable auto-adding stack protector flags, so musl can selectively disable
# as needed
hardeningDisable = [ "stackprotector" ];

strictDeps = true;

enableParallelBuilding = true;

dontDisableStatic = true;

dontAddStaticConfigureFlags = true;

separateDebugInfo = true;

# Let's be friendlier to debuggers/perf tools
# Neither force them on, nor force them off
postPatch = ''
substituteInPlace configure \
--replace-fail -fno-unwind-tables "" \
--replace-fail -fno-asynchronous-unwind-tables ""
'';

# the `-x c` flag is required here because the file extension confuses gcc,
# that will regard the file as a linker script.
preBuild = lib.optionalString (stdenv.targetPlatform.libc == "musl" && stdenv.targetPlatform.isx86_32) ''
$CC -x c -c ${sources.stack_chk_fail_local_c.src} -o __stack_chk_fail_local.o
$AR r libssp_nonshared.a __stack_chk_fail_local.o"
'';

postInstall = lib.concatStringsSep "\n" [
# Not sure why, but link in all but scsi directory as that's what
# uclibc/glibc do. Apparently glibc provides scsi itself?
(lib.optionalString hasLinuxHeaders
''
pushd ''${!outputDev}/include
ln -s $(ls -d ${linuxHeaders}/include/* | grep -v "scsi$") .
popd
'')

(lib.optionalString (stdenv.targetPlatform.libc == "musl" && stdenv.targetPlatform.isx86_32)
''install -D libssp_nonshared.a ''${!outputLib}/lib/libssp_nonshared.a'')

# Create 'ldd' symlink, builtin
''ln -s ''${!outputLib}/lib/libc.so ''${!outputBin}/bin/ldd''

# (impure) cc wrapper around musl for interactive usuage
''
for i in musl-gcc musl-clang ld.musl-clang; do
moveToOutput bin/$i ''${!outputDev}
done
moveToOutput lib/musl-gcc.specs ''${!outputDev}
substituteInPlace ''${!outputDev}/bin/musl-gcc \
--replace-fail ''${!outputLib}/lib/musl-gcc.specs ''${!outputDev}/lib/musl-gcc.specs
''

# provide 'iconv' utility, using just-built headers, libc/ldso
''
$CC ${sources.iconv_c.src} -o ''${!outputBin}/bin/iconv \
-I''${!outputDev}/include \
-L''${!outputLib}/lib -Wl,-rpath=''${!outputLib}/lib \
-lc \
-B ''${!outputLib}/lib \
-Wl,-dynamic-linker=$(ls ''${!outputLib}/lib/ld-*)
''
# Create 'libc.musl-$arch' symlink
(lib.optionalString (arch != null)
''ln -rs ''${!outputLib}/lib/libc.so ''${!outputLib}/lib/libc.musl-${arch}.so.1'')
(lib.optionalString useBSDCompatHeaders
''
install -D ${sources.musl-compat.src}/src/{cdefs,queue,tree}.h ''${!outputDev}/include/sys/
'')
];

passthru = {
inherit hasLinuxHeaders linuxHeaders;
};

meta = {
homepage = "https://musl.libc.org/";
description = "Efficient, small libc implementation";
longDescription = ''
musl, pronounced /mŭs′əl/ (like the word "mussel" or "muscle"), is a
"libc", an implementation of the standard library functionality described
in the ISO C and POSIX standards, plus common extensions, built on top of
the Linux system calls API. While the kernel governs access to hardware,
memory, filesystems, and the privileges for accessing these resources,
libc is responsible for:

- providing C bindings for the OS interfaces;
- constructing higher-level buffered stdio, memory allocation management,
thread creation and synchronization operations, shared library loading,
and so on using the lower-level interfaces the kernel provides;
- implementing the pure library routines of the C language like strstr,
snprintf, strtol, exp, sqrt, etc.

musl has history and development roots going back to 2005, but was named
and first released as musl in 2011, as an alternative to glibc and uClibc
with an ambitious goal to meet the needs of both tiny embedded systems and
typical desktops and servers.
'';
changelog = "https://git.musl-libc.org/cgit/musl/tree/WHATSNEW?h=v${finalAttrs.version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [
AndersonTorres
thoughtpolice
];
platforms = [
"aarch64-linux"
"armv5tel-linux"
"armv6l-linux"
"armv7a-linux"
"armv7l-linux"
"i686-linux"
"m68k-linux"
"microblaze-linux"
"microblazeel-linux"
"mips-linux"
"mips64-linux"
"mips64el-linux"
"mipsel-linux"
"powerpc64-linux"
"powerpc64le-linux"
"riscv64-linux"
"s390x-linux"
"x86_64-linux"
];
};
})
59 changes: 59 additions & 0 deletions pkgs/by-name/mu/musl/sources.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
lib,
fetchurl,
fetchzip,
}:

{
# A new source for compat headers: Projeto Pindorama!
# They did a nice work of seeking the history of them, so let's use it
# Let's use fetchzip here since fetchFromGitHub is failing in CI
musl-compat = {
pname = "musl-compat";
version = "0-unstable-2023-06-01";

src = fetchzip {
url = "https://github.com/Projeto-Pindorama/musl-compat/archive/refs/tags/20230601.tar.gz";
hash = "sha256-hwlHOuVSX+54q47fbzmQFY1TPFn7Bp7S5y/vKa6cMHA=";
};
};

# From Alpine
stack_chk_fail_local_c = {
pname = "stack-chk-fail-local-c";
version = "0-unstable-2013-09-24";

src = fetchurl {
name = "__stack_chk_fail_local.c";
url = "https://git.alpinelinux.org/aports/plain/main/musl/__stack_chk_fail_local.c?id=9afbe3cbbf4c30ff23c733218c3c03d7e8c6461d";
hash = "sha256-KZp9daCd4+LhHn+0rMMYLkoU6GgJPS8wk4/Om/z/E9o=";
};
};

# iconv tool, implemented by musl author.
# Original: http://git.etalabs.net/cgit/noxcuse/plain/src/iconv.c?id=02d288d89683e99fd18fe9f54d4e731a6c474a4f
# We use the version from Alpine which fixes error messages.
iconv_c = {
pname = "iconv-c";
version = "0-unstable-2014-06-06";

src = fetchurl {
name = "iconv.c";
url = "https://git.alpinelinux.org/aports/plain/main/musl/iconv.c?id=a3d97e95f766c9c378194ee49361b375f093b26f";
hash = "sha256-95opMKLluwYkMhWJ7fi4idHptgPgHmt64hRhZgWz/dc=";
};
};

musl = let
self = {
pname = "musl";
version = "1.2.5";

src = fetchurl {
url = "https://musl.libc.org/releases/musl-${self.version}.tar.gz";
hash = "sha256-qaEYu+hNh2TaDqDSizqz+uhHf8fkCF2QECuFlvx8deQ=";
};
};
in
self;
}
161 changes: 0 additions & 161 deletions pkgs/os-specific/linux/musl/default.nix

This file was deleted.

Loading