toolchain

This commit is contained in:
2023-09-06 18:44:38 +02:00
commit f99fc6681a
11 changed files with 392 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/toolchain

6
env.sh Executable file
View File

@@ -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

View File

@@ -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

View File

@@ -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

18
toolchain_scripts/build-all.sh Executable file
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 <<EOF >../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

46
toolchain_scripts/grub.sh Executable file
View File

@@ -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

View File

@@ -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

47
toolchain_scripts/limine.sh Executable file
View File

@@ -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