mirror of
https://git.planet-casio.com/Lephenixnoir/sh-elf-gcc.git
synced 2024-12-26 19:43:38 +01:00
164 lines
5.1 KiB
Bash
Executable file
164 lines
5.1 KiB
Bash
Executable file
#! /usr/bin/env bash
|
|
|
|
source util.sh
|
|
|
|
VERSION=$1
|
|
PREFIX="$2"
|
|
URL="https://ftp.gnu.org/gnu/gcc/gcc-$VERSION/gcc-$VERSION.tar.xz"
|
|
ARCHIVE=$(basename "$URL")
|
|
|
|
# Final location of gcc in the sysroot
|
|
SYSROOT_GCC="$SYSROOT/bin/sh-elf-gcc"
|
|
# Version string of any existing sh-elf-gcc in the sysroot
|
|
SYSROOT_GCC_VERSION=
|
|
# "1" if libstdc++-v3 is already in the install folder
|
|
SYSROOT_HAS_LIBSTDCXX=
|
|
# "1" if the conditions for building libstdc++-v3 are met
|
|
CAN_BUILD_LIBSTDCXX=
|
|
|
|
#---
|
|
# Determine what parts of GCC are already installed and decide whether to build
|
|
#---
|
|
|
|
if [[ -f "$SYSROOT_GCC" ]]; then
|
|
SYSROOT_GCC_VERSION=$("$SYSROOT_GCC" --version | head -n 1 | grep -Eo '[0-9.]+$')
|
|
|
|
# TODO: Once we start using the full C++ library, check for libstdc++.a instead
|
|
LIBSTDCXX_FILE=$("$SYSROOT_GCC" -print-file-name=libsupc++.a)
|
|
LIBC_FILE=$("$SYSROOT_GCC" -print-file-name=libc.a)
|
|
|
|
if [[ "$LIBSTDCXX_FILE" != "libsupc++.a" ]]; then
|
|
SYSROOT_HAS_LIBSTDCXX=1
|
|
echo "$TAG libsupc++.a found, libstdc++-v3 is already built"
|
|
fi
|
|
|
|
if [[ "$LIBC_FILE" != "libc.a" ]]; then
|
|
CAN_BUILD_LIBSTDCXX=1
|
|
[[ "$SYSROOT_HAS_LIBSTDCXX" != "1" ]] && \
|
|
echo "$TAG libc.a found, we can build libstdc++-v3"
|
|
else
|
|
echo "$TAG libc.a not found, we cannot build libstdc++-v3"
|
|
fi
|
|
else
|
|
echo "$TAG After installing the libc, rebuild here for libstdc++-v3"
|
|
fi
|
|
|
|
if [[ "$SYSROOT_GCC_VERSION" = "$VERSION" ]]; then
|
|
if [[ "$SYSROOT_HAS_LIBSTDCXX" = "1" ]]; then
|
|
echo "$TAG GCC $VERSION with libstdc++-v3 already there; skipping rebuild"
|
|
mkdir -p build
|
|
touch build/giteapc-skip-rebuild.txt
|
|
exit 0
|
|
elif [[ "$CAN_BUILD_LIBSTDCXX" != "1" ]]; then
|
|
echo "$TAG Cannot build libstdc++-v3 yet; skipping rebuild until next time"
|
|
mkdir -p build
|
|
touch build/giteapc-skip-rebuild.txt
|
|
exit 0
|
|
else
|
|
echo "$TAG We will proceed with the second stage and build libstdc++-v3"
|
|
fi
|
|
fi
|
|
|
|
if [[ ! -z "$ACCEPT_ANY" && ! -z "$SYSROOT_GCC_VERSION" ]]; then
|
|
echo "$TAG GCC $VERSION already available; skipping rebuild as per ACCEPT_ANY"
|
|
mkdir -p build
|
|
touch build/giteapc-skip-rebuild.txt
|
|
exit 0
|
|
fi
|
|
|
|
[[ -e "build/giteapc-skip-rebuild.txt" ]] && rm build/giteapc-skip-rebuild.txt
|
|
|
|
#---
|
|
# Get sources
|
|
#---
|
|
|
|
if [[ -f "$ARCHIVE" ]]; then
|
|
echo "$TAG Found $ARCHIVE, skipping download"
|
|
else
|
|
echo "$TAG Downloading $URL..."
|
|
if command -v curl >/dev/null 2>&1; then
|
|
curl $URL -o $ARCHIVE
|
|
elif command -v wget >/dev/null 2>&1; then
|
|
wget -q --show-progress $URL -O $ARCHIVE
|
|
else
|
|
echo "$TAG error: no curl or wget; install one or download archive yourself" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Extract archive (OpenBSD-compliant version)
|
|
if [[ -d "${ARCHIVE%.tar.*}" ]]; then
|
|
echo "$TAG Found ${ARCHIVE%.tar.*}, skipping extraction"
|
|
else
|
|
echo "$TAG Extracting $ARCHIVE..."
|
|
unxz -c < $ARCHIVE | tar -xf -
|
|
|
|
if [[ "$VERSION" = "11.1.0" ]]; then
|
|
echo "$TAG Applying patches/gcc-11.1.0-libstdc++-v3-skip-dlopen.patch..."
|
|
patch -u -N -p0 < patches/gcc-11.1.0-libstdc++-v3-skip-dlopen.patch
|
|
elif [[ "$VERSION" = "14.1.0" ]]; then
|
|
echo "$TAG Applying patches/gcc-14.1.0-libgcc-use-soft-fp.patch..."
|
|
patch -u -N -p0 < patches/gcc-14.1.0-libgcc-use-soft-fp.patch
|
|
fi
|
|
fi
|
|
|
|
# Download prerequisites
|
|
cd gcc-$VERSION
|
|
./contrib/download_prerequisites
|
|
cd ..
|
|
|
|
#---
|
|
# Configure
|
|
#---
|
|
|
|
# We install in the sysroot and then symlink to the PREFIX folder in the path.
|
|
|
|
# Symlink as, ld, ar and ranlib, which gcc will not find by itself (we renamed
|
|
# them from sh3eb-elf-* to sh-elf-* with --program-prefix).
|
|
mkdir -p "$SYSROOT/sh3eb-elf/bin"
|
|
for TOOL in as ld ar ranlib; do
|
|
if ! command -v sh-elf-$TOOL >/dev/null 2>&1; then
|
|
echo "error: sh-elf-$TOOL not found in PATH!" >&2
|
|
exit 1
|
|
fi
|
|
ln -sf $(command -v sh-elf-$TOOL) "$SYSROOT/sh3eb-elf/bin/$TOOL"
|
|
done
|
|
|
|
# OpenBSD apparently installs these in /usr/local
|
|
if [[ $(uname) == "OpenBSD" ]]; then
|
|
EXTRA_ARGS="--with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local"
|
|
else
|
|
EXTRA_ARGS=
|
|
fi
|
|
|
|
# In libstdc++-v3 mode, don't reconfigure to avoid recompiling
|
|
if [[ "$SYSROOT_GCC_VERSION" = "$VERSION" && "$SYSROOT_HAS_LIBSTDCXX" != "1" && "$CAN_BUILD_LIBSTDCXX" = "1" ]]; then
|
|
touch build/giteapc-build-libstdcxx.txt
|
|
elif [[ "$SYSROOT_GCC_VERSION" != "$VERSION" ]]; then
|
|
echo "$TAG Configuring gcc..."
|
|
[[ -d build ]] && rm -rf build
|
|
mkdir build
|
|
|
|
cd build
|
|
run_quietly giteapc-configure.log \
|
|
../gcc-$VERSION/configure \
|
|
--prefix="$SYSROOT" \
|
|
--target="sh3eb-elf" \
|
|
--with-multilib-list="m3,m4-nofpu" \
|
|
--enable-languages="c,c++" \
|
|
--without-headers \
|
|
--program-prefix="sh-elf-" \
|
|
--enable-libssp \
|
|
--enable-lto \
|
|
--enable-clocale="generic" \
|
|
--enable-libstdcxx-allocator \
|
|
--disable-threads \
|
|
--disable-libstdcxx-verbose \
|
|
--enable-cxx-flags="-fno-exceptions" \
|
|
$EXTRA_ARGS
|
|
cd ..
|
|
else
|
|
echo "$TAG GCC already built, can't build libstdc++-v3; skipping!"
|
|
touch build/giteapc-skip-rebuild.txt
|
|
exit 0
|
|
fi
|