summaryrefslogtreecommitdiff
path: root/tools/cross.sh
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2024-06-04 13:41:11 -0400
committerIan Moffett <ian@osmora.org>2024-06-04 13:45:31 -0400
commit98ccb3a2d41015b42d46d8b382decc755a003c3f (patch)
tree4e514830880a4deabebb60c38055792695314ae6 /tools/cross.sh
project: Initial commit
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'tools/cross.sh')
-rw-r--r--tools/cross.sh164
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"