Debian based distros have meson 0.6x in their repositories. These cause some obscure error messages when building meson based ports.
324 lines
7.2 KiB
Bash
Executable File
324 lines
7.2 KiB
Bash
Executable File
#!/bin/bash
|
|
set -e
|
|
|
|
BINUTILS_VERSION="binutils-2.45"
|
|
BINUTILS_TAR="$BINUTILS_VERSION.tar.xz"
|
|
BINUTILS_URL="https://ftpmirror.gnu.org/gnu/binutils/$BINUTILS_TAR"
|
|
|
|
GCC_VERSION="gcc-15.2.0"
|
|
GCC_TAR="$GCC_VERSION.tar.xz"
|
|
GCC_URL="https://ftpmirror.gnu.org/gnu/gcc/$GCC_VERSION/$GCC_TAR"
|
|
|
|
GRUB_VERSION="grub-2.06"
|
|
GRUB_TAR="$GRUB_VERSION.tar.xz"
|
|
GRUB_URL="https://ftpmirror.gnu.org/gnu/grub/$GRUB_TAR"
|
|
|
|
CMAKE_VERSION="cmake-3.26.6-linux-x86_64"
|
|
CMAKE_TAR="$CMAKE_VERSION.tar.gz"
|
|
CMAKE_URL="https://cmake.org/files/v3.26/$CMAKE_TAR"
|
|
|
|
MESON_VERSION="meson-1.10.0"
|
|
MESON_TAR="$MESON_VERSION.tar.gz"
|
|
MESON_URL="https://github.com/mesonbuild/meson/releases/download/1.10.0/$MESON_TAR"
|
|
|
|
if [[ -z $BANAN_SYSROOT ]]; then
|
|
echo "You must set the BANAN_SYSROOT environment variable" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $BANAN_ROOT_DIR ]]; then
|
|
echo "You must set the BANAN_ROOT_DIR environment variable" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $BANAN_BUILD_DIR ]]; then
|
|
echo "You must set the BANAN_BUILD_DIR environment variable" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $BANAN_SCRIPT_DIR ]]; then
|
|
echo "You must set the BANAN_SCRIPT_DIR environment variable" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $BANAN_TOOLCHAIN_DIR ]]; then
|
|
echo "You must set the BANAN_TOOLCHAIN_DIR environment variable" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $BANAN_TOOLCHAIN_PREFIX ]]; then
|
|
echo "You must set the BANAN_TOOLCHAIN_PREFIX environment variable" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $BANAN_TOOLCHAIN_TRIPLE ]]; then
|
|
echo "You must set the BANAN_TOOLCHAIN_TRIPLE environment variable" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z $BANAN_ARCH ]]; then
|
|
echo "You must set the BANAN_ARCH environment variable" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z ${MAKE_JOBS:x} ]]; then
|
|
MAKE_JOBS="-j$(nproc)"
|
|
fi
|
|
|
|
enter_clean_build () {
|
|
rm -rf build-$BANAN_ARCH
|
|
mkdir build-$BANAN_ARCH
|
|
cd build-$BANAN_ARCH
|
|
}
|
|
|
|
build_binutils () {
|
|
cd $BANAN_BUILD_DIR/toolchain
|
|
|
|
if [ ! -d $BINUTILS_VERSION ]; then
|
|
if [ ! -f $BINUTILS_TAR ]; then
|
|
echo "Downloading ${BINUTILS_TAR}"
|
|
wget $BINUTILS_URL
|
|
fi
|
|
echo "Unpacking ${BINUTILS_TAR}"
|
|
tar xf $BINUTILS_TAR
|
|
patch -ruN -p1 -d "$BINUTILS_VERSION" < "$BANAN_TOOLCHAIN_DIR/$BINUTILS_VERSION.patch"
|
|
fi
|
|
|
|
cd $BANAN_BUILD_DIR/toolchain/$BINUTILS_VERSION
|
|
enter_clean_build
|
|
|
|
echo "Building ${BINUTILS_VERSION}"
|
|
|
|
../configure \
|
|
--target="$BANAN_TOOLCHAIN_TRIPLE" \
|
|
--prefix="$BANAN_TOOLCHAIN_PREFIX" \
|
|
--with-sysroot="$BANAN_SYSROOT" \
|
|
--enable-initfini-array \
|
|
--enable-shared \
|
|
--enable-lto \
|
|
--disable-nls \
|
|
--disable-werror
|
|
|
|
make $MAKE_JOBS
|
|
make install-strip
|
|
}
|
|
|
|
build_gcc () {
|
|
cd $BANAN_BUILD_DIR/toolchain
|
|
|
|
if [ ! -d $GCC_VERSION ]; then
|
|
if [ ! -f $GCC_TAR ]; then
|
|
echo "Downloading ${GCC_TAR}"
|
|
wget $GCC_URL
|
|
fi
|
|
echo "Unpacking ${GCC_TAR}"
|
|
tar xf $GCC_TAR
|
|
patch -ruN -p1 -d "$GCC_VERSION" < "$BANAN_TOOLCHAIN_DIR/$GCC_VERSION.patch"
|
|
fi
|
|
|
|
cd $BANAN_BUILD_DIR/toolchain/$GCC_VERSION
|
|
enter_clean_build
|
|
|
|
echo "Building ${GCC_VERSION}"
|
|
|
|
../configure \
|
|
--target="$BANAN_TOOLCHAIN_TRIPLE" \
|
|
--prefix="$BANAN_TOOLCHAIN_PREFIX" \
|
|
--with-sysroot="$BANAN_SYSROOT" \
|
|
--enable-initfini-array \
|
|
--enable-threads=posix \
|
|
--enable-shared \
|
|
--enable-lto \
|
|
--disable-nls \
|
|
--enable-languages=c,c++
|
|
|
|
XCFLAGS=""
|
|
if [ $BANAN_ARCH = "x86_64" ]; then
|
|
XCFLAGS="-mcmodel=large -mno-red-zone"
|
|
fi
|
|
|
|
make $MAKE_JOBS all-gcc
|
|
make $MAKE_JOBS all-target-libgcc CFLAGS_FOR_TARGET="$XCFLAGS"
|
|
make install-strip-gcc
|
|
make install-strip-target-libgcc
|
|
}
|
|
|
|
build_libstdcpp () {
|
|
if ! [[ -d $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build-$BANAN_ARCH ]]; then
|
|
echo "You have to build gcc first"
|
|
exit 1
|
|
fi
|
|
|
|
cd $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build-$BANAN_ARCH
|
|
make $MAKE_JOBS all-target-libstdc++-v3
|
|
make install-strip-target-libstdc++-v3
|
|
}
|
|
|
|
build_grub () {
|
|
cd $BANAN_BUILD_DIR/toolchain
|
|
|
|
if [ ! -d $GRUB_VERSION ]; then
|
|
if [ ! -f $GRUB_TAR ]; then
|
|
echo "Downloading ${GRUB_TAR}"
|
|
wget $GRUB_URL
|
|
fi
|
|
echo "Unpacking ${GRUB_TAR}"
|
|
tar xvf $GRUB_TAR
|
|
fi
|
|
|
|
cd $GRUB_VERSION
|
|
enter_clean_build
|
|
|
|
echo "Building ${GRUB_VERSION}"
|
|
|
|
../configure \
|
|
--target="$BANAN_ARCH" \
|
|
--prefix="$BANAN_TOOLCHAIN_PREFIX" \
|
|
--with-platform="efi" \
|
|
--disable-werror \
|
|
CFLAGS=--std=gnu11
|
|
|
|
make $MAKE_JOBS
|
|
make install
|
|
}
|
|
|
|
build_cmake() {
|
|
cd $BANAN_BUILD_DIR/toolchain
|
|
|
|
if [ ! -d $CMAKE_VERSION ]; then
|
|
if [ ! -f $CMAKE_TAR ]; then
|
|
echo "Downloading ${CMAKE_TAR}"
|
|
wget $CMAKE_URL
|
|
fi
|
|
echo "Unpacking ${CMAKE_TAR}"
|
|
tar xvf $CMAKE_TAR
|
|
fi
|
|
|
|
cd $CMAKE_VERSION
|
|
|
|
echo "Building ${CMAKE_VERSION}"
|
|
|
|
mkdir -p $BANAN_TOOLCHAIN_PREFIX/bin
|
|
mkdir -p $BANAN_TOOLCHAIN_PREFIX/share
|
|
|
|
cp -r ./bin/* $BANAN_TOOLCHAIN_PREFIX/bin/
|
|
cp -r ./share/* $BANAN_TOOLCHAIN_PREFIX/share/
|
|
|
|
cp $BANAN_TOOLCHAIN_DIR/cmake-platform/* $BANAN_TOOLCHAIN_PREFIX/share/cmake-3.26/Modules/Platform/
|
|
}
|
|
|
|
build_meson() {
|
|
cd "$BANAN_BUILD_DIR/toolchain"
|
|
|
|
if [ ! -d $MESON_VERSION ]; then
|
|
if [ ! -f $MESON_TAR ]; then
|
|
echo "Downloading ${MESON_TAR}"
|
|
wget $MESON_URL
|
|
fi
|
|
echo "Unpacking ${MESON_TAR}"
|
|
tar xvf $MESON_TAR
|
|
fi
|
|
|
|
cd $MESON_VERSION
|
|
|
|
echo "Building ${MESON_VERSION}"
|
|
|
|
mkdir -p "$BANAN_TOOLCHAIN_PREFIX/bin"
|
|
|
|
./packaging/create_zipapp.py --outfile "$BANAN_TOOLCHAIN_PREFIX/bin/meson" --interpreter '/usr/bin/env python3'
|
|
}
|
|
|
|
BUILD_BINUTILS=1
|
|
if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/$BANAN_TOOLCHAIN_TRIPLE-ld ]]; then
|
|
echo "You already seem to have a binutils installed."
|
|
read -e -p "Do you want to rebuild it [y/N]? " choice
|
|
if ! [[ "$choice" == [Yy]* ]]; then
|
|
BUILD_BINUTILS=0
|
|
fi
|
|
fi
|
|
|
|
BUILD_GCC=1
|
|
if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/$BANAN_TOOLCHAIN_TRIPLE-gcc ]]; then
|
|
echo "You already seem to have a gcc installed."
|
|
read -e -p "Do you want to rebuild it [y/N]? " choice
|
|
if ! [[ "$choice" == [Yy]* ]]; then
|
|
BUILD_GCC=0
|
|
fi
|
|
fi
|
|
|
|
BUILD_LIBSTDCPP=$BUILD_GCC
|
|
if ! (($BUILD_LIBSTDCPP)); then
|
|
read -e -p "Do you want to rebuild libstdc++ [y/N]? " choice
|
|
if [[ "$choice" == [Yy]* ]]; then
|
|
BUILD_LIBSTDCPP=1
|
|
fi
|
|
fi
|
|
|
|
BUILD_GRUB=1
|
|
if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/grub-mkstandalone ]]; then
|
|
echo "You already seem to have a grub installed."
|
|
read -e -p "Do you want to rebuild it [y/N]? " choice
|
|
if ! [[ "$choice" == [Yy]* ]]; then
|
|
BUILD_GRUB=0
|
|
fi
|
|
fi
|
|
|
|
BUILD_CMAKE=1
|
|
if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/cmake ]]; then
|
|
echo "You already seem to have a cmake installed."
|
|
read -e -p "Do you want to rebuild it [y/N]? " choice
|
|
if ! [[ "$choice" == [Yy]* ]]; then
|
|
BUILD_CMAKE=0
|
|
fi
|
|
fi
|
|
|
|
BUILD_MESON=1
|
|
if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/meson ]]; then
|
|
echo "You already seem to have a meson installed."
|
|
read -e -p "Do you want to rebuild it [y/N]? " choice
|
|
if ! [[ "$choice" == [Yy]* ]]; then
|
|
BUILD_MESON=0
|
|
fi
|
|
fi
|
|
|
|
# delete everything but toolchain
|
|
mkdir -p $BANAN_BUILD_DIR
|
|
find $BANAN_BUILD_DIR -mindepth 1 -maxdepth 1 ! -name toolchain -exec rm -r {} +
|
|
|
|
# NOTE: we have to manually create initial sysroot with libc headers
|
|
# since cmake cannot be invoked yet
|
|
mkdir -p $BANAN_SYSROOT/usr
|
|
cp -r $BANAN_ROOT_DIR/userspace/libraries/LibC/include $BANAN_SYSROOT/usr/include
|
|
|
|
mkdir -p $BANAN_BUILD_DIR/toolchain
|
|
|
|
if (($BUILD_BINUTILS)); then
|
|
build_binutils
|
|
fi
|
|
|
|
if (($BUILD_GCC)); then
|
|
build_gcc
|
|
fi
|
|
|
|
if (($BUILD_GRUB)); then
|
|
build_grub
|
|
fi
|
|
|
|
if (($BUILD_CMAKE)); then
|
|
build_cmake
|
|
fi
|
|
|
|
if (($BUILD_MESON)); then
|
|
build_meson
|
|
fi
|
|
|
|
if (($BUILD_LIBSTDCPP)); then
|
|
# delete sysroot and install libc
|
|
rm -r $BANAN_SYSROOT
|
|
$BANAN_SCRIPT_DIR/build.sh libc-static
|
|
$BANAN_SCRIPT_DIR/build.sh libc-shared
|
|
$BANAN_SCRIPT_DIR/build.sh install
|
|
|
|
build_libstdcpp
|
|
fi
|