diff options
Diffstat (limited to 'tools/cross.sh')
-rw-r--r-- | tools/cross.sh | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/tools/cross.sh b/tools/cross.sh new file mode 100644 index 0000000..52e7b1b --- /dev/null +++ b/tools/cross.sh @@ -0,0 +1,164 @@ +#!/bin/bash + +# +# Copyright (c) 2023-2024 Ian Marco Moffett and the Osmora Team. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of Hyra nor the names of its contributors may be used +# to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +################################################################ +# Toolchain configuration +################################################################ + +set -e + +if [ "$1" == "amd64" ] +then + TARGET="x86_64-hyra" +else + TARGET="$1-elf" +fi + +BINUTILS_VERSION=2.42 +GCC_VERSION=13.2.0 +BINUTILS_NAME="binutils-$BINUTILS_VERSION" +BINUTILS_TARBALL="$BINUTILS_NAME.tar.xz" +BINUTILS_URL="https://ftp.gnu.org/gnu/binutils/$BINUTILS_TARBALL" +GCC_NAME="gcc-$GCC_VERSION" +GCC_TARBALL="$GCC_NAME.tar.xz" +GCC_URL="https://ftp.gnu.org/gnu/gcc/gcc-$GCC_VERSION/$GCC_TARBALL" + +# Remove debugging information, it takes up a lot of space +export CFLAGS="-g0" +export CXXFLAGS="-g0" + +# System-dependent configuration +SYSTEM_NAME="$(uname -s)" +MAKE="make" +NPROC="nproc" +if [ "$SYSTEM_NAME" = "OpenBSD" ]; then + MAKE="gmake" + NPROC="sysctl -n hw.ncpuonline" +elif [ "$SYSTEM_NAME" = "FreeBSD" ]; then + MAKE="gmake" + NPROC="sysctl -n hw.ncpu" +elif [ "$SYSTEM_NAME" = "Darwin" ]; then + NPROC="sysctl -n hw.ncpu" +fi +CORES="$($NPROC)" + +# Set build paths +PREFIX="$(pwd)/cross" +export PATH="$PREFIX/bin:$PATH" + +# Create build directory +mkdir -p "$PREFIX/build" +cd "$PREFIX/build" + +################################################################ +# Download and extract sources +################################################################ + +if [ ! -f $BINUTILS_TARBALL ]; then + echo "Downloading binutils..." + curl $BINUTILS_URL -o $BINUTILS_TARBALL +fi +if [ ! -f $GCC_TARBALL ]; then + echo "Downloading gcc..." + curl $GCC_URL -o $GCC_TARBALL +fi + +echo "Extracting binutils..." +rm -rf $BINUTILS_NAME +tar -xf $BINUTILS_TARBALL +echo "Extracting gcc..." +rm -rf $GCC_NAME +tar -xf $GCC_TARBALL + +################################################################ +# Build packages +################################################################ + +echo "Removing previous builds..." +rm -rf build-gcc build-binutils + +# Binutils build +clear +mkdir build-binutils + +echo "Applying binutils patch" +cp -r $BINUTILS_NAME $BINUTILS_NAME-copy +patch -s -p0 < ../../builddeps/binutils.patch +rm -rf $BINUTILS_NAME-copy + +echo "Configuring $BINUTILS_NAME..." +cd build-binutils +../$BINUTILS_NAME/configure --target="$TARGET" --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror --enable-targets=all +echo "Building $BINUTILS_NAME..." +$MAKE -j$CORES +echo "Installing $BINUTILS_NAME..." +$MAKE install +echo "Cleaning $BINUTILS_NAME..." +cd .. +rm -rf $BINUTILS_NAME build-binutils + +# GCC build +clear +echo "Downloading prerequisites for $GCC_NAME..." +cd $GCC_NAME +contrib/download_prerequisites +cd .. + +echo "Applying GCC patch" +cp -r $GCC_NAME $GCC_NAME-copy +patch -s -p0 < ../../builddeps/gcc.patch +rm -rf $GCC_NAME-copy + +echo "Configuring $GCC_NAME..." +mkdir build-gcc +cd build-gcc +../$GCC_NAME/configure --target="$TARGET" --with-sysroot=/ --prefix="$PREFIX" --disable-nls --enable-languages=c,c++,lto --disable-multilib +echo "Building all-gcc..." +$MAKE all-gcc -j"$CORES" +echo "Building all-target-libgcc..." +$MAKE all-target-libgcc -j"$CORES" +echo "Installing $GCC_NAME..." +$MAKE install-gcc +echo "Installing target-libgcc..." +$MAKE install-target-libgcc +echo "Cleaning $GCC_NAME..." +cd .. +rm -rf $GCC_NAME build-gcc + +################################################################ +# Cleanup +################################################################ + +clear +"$TARGET"-ld -v +"$TARGET"-gcc --version | head -n1 +echo "Build complete, binaries are in $PREFIX" +echo "Finished in $(($SECONDS / 60)) minutes and $(($SECONDS % 60)) seconds" |