From c71ac588b2947879666fbcd265b763986f222c45 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 24 Oct 2023 16:48:46 +0300 Subject: [PATCH] BuildSystem: Fix bugs in new build system I had not tested the new build system with clean toolchain build but it seems to work now. --- .gitignore | 4 - script/bochs.sh | 3 +- script/build.sh | 102 ++++++++++----------- script/check-fs.sh | 1 - script/config.sh | 5 +- script/image-full.sh | 7 +- script/qemu.sh | 1 - toolchain/.gitignore | 1 + toolchain/build.sh | 71 ++++++++++---- toolchain/{local => }/grub-legacy-boot.cfg | 0 toolchain/{local => }/grub-memdisk.cfg | 0 toolchain/{local => }/grub-uefi.cfg | 0 toolchain/local/.gitignore | 1 - 13 files changed, 106 insertions(+), 90 deletions(-) create mode 100644 toolchain/.gitignore rename toolchain/{local => }/grub-legacy-boot.cfg (100%) rename toolchain/{local => }/grub-memdisk.cfg (100%) rename toolchain/{local => }/grub-uefi.cfg (100%) delete mode 100644 toolchain/local/.gitignore diff --git a/.gitignore b/.gitignore index fe19aea9..a9328e85 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,4 @@ .idea/ build/ base/ -*.tar.* -toolchain/*/ -!toolchain/local/ -!base-sysroot.tar.gz diff --git a/script/bochs.sh b/script/bochs.sh index adc7442d..196783b1 100755 --- a/script/bochs.sh +++ b/script/bochs.sh @@ -1,5 +1,4 @@ #!/bin/bash -set -e BOCHS_CONFIG_FILE=bochsrc COM1_TERMINAL=kitty @@ -25,4 +24,4 @@ EOF bochs -qf $BOCHS_CONFIG_FILE kill $COM1_TERM_PID -rm $BOCHS_CONFIG_FILE \ No newline at end of file +rm $BOCHS_CONFIG_FILE diff --git a/script/build.sh b/script/build.sh index 3dff508b..c8399d7c 100755 --- a/script/build.sh +++ b/script/build.sh @@ -1,24 +1,20 @@ #!/bin/bash set -e -if [[ -z $BANAN_ARCH ]]; then - export BANAN_ARCH=x86_64 -fi - export BANAN_SCRIPT_DIR=$(dirname $(realpath $0)) source $BANAN_SCRIPT_DIR/config.sh make_build_dir () { - if ! [[ -d $BANAN_BUILD_DIR ]]; then - mkdir -p $BANAN_BUILD_DIR - cd $BANAN_BUILD_DIR - cmake --toolchain=$BANAN_TOOLCHAIN_DIR/Toolchain.txt -G Ninja $BANAN_ROOT_DIR $BANAN_CMAKE_ARGS + mkdir -p $BANAN_BUILD_DIR + cd $BANAN_BUILD_DIR + if ! [[ -f "build.ninja" ]]; then + cmake --toolchain=$BANAN_TOOLCHAIN_DIR/Toolchain.txt -G Ninja $BANAN_ROOT_DIR fi } build_target () { make_build_dir - if [[ -z $1 ]]; then + if [[ $# -eq 0 ]]; then echo "No target provided" exit 1 fi @@ -27,6 +23,15 @@ build_target () { } build_toolchain () { + if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/$BANAN_TOOLCHAIN_TRIPLE_PREFIX-gcc ]]; then + echo "You already seem to have a toolchain." + read -e -p "Do you want to rebuild it [y/N]? " choice + if ! [[ "$choice" == [Yy]* ]]; then + echo "Aborting toolchain rebuild" + exit 0 + fi + fi + $BANAN_TOOLCHAIN_DIR/build.sh build_target libc-install $BANAN_TOOLCHAIN_DIR/build.sh libstdc++ @@ -51,57 +56,42 @@ run_bochs () { $BANAN_SCRIPT_DIR/bochs.sh $@ } -if [[ "$1" == "toolchain" ]]; then - if [[ -f $BANAN_TOOLCHAIN_PREFIX/bin/$BANAN_TOOLCHAIN_TRIPLE_PREFIX-gcc ]]; then - echo "You already seem to have build toolchain." - read -e -p "Do you want to rebuild it [y/N]? " choice - if ! [[ "$choice" == [Yy]* ]]; then - echo "Aborting toolchain rebuild" - exit 0 - fi - fi - - build_toolchain - exit 0 -fi - -if [[ "$1" == "image" ]]; then - create_image - exit 0 -fi - -if [[ "$1" == "image-full" ]]; then - create_image full - exit 0 -fi - if [[ "$(uname)" == "Linux" ]]; then QEMU_ACCEL="-accel kvm" fi -if [[ "$1" == "qemu" ]]; then - run_qemu -serial stdio $QEMU_ACCEL - exit 0 +if [[ $# -eq 0 ]]; then + echo "No argument given" + exit 1 fi -if [[ "$1" == "qemu-nographic" ]]; then - run_qemu -nographic $QEMU_ACCEL - exit 0 -fi +case $1 in + toolchain) + build_toolchain + ;; + image) + create_image + ;; + image-full) + create_image full + ;; + qemu) + run_qemu -serial stdio $QEMU_ACCEL + ;; + qemu-nographic) + run_qemu -nographic $QEMU_ACCEL + ;; + qemu-debug) + run_qemu -serial stdio -d int -no-reboot + ;; + bochs) + run_bochs + ;; + check-fs) + $BANAN_SCRIPT_DIR/check-fs.sh + ;; + *) + build_target $1 + ;; +esac -if [[ "$1" == "qemu-debug" ]]; then - run_qemu -serial stdio -d int -no-reboot - exit 0 -fi - -if [[ "$1" == "bochs" ]]; then - run_bochs - exit 0 -fi - -if [[ "$1" == "check-fs" ]]; then - $BANAN_SCRIPT_DIR/check-fs.sh - exit 0 -fi - -build_target $1 diff --git a/script/check-fs.sh b/script/check-fs.sh index 9af3929b..3e655fe4 100755 --- a/script/check-fs.sh +++ b/script/check-fs.sh @@ -1,5 +1,4 @@ #!/bin/bash -set -e if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then echo "You must set BANAN_DISK_IMAGE_PATH environment variable" >&2 diff --git a/script/config.sh b/script/config.sh index 1c14b0d2..ebdfc1f7 100644 --- a/script/config.sh +++ b/script/config.sh @@ -1,5 +1,5 @@ if [[ -z $BANAN_ROOT_DIR ]]; then - if [[ -z $BANAN_SCRIPT_DIR ]]; then + if ! [[ -z $BANAN_SCRIPT_DIR ]]; then export BANAN_ROOT_DIR=$BANAN_SCRIPT_DIR/.. else echo "You must set the BANAN_ROOT_DIR environment variable" >&2 @@ -8,8 +8,7 @@ if [[ -z $BANAN_ROOT_DIR ]]; then fi if [[ -z $BANAN_ARCH ]]; then - echo "You must set the BANAN_ARCH environment variable" >&2 - exit 1 + export BANAN_ARCH=x86_64 fi export BANAN_TOOLCHAIN_DIR=$BANAN_ROOT_DIR/toolchain diff --git a/script/image-full.sh b/script/image-full.sh index 25412a38..061dd10d 100755 --- a/script/image-full.sh +++ b/script/image-full.sh @@ -1,5 +1,4 @@ #!/bin/bash -set -e if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then echo "You must set the BANAN_DISK_IMAGE_PATH environment variable" >&2 @@ -79,18 +78,18 @@ if [[ "$BANAN_UEFI_BOOT" == "1" ]]; then sudo mkfs.fat $PARTITION1 > /dev/null sudo mount $PARTITION1 "$MOUNT_DIR" sudo mkdir -p "$MOUNT_DIR/EFI/BOOT" - sudo "$BANAN_TOOLCHAIN_PREFIX/bin/grub-mkstandalone" -O "$BANAN_ARCH-efi" -o "$MOUNT_DIR/EFI/BOOT/BOOTX64.EFI" "boot/grub/grub.cfg=$BANAN_TOOLCHAIN_PREFIX/grub-memdisk.cfg" + sudo "$BANAN_TOOLCHAIN_PREFIX/bin/grub-mkstandalone" -O "$BANAN_ARCH-efi" -o "$MOUNT_DIR/EFI/BOOT/BOOTX64.EFI" "boot/grub/grub.cfg=$BANAN_TOOLCHAIN_DIR/grub-memdisk.cfg" sudo umount "$MOUNT_DIR" sudo mount $PARTITION2 "$MOUNT_DIR" sudo mkdir -p "$MOUNT_DIR/boot/grub" - sudo cp "$BANAN_TOOLCHAIN_PREFIX/grub-uefi.cfg" "$MOUNT_DIR/boot/grub/grub.cfg" + sudo cp "$BANAN_TOOLCHAIN_DIR/grub-uefi.cfg" "$MOUNT_DIR/boot/grub/grub.cfg" sudo umount "$MOUNT_DIR" else sudo mount $PARTITION2 "$MOUNT_DIR" sudo grub-install --no-floppy --target=i386-pc --modules="normal ext2 multiboot" --boot-directory="$MOUNT_DIR/boot" $LOOP_DEV sudo mkdir -p "$MOUNT_DIR/boot/grub" - sudo cp "$BANAN_TOOLCHAIN_PREFIX/grub-legacy-boot.cfg" "$MOUNT_DIR/boot/grub/grub.cfg" + sudo cp "$BANAN_TOOLCHAIN_DIR/grub-legacy-boot.cfg" "$MOUNT_DIR/boot/grub/grub.cfg" sudo umount "$MOUNT_DIR" fi diff --git a/script/qemu.sh b/script/qemu.sh index 82b859ac..c472abf8 100755 --- a/script/qemu.sh +++ b/script/qemu.sh @@ -1,5 +1,4 @@ #!/bin/bash -set -e if [[ -z $BANAN_DISK_IMAGE_PATH ]]; then echo "You must set the BANAN_DISK_IMAGE_PATH environment variable" >&2 diff --git a/toolchain/.gitignore b/toolchain/.gitignore new file mode 100644 index 00000000..355164c1 --- /dev/null +++ b/toolchain/.gitignore @@ -0,0 +1 @@ +*/ diff --git a/toolchain/build.sh b/toolchain/build.sh index 057c475d..34e7d1af 100755 --- a/toolchain/build.sh +++ b/toolchain/build.sh @@ -10,6 +10,16 @@ if [[ -z $BANAN_SYSROOT ]]; then 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_TOOLCHAIN_DIR ]]; then echo "You must set the BANAN_TOOLCHAIN_DIR environment variable" >&2 exit 1 @@ -30,10 +40,16 @@ if [[ -z $BANAN_ARCH ]]; then exit 1 fi +enter_clean_build () { + rm -rf build + mkdir build + cd build +} + build_binutils () { echo "Building ${BINUTILS_VERSION}" - cd $BANAN_TOOLCHAIN_DIR + cd $BANAN_BUILD_DIR/toolchain if [ ! -f ${BINUTILS_VERSION}.tar.xz ]; then wget https://ftp.gnu.org/gnu/binutils/${BINUTILS_VERSION}.tar.xz @@ -41,13 +57,13 @@ build_binutils () { if [ ! -d $BINUTILS_VERSION ]; then tar xvf ${BINUTILS_VERSION}.tar.xz - patch -s -p0 < ${BINUTILS_VERSION}.patch + patch -s -p0 < $BANAN_TOOLCHAIN_DIR/${BINUTILS_VERSION}.patch fi - mkdir -p build/${BINUTILS_VERSION}/ - cd build/${BINUTILS_VERSION}/ + cd $BINUTILS_VERSION + enter_clean_build - ../../${BINUTILS_VERSION}/configure \ + ../configure \ --target="$BANAN_TOOLCHAIN_TRIPLE_PREFIX" \ --prefix="$BANAN_TOOLCHAIN_PREFIX" \ --with-sysroot="$BANAN_SYSROOT" \ @@ -61,7 +77,7 @@ build_binutils () { build_gcc () { echo "Building ${GCC_VERSION}" - cd $BANAN_TOOLCHAIN_DIR + cd $BANAN_BUILD_DIR/toolchain if [ ! -f ${GCC_VERSION}.tar.xz ]; then wget https://ftp.gnu.org/gnu/gcc/${GCC_VERSION}/${GCC_VERSION}.tar.xz @@ -69,13 +85,13 @@ build_gcc () { if [ ! -d $GCC_VERSION ]; then tar xvf ${GCC_VERSION}.tar.xz - patch -s -p0 < ${GCC_VERSION}.patch + patch -s -p0 < $BANAN_TOOLCHAIN_DIR/${GCC_VERSION}.patch fi - mkdir -p build/${GCC_VERSION}/ - cd build/${GCC_VERSION}/ + cd ${GCC_VERSION} + enter_clean_build - ../../${GCC_VERSION}/configure \ + ../configure \ --target="$BANAN_TOOLCHAIN_TRIPLE_PREFIX" \ --prefix="$BANAN_TOOLCHAIN_PREFIX" \ --with-sysroot="$BANAN_SYSROOT" \ @@ -90,7 +106,7 @@ build_gcc () { build_grub () { echo "Building ${GRUB_VERSION}" - cd $BANAN_TOOLCHAIN_DIR + cd $BANAN_BUILD_DIR/toolchain if [ ! -f ${GRUB_VERSION}.tar.xz ]; then wget https://ftp.gnu.org/gnu/grub/${GRUB_VERSION}.tar.xz @@ -100,10 +116,10 @@ build_grub () { tar xvf ${GRUB_VERSION}.tar.xz fi - mkdir -p build/${GRUB_VERSION}/ - cd build/${GRUB_VERSION}/ + cd $GRUB_VERSION + enter_clean_build - ../../${GRUB_VERSION}/configure \ + ../configure \ --target="$BANAN_ARCH" \ --prefix="$BANAN_TOOLCHAIN_PREFIX" \ --with-platform="efi" \ @@ -114,16 +130,35 @@ build_grub () { } build_libstdcpp () { - cd build/${GCC_VERSION}/ + if ! [[ -d $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build ]]; then + echo "You have to build gcc first" + exit 1 + fi + + cd $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build make -j $(nproc) all-target-libstdc++-v3 make install-target-libstdc++-v3 } -if [[ "$1" == "libstdc++" ]]; then - build_libstdcpp - exit 0 +if [[ $# -ge 1 ]]; then + if [[ "$1" == "libstdc++" ]]; then + build_libstdcpp + exit 0 + fi + + echo "unrecognized arguments $@" + exit 1 fi +# NOTE: we have to manually create initial sysroot with libc headers +# since cmake cannot be invoked yet +echo "Syncing sysroot headers" +mkdir -p $BANAN_SYSROOT +sudo mkdir -p $BANAN_SYSROOT/usr/include +sudo rsync -a $BANAN_ROOT_DIR/libc/include/ $BANAN_SYSROOT/usr/include/ + +mkdir -p $BANAN_BUILD_DIR/toolchain + build_binutils build_gcc build_grub diff --git a/toolchain/local/grub-legacy-boot.cfg b/toolchain/grub-legacy-boot.cfg similarity index 100% rename from toolchain/local/grub-legacy-boot.cfg rename to toolchain/grub-legacy-boot.cfg diff --git a/toolchain/local/grub-memdisk.cfg b/toolchain/grub-memdisk.cfg similarity index 100% rename from toolchain/local/grub-memdisk.cfg rename to toolchain/grub-memdisk.cfg diff --git a/toolchain/local/grub-uefi.cfg b/toolchain/grub-uefi.cfg similarity index 100% rename from toolchain/local/grub-uefi.cfg rename to toolchain/grub-uefi.cfg diff --git a/toolchain/local/.gitignore b/toolchain/local/.gitignore deleted file mode 100644 index 0a00d701..00000000 --- a/toolchain/local/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*/ \ No newline at end of file