diff --git a/src/dropshell-build b/src/dropshell-build index 9c59188..633cc14 100755 --- a/src/dropshell-build +++ b/src/dropshell-build @@ -51,23 +51,21 @@ function centerlittletitle() { } function set_current_arch() { - local FULLARCH="$1" + export FULLARCH="$1" # e.g. aarch64-linux-musl-cross # ARCH=aarch64 # ARCH_OS=linux-musl-cross - # ARCH_FULL_PREFIX=aarch64-linux-musl-cross + # FULLARCH=aarch64-linux-musl-cross # ARCH_SHORT_PREFIX=aarch64-linux-musl # MUSL_PATH=/home/jde/.musl-cross/aarch64-linux-musl-cross # arch should just be x86_64 or aarch64 export ARCH="${FULLARCH%%-*}" export ARCH_OS="${FULLARCH#*-}" - export ARCH_FULL_PREFIX="${FULLARCH}" export ARCH_SHORT_PREFIX="${FULLARCH%-*}" export MUSL_PATH="${MUSL_ROOT_PATH}/${FULLARCH}" echo "ARCH: ${ARCH}" echo "ARCH_OS: ${ARCH_OS}" - echo "ARCH_FULL_PREFIX: ${ARCH_FULL_PREFIX}" echo "ARCH_SHORT_PREFIX: ${ARCH_SHORT_PREFIX}" echo "MUSL_PATH: ${MUSL_PATH}" } diff --git a/src/dropshell-build-install-requirements b/src/dropshell-build-install-requirements index 39d0b9b..310ac47 100755 --- a/src/dropshell-build-install-requirements +++ b/src/dropshell-build-install-requirements @@ -4,6 +4,14 @@ set -euo pipefail SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +# list of toolchains to install +TOOLCHAIN_LIST=( + "aarch64-linux-musl-cross" + "x86_64-linux-musl-cross" + "x86_64-linux-musl-native" +) + + # If the user is not root, use sudo SUDOCMD="" [ "$EUID" -eq 0 ] || SUDOCMD="sudo" @@ -160,97 +168,66 @@ function install_headers() { # OpenSSL for musl cross toolchains #---------------------------------------------------------------------------------------------------------- +toolchain_to_openssl_target() { + case "$1" in + aarch64-linux-musl-*) echo "linux-aarch64" ;; + x86_64-linux-musl-*) echo "linux-x86_64" ;; + *) _die "unsupported toolchain: $1" ;; + esac +} + function install_openssl_musl() { OPENSSL_VERSION=3.5.0 - SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - BUILD_DIR="${SCRIPT_DIR}/build" - MUSL_CROSS_DIR="$HOME/.musl-cross" + PREVDIR="$PWD" + + # set the ARCH, ARCH_OS, ARCH_FULL_PREFIX, ARCH_SHORT_PREFIX, and MUSL_PATH variables + # e.g. aarch64-linux-musl-cross + # ARCH=aarch64 + # ARCH_OS=linux-musl-cross + # ARCH_SHORT_PREFIX=aarch64-linux-musl + # MUSL_PATH=/home/jde/.musl-cross/aarch64-linux-musl-cross + # arch should just be x86_64 or aarch64 + local FULLARCH="${1:-}" + [ -n "$FULLARCH" ] || _die "No toolchain provided" + + local ARCH="${FULLARCH%%-*}" + #local ARCH_OS="${FULLARCH#*-}" + local ARCH_SHORT_PREFIX="${FULLARCH%-*}" + local MUSL_PATH="${MUSL_ROOT_PATH}/${FULLARCH}" + [ -d "$MUSL_PATH" ] || _die "MUSL_PATH does not exist: $MUSL_PATH" + + local BUILD_DIR="${SCRIPT_DIR}/build.$ARCH" mkdir -p "$BUILD_DIR" + # Helper: compare versions (returns 0 if $1 >= $2) version_ge() { [ "$1" = "$2" ] && return 0 [ "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$2" ] } - # Find all installed musl cross toolchains - TOOLCHAINS=() - for tc in "$MUSL_CROSS_DIR"/*-linux-musl-cross; do - [ -d "$tc" ] || continue - arch=$(basename "$tc" | sed 's/-linux-musl-cross//') - TOOLCHAINS+=("$arch") - done - - if [ ${#TOOLCHAINS[@]} -eq 0 ]; then - echo "No musl cross toolchains found in $MUSL_CROSS_DIR. Exiting." - exit 1 - fi - - echo "Found musl cross toolchains: ${TOOLCHAINS[*]}" - - for ARCH in "${TOOLCHAINS[@]}"; do - echo "===============================" - echo "Checking OpenSSL for $ARCH..." - echo "===============================" - if [ "$ARCH" = "x86_64" ]; then - MUSL_PREFIX="$MUSL_CROSS_DIR/x86_64-linux-musl-cross" - OPENSSL_TARGET=linux-x86_64 - elif [ "$ARCH" = "aarch64" ]; then - MUSL_PREFIX="$MUSL_CROSS_DIR/aarch64-linux-musl-cross" - OPENSSL_TARGET=linux-aarch64 - else - # Try to guess OpenSSL target for other musl toolchains - OPENSSL_TARGET="linux-$ARCH" - MUSL_PREFIX="$MUSL_CROSS_DIR/${ARCH}-linux-musl-cross" - fi - SYSROOT="$MUSL_PREFIX/${ARCH}-linux-musl/sysroot" - CC="$MUSL_PREFIX/bin/${ARCH}-linux-musl-gcc" - AR="$MUSL_PREFIX/bin/${ARCH}-linux-musl-ar" - RANLIB="$MUSL_PREFIX/bin/${ARCH}-linux-musl-ranlib" - - DEST_PATH="$SYSROOT/usr/lib/libssl.a" - if [ -f "$DEST_PATH" ]; then - echo "OpenSSL $ARCH is already installed" - continue - fi - - SKIP_BUILD=0 - if [ -f "$SYSROOT/usr/lib/libssl.a" ]; then - # Try to extract version from opensslv.h - OPENSSLV_H="$SYSROOT/usr/include/openssl/opensslv.h" - if [ -f "$OPENSSLV_H" ]; then - INSTALLED_VERSION=$(grep '# *define *OPENSSL_VERSION_TEXT' "$OPENSSLV_H" | sed -E 's/.*OpenSSL ([0-9.]+)[^ ]*.*/\1/') - if [ -n "$INSTALLED_VERSION" ]; then - echo "Found installed OpenSSL version: $INSTALLED_VERSION" - if version_ge "$INSTALLED_VERSION" "$OPENSSL_VERSION"; then - echo "OpenSSL $INSTALLED_VERSION is up-to-date (>= $OPENSSL_VERSION), skipping build for $ARCH." - SKIP_BUILD=1 - else - echo "OpenSSL $INSTALLED_VERSION is older than $OPENSSL_VERSION, will rebuild." - fi - else - echo "Could not determine installed OpenSSL version, will rebuild." - fi - else - echo "No opensslv.h found, will rebuild." - fi - else - echo "No libssl.a found, will rebuild." - fi - - if [ "$SKIP_BUILD" -eq 1 ]; then - echo "Skipping build for $ARCH." - continue - fi + echo "===============================" + echo "Checking OpenSSL for $ARCH..." + echo "===============================" + local OPENSSL_TARGET + OPENSSL_TARGET=$(toolchain_to_openssl_target "$FULLARCH") + local SYSROOT="$MUSL_PATH/${ARCH_SHORT_PREFIX}/sysroot" + local CC="$MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-gcc" + local AR="$MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ar" + local RANLIB="$MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ranlib" + DEST_PATH="$SYSROOT/usr/lib/libssl.a" + if [ -f "$DEST_PATH" ]; then + echo "OpenSSL $ARCH is already installed" + else cd "$BUILD_DIR" if [ ! -d "openssl-${OPENSSL_VERSION}" ]; then if [ ! -f "openssl-${OPENSSL_VERSION}.tar.gz" ]; then - wget "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" + wget "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" || _die "Failed to download openssl-${OPENSSL_VERSION}.tar.gz" fi - tar xf "openssl-${OPENSSL_VERSION}.tar.gz" + tar xf "openssl-${OPENSSL_VERSION}.tar.gz" || _die "Failed to extract openssl-${OPENSSL_VERSION}.tar.gz" fi - cd "openssl-${OPENSSL_VERSION}" + cd "openssl-${OPENSSL_VERSION}" || _die "Failed to cd to openssl-${OPENSSL_VERSION}" echo "----------------------------------------------" echo "Configuring for $ARCH with sysroot $SYSROOT..." @@ -259,13 +236,12 @@ function install_openssl_musl() { make -j"$(nproc)" echo "Installing to $SYSROOT/usr ..." make install_sw - cd "$BUILD_DIR" + echo "Done for $ARCH." echo - # Remove build dir for next arch to avoid cross contamination - rm -rf "openssl-${OPENSSL_VERSION}" - tar xf "openssl-${OPENSSL_VERSION}.tar.gz" - done + fi + + cd "$PREVDIR" echo "OpenSSL built and installed for all detected musl toolchains." } @@ -319,14 +295,11 @@ function install_musl() { TMPDIR=$(mktemp -d) trap 'rm -rf "$TMPDIR"' EXIT - TOOLCHAIN_LIST=( - "aarch64-linux-musl-cross" - "x86_64-linux-musl-cross" - ) - for TOOLCHAIN in "${TOOLCHAIN_LIST[@]}"; do install_musl_cross "$TOOLCHAIN" check_path "$TOOLCHAIN" + + install_openssl_musl "$TOOLCHAIN" done # Clean up @@ -355,8 +328,6 @@ function main() { install_musl - install_openssl_musl - output_version echo "Done"