diff --git a/Meta/debug-kernel.sh b/Meta/debug-kernel.sh index 04afa992b0..4e902155b6 100755 --- a/Meta/debug-kernel.sh +++ b/Meta/debug-kernel.sh @@ -9,7 +9,9 @@ fi # Set this environment variable to override the default debugger. # if [ -z "$SERENITY_KERNEL_DEBUGGER" ]; then - # Prepend the toolchain bin directory so we pick up GDB from there + # Prepend the toolchain's GDB bin directory so we pick up GDB from there + PATH="$SCRIPT_DIR/../Toolchain/Local/$SERENITY_ARCH-gdb/bin:$PATH" + # GDB used to be installed directly inside the toolchain bin directory PATH="$SCRIPT_DIR/../Toolchain/Local/$SERENITY_ARCH/bin:$PATH" if command -v "$SERENITY_ARCH-pc-serenity-gdb" >/dev/null; then @@ -20,6 +22,9 @@ if [ -z "$SERENITY_KERNEL_DEBUGGER" ]; then SERENITY_KERNEL_DEBUGGER="gdb" else echo "Error: No suitable GDB installation found." >&2 + echo "Please install $SERENITY_ARCH-elf-gdb or build it with Toolchain/BuildGDB.sh $SERENITY_ARCH" >&2 + # Prevent tmux from dying instantly by waiting for user input + read -rp "Press Enter to exit" exit 1 fi fi diff --git a/Toolchain/BuildGDB.sh b/Toolchain/BuildGDB.sh new file mode 100755 index 0000000000..75d16d9fd2 --- /dev/null +++ b/Toolchain/BuildGDB.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash +set -e + +GDB_VERSION="13.1" +GDB_MD5SUM="4aaad768ff2585464173c091947287ec" +GDB_NAME="gdb-$GDB_VERSION" +GDB_PKG="${GDB_NAME}.tar.xz" +GDB_BASE_URL="https://ftp.gnu.org/gnu/gdb" + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +ARCH=${1:-"x86_64"} +TARGET="$ARCH-pc-serenity" +PREFIX="$DIR/Local/$ARCH-gdb" + +echo "Building GDB $GDB_VERSION for $TARGET" + +MD5SUM="md5sum" +NPROC="nproc" + +SYSTEM_NAME="$(uname -s)" + +if [ "$SYSTEM_NAME" = "OpenBSD" ]; then + MD5SUM="md5 -q" + NPROC="sysctl -n hw.ncpuonline" + export CC=egcc + export CXX=eg++ + export with_gmp=/usr/local + export LDFLAGS=-Wl,-z,notext +elif [ "$SYSTEM_NAME" = "FreeBSD" ]; then + MD5SUM="md5 -q" + NPROC="sysctl -n hw.ncpu" + export with_gmp=/usr/local + export with_mpfr=/usr/local +elif [ "$SYSTEM_NAME" = "Darwin" ]; then + MD5SUM="md5 -q" + NPROC="sysctl -n hw.ncpu" +fi + +if [ -z "$MAKEJOBS" ]; then + MAKEJOBS=$($NPROC) +fi + +buildstep() { + NAME=$1 + shift + "$@" 2>&1 | sed $'s|^|\x1b[34m['"${NAME}"$']\x1b[39m |' +} + +missing_lib() { + buildstep dependencies echo "Please make sure to install the $lib library and headers." >&2 + exit 1 +} + +config_args=() +for lib in gmp isl mpfr mpc; do + buildstep dependencies echo "Checking whether the $lib library and headers are available..." + if [ "$SYSTEM_NAME" = "Darwin" ]; then + [ "$lib" = "mpc" ] && formula_name="libmpc" || formula_name="$lib" + config_args+=("--with-$lib=$(brew --prefix --installed "$formula_name")") || missing_lib $lib + else + if ! ${CC:-cc} -I /usr/local/include -L /usr/local/lib -l$lib -o /dev/null -xc - >/dev/null < +int main() {} +PROGRAM + then + missing_lib $lib + fi + fi +done + +if [ "$SYSTEM_NAME" = "Darwin" ]; then + config_args+=("--with-libgmp-prefix=$(brew --prefix gmp)") +fi + +mkdir -p "$DIR/Tarballs" + +pushd "$DIR/Tarballs" + md5="" + if [ -e "$GDB_PKG" ]; then + md5="$($MD5SUM "$GDB_PKG" | cut -f1 -d' ')" + fi + if [ "$md5" != "$GDB_MD5SUM" ]; then + curl -C - -O "$GDB_BASE_URL/$GDB_PKG" + else + echo "Skipped downloading $GDB_PKG" + fi + + md5="$($MD5SUM "$GDB_PKG" | cut -f1 -d' ')" + echo "gdb md5='$md5'" + if [ "$md5" != "$GDB_MD5SUM" ] ; then + echo "gdb md5 sum mismatching, please run script again." + rm -f "$GDB_PKG" + exit 1 + fi + + # If the source directory exists, re-extract it again in case the patches have changed. + if [ -d ${GDB_NAME} ]; then + rm -rf "${GDB_NAME}" + rm -rf "$DIR/Build/$ARCH-gdb" + fi + echo "Extracting gdb..." + tar -xJf "$GDB_PKG" + + pushd "$GDB_NAME" + for patch in "${DIR}"/Patches/gdb/*.patch; do + patch -p1 < "${patch}" > /dev/null + done + popd +popd + +mkdir -p "$DIR/Build" + +rm -rf "$DIR/Build/$ARCH-gdb" +mkdir "$DIR/Build/$ARCH-gdb" + +pushd "$DIR/Build/$ARCH-gdb" + unset PKG_CONFIG_LIBDIR # Just in case + + buildstep "gdb/configure" "$DIR"/Tarballs/$GDB_NAME/configure --prefix="$PREFIX" \ + --target="$TARGET" \ + --disable-werror \ + --disable-nls \ + --with-python \ + "${config_args[@]}" || exit 1 + + buildstep "gdb/build" make MAKEINFO=true -j "$MAKEJOBS" || exit 1 + buildstep "gdb/install" make MAKEINFO=true install || exit 1 +popd diff --git a/Toolchain/BuildIt.sh b/Toolchain/BuildIt.sh index 777f2685e2..69c2c5af2d 100755 --- a/Toolchain/BuildIt.sh +++ b/Toolchain/BuildIt.sh @@ -80,12 +80,6 @@ BINUTILS_NAME="binutils-$BINUTILS_VERSION" BINUTILS_PKG="${BINUTILS_NAME}.tar.gz" BINUTILS_BASE_URL="https://ftp.gnu.org/gnu/binutils" -GDB_VERSION="13.1" -GDB_MD5SUM="92b70971e81a450f6b3e1cf568671cfa" -GDB_NAME="gdb-$GDB_VERSION" -GDB_PKG="${GDB_NAME}.tar.gz" -GDB_BASE_URL="https://ftp.gnu.org/gnu/gdb" - # Note: If you bump the gcc version, you also have to update the matching # GCC_VERSION variable in the project's root CMakeLists.txt GCC_VERSION="12.2.0" @@ -100,21 +94,6 @@ buildstep() { "$@" 2>&1 | sed $'s|^|\x1b[34m['"${NAME}"$']\x1b[39m |' } -has_gdb() { - ARCH=$1 - ARCH_DASH="${ARCH//_/-}" - if command -v gdb >/dev/null && gdb -ex 'set architecture' -ex 'quit' 2>&1 | grep "$ARCH_DASH"; then - return 0 - else - command -v "$ARCH"-elf-gdb >/dev/null - fi -} - -NEEDS_GDB=1 -if has_gdb "$ARCH"; then - NEEDS_GDB=0 -fi - # === DEPENDENCIES === buildstep dependencies echo "Checking whether 'make' is available..." if ! command -v ${MAKE:-make} >/dev/null; then @@ -197,22 +176,6 @@ popd # === DOWNLOAD AND PATCH === pushd "$DIR/Tarballs" - # Build gdb for cross-debugging support - if [ $NEEDS_GDB -eq 1 ]; then - echo "GDB not found for $ARCH. Will build it from source." - md5="" - if [ -e "$GDB_PKG" ]; then - md5="$($MD5SUM $GDB_PKG | cut -f1 -d' ')" - echo "gdb md5='$md5'" - fi - if [ "$md5" != ${GDB_MD5SUM} ] ; then - rm -f $GDB_PKG - curl -LO "$GDB_BASE_URL/$GDB_PKG" - else - echo "Skipped downloading gdb" - fi - fi - md5="" if [ -e "$BINUTILS_PKG" ]; then md5="$($MD5SUM $BINUTILS_PKG | cut -f1 -d' ')" @@ -237,29 +200,6 @@ pushd "$DIR/Tarballs" echo "Skipped downloading gcc" fi - if [ $NEEDS_GDB -eq 1 ]; then - if [ -d ${GDB_NAME} ]; then - rm -rf "${GDB_NAME}" - rm -rf "$DIR/Build/$ARCH/$GDB_NAME" - fi - echo "Extracting GDB..." - tar -xzf ${GDB_PKG} - - pushd ${GDB_NAME} - if [ "$git_patch" = "1" ]; then - git init > /dev/null - git add . > /dev/null - git commit -am "BASE" > /dev/null - git am "${DIR}"/Patches/gdb/*.patch > /dev/null - else - for patch in "${DIR}"/Patches/gdb/*.patch; do - patch -p1 < "${patch}" > /dev/null - done - fi - $MD5SUM "$DIR"/Patches/gdb/*.patch > .patch.applied - popd - fi - patch_md5="$(${MD5SUM} "${DIR}"/Patches/binutils/*.patch)" if [ ! -d "${BINUTILS_NAME}" ] || [ "$(cat ${BINUTILS_NAME}/.patch.applied)" != "${patch_md5}" ]; then @@ -335,43 +275,6 @@ mkdir -p "$DIR/Build/$ARCH" pushd "$DIR/Build/$ARCH" unset PKG_CONFIG_LIBDIR # Just in case - if [ $NEEDS_GDB -eq 1 ]; then - rm -rf gdb - mkdir -p gdb - - pushd gdb - echo "XXX configure gdb" - - - if [ "$SYSTEM_NAME" = "Darwin" ]; then - buildstep "gdb/configure" "$DIR"/Tarballs/$GDB_NAME/configure --prefix="$PREFIX" \ - --target="$TARGET" \ - --with-sysroot="$SYSROOT" \ - --enable-shared \ - --disable-werror \ - --with-libgmp-prefix="$(brew --prefix gmp)" \ - --with-gmp="$(brew --prefix gmp)" \ - --with-isl="$(brew --prefix isl)" \ - --with-mpc="$(brew --prefix libmpc)" \ - --with-mpfr="$(brew --prefix mpfr)" \ - --disable-nls \ - ${TRY_USE_LOCAL_TOOLCHAIN:+"--quiet"} || exit 1 - else - buildstep "gdb/configure" "$DIR"/Tarballs/$GDB_NAME/configure --prefix="$PREFIX" \ - --target="$TARGET" \ - --with-sysroot="$SYSROOT" \ - --enable-shared \ - --disable-werror \ - --disable-nls \ - ${TRY_USE_LOCAL_TOOLCHAIN:+"--quiet"} || exit 1 - fi - - echo "XXX build gdb" - buildstep "gdb/build" "$MAKE" MAKEINFO=true -j "$MAKEJOBS" || exit 1 - buildstep "gdb/install" "$MAKE" MAKEINFO=true install || exit 1 - popd - fi - rm -rf binutils mkdir -p binutils