Files
2026-06-16 18:35:34 +03:00

82 lines
3.0 KiB
Nix

{
fetchurl,
lib,
gnutar,
xz,
bash-build,
gnused,
targetPlatform,
libc,
libgcc,
libstdcxx,
gcc-unwrapped,
binutils,
bash,
}:
let
pname = "gcc-wrapper";
extraFlags = "-static-libgcc ";
# only supports musl for now
dynamicLinkerGlob = "${libc}/lib/libc.so";
in
bash-build.runCommand "${pname}-${gcc-unwrapped.version}"
{
inherit pname;
version = gcc-unwrapped.version;
meta = gcc-unwrapped.meta;
nativeBuildInputs = [ gnused ];
passthru.unwrapped = gcc-unwrapped;
}
''
if [[ -z '${dynamicLinkerGlob}' ]]; then
echo "Don't know the name of the dynamic linker for platform '${targetPlatform.config}', so guessing instead."
dynamicLinker="${libc}/lib/ld*.so.?"
else
dynamicLinker='${dynamicLinkerGlob}'
fi
dynamicLinker=($dynamicLinker)
case ''${#dynamicLinker[@]} in
0) echo "No dynamic linker found for platform '${targetPlatform.config}'.";;
1) echo "Using dynamic linker: '$dynamicLinker'";;
*) echo "Multiple dynamic linkers found for platform '${targetPlatform.config}'.";;
esac
mkdir -p "$out/bin"
for orig in ${gcc-unwrapped}/bin/*gcc ${gcc-unwrapped}/bin/*gcc-${gcc-unwrapped.version}; do
sed \
-e 's,@bash@,${lib.getExe bash},' \
-e "s,@gcc@,$orig," \
-e "s,@origname@,$(basename "$orig")," \
-e "s,@origdir@,${gcc-unwrapped}/libexec/gcc," \
-e "s,@dynlinker@,$dynamicLinker," \
-e 's,@libgcc@,${libgcc}/lib/gcc/${targetPlatform.config}/${libgcc.version},' \
-e 's,@libc@,${libc}/lib,' \
-e 's,@gccinc@,${gcc-unwrapped}/lib/gcc/${targetPlatform.config}/${libgcc.version}/include,' \
-e 's,@binutils@,${binutils}/bin,' \
-e 's,@extraflags@,${extraFlags},' \
'${./wrapper.sh}' > "$out/bin/$(basename "$orig")"
chmod +x "$out/bin/$(basename "$orig")"
done
for orig in ${gcc-unwrapped}/bin/*++; do
sed \
-e 's,@bash@,${lib.getExe bash},' \
-e "s,@gcc@,$orig," \
-e "s,@origname@,$(basename "$orig")," \
-e "s,@origdir@,${gcc-unwrapped}/libexec/gcc," \
-e "s,@dynlinker@,$dynamicLinker," \
-e 's,@libgcc@,${libgcc}/lib/gcc/${targetPlatform.config}/${libgcc.version},' \
-e 's,@libc@,${libc}/lib,' \
-e 's,@libstdcxx@,${libstdcxx}/lib,' \
-e 's,@libstdcxxinc@,${libstdcxx}/include/c++/${libstdcxx.version},' \
-e 's,@libstdcxxarchinc@,${libstdcxx}/include/c++/${libstdcxx.version}/${targetPlatform.config},' \
-e 's,@gccinc@,${gcc-unwrapped}/lib/gcc/${targetPlatform.config}/${libgcc.version}/include,' \
-e 's,@binutils@,${binutils}/bin,' \
-e 's,@extraflags@,${extraFlags},' \
'${./wrappercxx.sh}' > "$out/bin/$(basename "$orig")"
chmod +x "$out/bin/$(basename "$orig")"
done
for orig in ${gcc-unwrapped}/bin/*cpp ${gcc-unwrapped}/bin/*-ar ${gcc-unwrapped}/bin/*-nm ${gcc-unwrapped}/bin/*-ranlib; do
ln -s "$orig" "$out/bin/$(basename "$orig")"
done
''