smol-gilbraltar/gen_toolchain_tool.sh
2024-12-23 23:44:47 +01:00

133 lines
2.7 KiB
Bash
Executable file

#!/bin/sh
# Generate a wrapper for Gilbraltar (G)CC, ld, objcopy and any other binutil
# Expected argument: the tool to generate
# Expected environment variables:
# ARCH: the target architecture (x86_64 or aarch64)
# TOOL_CFLAGS and TOOL_LDFLAGS: extra flags
# GILBRALTAR_TOOLCHAIN: the target for the wrapped Gilbraltar toolchain
# OTHERTOOLPREFIX: the prefix for tools not in the Gilbraltar toolchain
# TARGET_X: overrides the command for binutil X
gen_cc() {
# Note that -nostdlib is not required, as it is injected by Solo5' cc, ld
CFLAGS="$TOOL_CFLAGS"
LDFLAGS="$TOOL_LDFLAGS"
EXTRALIBS=""
case "$ARCH" in
aarch64)
EXTRALIBS="-lgcc"
;;
esac
# Add the -Wno-unused-command-line-argument option for clang, as we always
# give it compiling options, even if it will be only linking
# Reuse the test from Solo5 to detect clang
if "$SOLO5_TOOLCHAIN-cc" -dM -E - </dev/null | grep -Eq '^#define __clang__ 1$'
then CFLAGS="-Wno-unused-command-line-argument $CFLAGS"
fi
cat << EOF
#!/bin/sh
# Just like the Solo5 cc, we assume that we are linking, unless we find an
# argument suggesting we are compiling but we call Solo5' cc regardless
compiling=
for arg in "\$@"; do
case "\$arg" in
-[cSE])
compiling="\$arg"
break
;;
esac
done
set -- \\
$CFLAGS \\
-include _solo5/overrides.h \\
-D__BSD_VISIBLE=0 \\
-D__XSI_VISIBLE=0 \\
"\$@"
if [ -z "\$compiling" ]; then
# linking options
set -- \\
"\$@" \\
$LDFLAGS \\
-Wl,--start-group \\
-lnolibc \\
-lopenlibm \\
$EXTRALIBS \\
-Wl,--end-group
fi
[ -n "\${__V}" ] && set -x
exec "$SOLO5_TOOLCHAIN-cc" "\$@"
EOF
}
gen_tool() {
TOOL="$1"
case "$TOOL" in
ar)
TARGET_TOOL="$TARGET_AR"
;;
as)
TARGET_TOOL="$TARGET_AS"
;;
ld)
TARGET_TOOL="$TARGET_LD"
;;
nm)
TARGET_TOOL="$TARGET_NM"
;;
objcopy)
TARGET_TOOL="$TARGET_OBJCOPY"
;;
objdump)
TARGET_TOOL="$TARGET_OBJDUMP"
;;
ranlib)
TARGET_TOOL="$TARGET_RANLIB"
;;
readelf)
TARGET_TOOL="$TARGET_READELF"
;;
strip)
TARGET_TOOL="$TARGET_STRIP"
;;
esac
if test "$TARGET_TOOL" ; then
TOOL="$TARGET_TOOL"
elif command -v -- "$SOLO5_TOOLCHAIN-$TOOL" > /dev/null; then
TOOL="$SOLO5_TOOLCHAIN-$TOOL"
else
case "$TOOL" in
as)
TOOL="$SOLO5_TOOLCHAIN-cc -c"
;;
*)
if command -v -- "$OTHERTOOLPREFIX$TOOL" > /dev/null; then
TOOL="$OTHERTOOLPREFIX$TOOL"
fi
;;
esac
fi
cat << EOF
#!/bin/sh
exec $TOOL "\$@"
EOF
}
case "$1" in
cc|gcc)
gen_cc
;;
*)
gen_tool "$1"
;;
esac