commit f99fc6681a9b754373ef3ee696d77fb4866b0707 Author: Stepan Usatiuk Date: Wed Sep 6 18:44:38 2023 +0200 toolchain diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..5801219ee --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/toolchain diff --git a/env.sh b/env.sh new file mode 100755 index 000000000..2850bce44 --- /dev/null +++ b/env.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +if [ -z "$OS2_ROOT" ]; then + echo OS2_ROOT is blank setting default! + export OS2_ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) +fi diff --git a/toolchain_scripts/binutils-i686-elf.sh b/toolchain_scripts/binutils-i686-elf.sh new file mode 100755 index 000000000..ca5e4cf9c --- /dev/null +++ b/toolchain_scripts/binutils-i686-elf.sh @@ -0,0 +1,35 @@ +#!/bin/bash +set -euxo pipefail + +if [ -z "$OS2_ROOT" ]; then + echo "$OS2_ROOT" is blank +fi + +mkdir -p $OS2_ROOT/toolchain || exit 1 + +pushd $OS2_ROOT/toolchain + +mkdir -p binutils-i686-elf + +pushd binutils-i686-elf + +if [ ! -d "binutils-2.41" ]; then + wget https://ftp.gnu.org/gnu/binutils/binutils-2.41.tar.xz + tar xvf binutils-2.41.tar.xz + rm binutils-2.41.tar.xz +fi + +mkdir -p build + +pushd build + +export PREFIX="$OS2_ROOT/toolchain/gcc-i686-elf-prefix/" +export TARGET=i686-elf +export PATH="$PREFIX/bin:$PATH" + +../binutils-2.41/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror + +make -j$(nproc) +make install + +touch -m ../done diff --git a/toolchain_scripts/binutils-x86_64-elf.sh b/toolchain_scripts/binutils-x86_64-elf.sh new file mode 100755 index 000000000..168ea9ff6 --- /dev/null +++ b/toolchain_scripts/binutils-x86_64-elf.sh @@ -0,0 +1,35 @@ +#!/bin/bash +set -euxo pipefail + +if [ -z "$OS2_ROOT" ]; then + echo "$OS2_ROOT" is blank +fi + +mkdir -p $OS2_ROOT/toolchain || exit 1 + +pushd $OS2_ROOT/toolchain + +mkdir -p binutils-x86_64-elf + +pushd binutils-x86_64-elf + +if [ ! -d "binutils-2.41" ]; then + wget https://ftp.gnu.org/gnu/binutils/binutils-2.41.tar.xz + tar xvf binutils-2.41.tar.xz + rm binutils-2.41.tar.xz +fi + +mkdir -p build + +pushd build + +export PREFIX="$OS2_ROOT/toolchain/gcc-x86_64-elf-prefix/" +export TARGET=x86_64-elf +export PATH="$PREFIX/bin:$PATH" + +../binutils-2.41/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror + +make -j$(nproc) +make install + +touch -m ../done diff --git a/toolchain_scripts/build-all.sh b/toolchain_scripts/build-all.sh new file mode 100755 index 000000000..77c6627ee --- /dev/null +++ b/toolchain_scripts/build-all.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -euxo pipefail + +if [ -z "$OS2_ROOT" ]; then + echo "$OS2_ROOT" is blank +fi + +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) + +"$SCRIPT_DIR"/binutils-i686-elf.sh +"$SCRIPT_DIR"/gcc-i686-elf.sh + +"$SCRIPT_DIR"/binutils-x86_64-elf.sh +"$SCRIPT_DIR"/gcc-x86_64-elf.sh +"$SCRIPT_DIR"/libstdc++-x86_64-elf.sh + +"$SCRIPT_DIR"/grub.sh +"$SCRIPT_DIR"/limine.sh diff --git a/toolchain_scripts/gcc-i686-elf.sh b/toolchain_scripts/gcc-i686-elf.sh new file mode 100755 index 000000000..61800f7d2 --- /dev/null +++ b/toolchain_scripts/gcc-i686-elf.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -euxo pipefail + +if [ -z "$OS2_ROOT" ]; then + echo "$OS2_ROOT" is blank +fi + +mkdir -p $OS2_ROOT/toolchain || exit 1 + +pushd $OS2_ROOT/toolchain + +mkdir -p gcc-i686-elf + +pushd gcc-i686-elf + +if [ ! -d gcc-13.2.0 ]; then + wget https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz + tar xvf gcc-13.2.0.tar.xz + rm gcc-13.2.0.tar.xz +fi + +mkdir -p build +pushd build + +export PREFIX="$OS2_ROOT/toolchain/gcc-i686-elf-prefix/" +export TARGET=i686-elf +export PATH="$PREFIX/bin:$PATH" + +if [ ! -f "$OS2_ROOT/toolchain/gcc-i686-elf-prefix/bin/i686-elf-as" ]; then + echo "binutils not found" + exit 1 +fi + +HOMEBREW_LIBS="--with-gmp=/opt/homebrew --with-mpc=/opt/homebrew --with-mpfr=/opt/homebrew" + +ADDONS="" + +if [ ! -z "$USE_BREW_LIBS" ]; then + ADDONS="$HOMEBREW_LIBS $ADDONS" +fi + +../gcc-13.2.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --with-newlib --without-headers --enable-version-specific-runtime-libs $ADDONS +make -j$(nproc) all-gcc +make -j$(nproc) all-target-libgcc +make install-gcc +make install-target-libgcc + +touch -m ../done diff --git a/toolchain_scripts/gcc-libstdcpp.patch b/toolchain_scripts/gcc-libstdcpp.patch new file mode 100644 index 000000000..a950348bd --- /dev/null +++ b/toolchain_scripts/gcc-libstdcpp.patch @@ -0,0 +1,46 @@ +--- gcc-13.2.0/libstdc++-v3/configure 2023-08-21 20:42:16 ++++ gcc-13.2.0/libstdc++-v3/configure 2023-08-21 20:42:20 +@@ -71180,21 +71180,7 @@ + done + + +- # Check for the fcntl function. +- if test -n "${with_target_subdir}"; then +- case "${host}" in +- *-*-mingw*) have_fcntl=no ;; +- *) have_fcntl=yes ;; +- esac +- else +- ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl" +-if test "x$ac_cv_func_fcntl" = xyes; then : +- have_fcntl=yes +-else + have_fcntl=no +-fi +- +- fi + if test "$have_fcntl" = "yes"; then + BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_FCNTL=1" + fi +@@ -71211,21 +71197,7 @@ + _ACEOF + + +- # Check for getexecname function. +- if test -n "${with_target_subdir}"; then +- case "${host}" in +- *-*-solaris2*) have_getexecname=yes ;; +- *) have_getexecname=no ;; +- esac +- else +- ac_fn_c_check_func "$LINENO" "getexecname" "ac_cv_func_getexecname" +-if test "x$ac_cv_func_getexecname" = xyes; then : +- have_getexecname=yes +-else + have_getexecname=no +-fi +- +- fi + if test "$have_getexecname" = "yes"; then + BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_GETEXECNAME=1" + fi diff --git a/toolchain_scripts/gcc-x86_64-elf.sh b/toolchain_scripts/gcc-x86_64-elf.sh new file mode 100755 index 000000000..774ddda02 --- /dev/null +++ b/toolchain_scripts/gcc-x86_64-elf.sh @@ -0,0 +1,57 @@ +#!/bin/bash +set -euxo pipefail + +if [ -z "$OS2_ROOT" ]; then + echo "$OS2_ROOT" is blank +fi + +mkdir -p $OS2_ROOT/toolchain || exit 1 + +pushd $OS2_ROOT/toolchain + +mkdir -p gcc-x86_64-elf + +pushd gcc-x86_64-elf + +if [ ! -d gcc-13.2.0 ]; then + wget https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz + tar xvf gcc-13.2.0.tar.xz + rm gcc-13.2.0.tar.xz +fi + +mkdir -p build +pushd build + +export PREFIX="$OS2_ROOT/toolchain/gcc-x86_64-elf-prefix/" +export TARGET=x86_64-elf +export PATH="$PREFIX/bin:$PATH" + +if [ ! -f "$OS2_ROOT/toolchain/gcc-x86_64-elf-prefix/bin/x86_64-elf-as" ]; then + echo "binutils not found" + exit 1 +fi + +HOMEBREW_LIBS="--with-gmp=/opt/homebrew --with-mpc=/opt/homebrew --with-mpfr=/opt/homebrew" + +ADDONS="" + +if [ ! -z "$USE_BREW_LIBS" ]; then + ADDONS="$HOMEBREW_LIBS $ADDONS" +fi + +cat <../gcc-13.2.0/gcc/config/i386/t-x86_64-elf +# Add libgcc multilib variant without red-zone requirement + +MULTILIB_OPTIONS += mno-red-zone +MULTILIB_DIRNAMES += no-red-zone +EOF + +sed -i .bak 's/x86_64-\*-elf\*)/x86_64-\*-elf\*)\n\ttmake_file="\${tmake_file} i386\/t-x86_64-elf"/g' "../gcc-13.2.0/gcc/config.gcc" + +../gcc-13.2.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --with-newlib --without-headers --enable-version-specific-runtime-libs $ADDONS +make -j$(nproc) all-gcc +make -j$(nproc) all-target-libgcc +make install-gcc +make install-target-libgcc + +touch -m ../done diff --git a/toolchain_scripts/grub.sh b/toolchain_scripts/grub.sh new file mode 100755 index 000000000..8ea91f1a2 --- /dev/null +++ b/toolchain_scripts/grub.sh @@ -0,0 +1,46 @@ +#!/bin/bash +set -euxo pipefail + +if [ -z "$OS2_ROOT" ]; then + echo "$OS2_ROOT" is blank +fi + +mkdir -p $OS2_ROOT/toolchain || exit 1 + +pushd $OS2_ROOT/toolchain + +mkdir -p grub + +pushd grub + +mkdir -p prefix + +if [ ! -d "grub-2.06" ]; then + wget https://ftp.gnu.org/gnu/grub/grub-2.06.tar.xz + tar xvf grub-2.06.tar.xz + rm grub-2.06.tar.xz +fi + +mkdir -p build + +pushd build + +if [ ! -f "$OS2_ROOT/toolchain/gcc-i686-elf-prefix/bin/i686-elf-gcc" ]; then + echo "binutils not found" + exit 1 +fi + +export PATH="$OS2_ROOT/toolchain/gcc-i686-elf-prefix/bin":"$PATH" + +export PREFIX="$OS2_ROOT/toolchain/grub/prefix" +export TARGET=i686-elf +export PATH="$PREFIX/bin:$PATH" + +../grub-2.06/configure --disable-werror TARGET_CC=i686-elf-gcc TARGET_AS=i686-elf-as TARGET_OBJCOPY=i686-elf-objcopy \ + TARGET_STRIP=i686-elf-strip TARGET_NM=i686-elf-nm TARGET_RANLIB=i686-elf-ranlib --target="$TARGET" \ + --prefix="$PREFIX" + +make -j$(nproc) +make install + +touch -m ../done diff --git a/toolchain_scripts/libstdc++-x86_64-elf.sh b/toolchain_scripts/libstdc++-x86_64-elf.sh new file mode 100755 index 000000000..1ea480950 --- /dev/null +++ b/toolchain_scripts/libstdc++-x86_64-elf.sh @@ -0,0 +1,53 @@ +#!/bin/bash +set -euxo pipefail + +if [ -z "$OS2_ROOT" ]; then + echo "$OS2_ROOT" is blank +fi + +mkdir -p $OS2_ROOT/toolchain || exit 1 + +cd $OS2_ROOT/toolchain + +cd gcc-x86_64-elf || exit 1 + +if [ ! -d gcc-13.2.0 ]; then + echo "GCC Sources not found!" + exit 1 +fi + +if [ ! -f "$OS2_ROOT/toolchain/gcc-x86_64-elf-prefix/bin/x86_64-elf-as" ]; then + echo "binutils not found" + exit 1 +fi + +if [ ! -f "$OS2_ROOT/toolchain/gcc-x86_64-elf-prefix/bin/x86_64-elf-gcc" ]; then + echo "gcc not found" + exit 1 +fi + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +patch -u -i "$SCRIPT_DIR/gcc-libstdcpp.patch" + +export PREFIX="$OS2_ROOT/toolchain/gcc-x86_64-elf-prefix/" +export TARGET=x86_64-elf +export PATH="$PREFIX/bin:$PATH" + +# Note that you might have to go into the configure script and remove tests for fcntl and maybe other errors +mkdir -p libstdcppbuild +cd libstdcppbuild +../gcc-13.2.0/libstdc++-v3/configure \ + --host=$TARGET \ + --prefix="$PREFIX" \ + --disable-nls \ + --with-newlib \ + --without-headers \ + --disable-libstdcxx-threads \ + --disable-hosted-libstdcxx \ + --enable-version-specific-runtime-libs + +make -j$(nproc) CFLAGS_FOR_TARGET='-g -O2 -mcmodel=large -mno-red-zone' +make install + +touch -m ../donelibstdcpp diff --git a/toolchain_scripts/limine.sh b/toolchain_scripts/limine.sh new file mode 100755 index 000000000..ada0946c3 --- /dev/null +++ b/toolchain_scripts/limine.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -euxo pipefail + +if [ -z "$OS2_ROOT" ]; then + echo "$OS2_ROOT" is blank +fi + +mkdir -p $OS2_ROOT/toolchain || exit 1 + +pushd $OS2_ROOT/toolchain + +mkdir -p limine + +pushd limine + +mkdir -p prefix + +if [ ! -d "limine-5.20230830.0" ]; then + wget https://github.com/limine-bootloader/limine/releases/download/v5.20230830.0/limine-5.20230830.0.tar.xz + tar xvf limine-5.20230830.0.tar.xz + rm limine-5.20230830.0.tar.xz +fi + +mkdir -p build + +pushd build + +if [ ! -f "$OS2_ROOT/toolchain/gcc-i686-elf-prefix/bin/i686-elf-gcc" ]; then + echo "binutils not found" + exit 1 +fi + +export PATH="$OS2_ROOT/toolchain/gcc-i686-elf-prefix/bin":"$PATH" +export PATH="$OS2_ROOT/toolchain/gcc-x86_64-elf-prefix/bin":"$PATH" + +export PREFIX="$OS2_ROOT/toolchain/limine/prefix" +export PATH="$PREFIX/bin:$PATH" + +# fix for old make +grep -rl "define DEFAULT_VAR =" ../limine-5.20230830.0 | xargs sed -i "" -e 's/define DEFAULT_VAR =/define DEFAULT_VAR/g' + +../limine-5.20230830.0/configure --disable-werror --enable-bios-cd --enable-bios --enable-uefi-ia32 --enable-uefi-x86-64 --enable-uefi-cd \ + --prefix="$PREFIX" + +make -j$(nproc) install + +touch -m ../done