From 006cc201b1d3445530837f7e7cb4c1f0891c70d7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 2 Jun 2025 22:47:48 +1200 Subject: [PATCH] 'Generic Commit' --- Dockerfile | 40 +++-- src/dropshell-build | 60 +++++-- src/dropshell-build-install-requirements | 212 +++++++++-------------- 3 files changed, 150 insertions(+), 162 deletions(-) diff --git a/Dockerfile b/Dockerfile index e161a8e..090ae6e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,12 @@ FROM ubuntu:latest -RUN apt-get update && apt-get install -y \ - build-essential cmake git wget tar curl ninja-build mold nodejs npm perl jq ccache nlohmann-json3-dev \ - ca-certificates \ - && rm -rf /var/lib/apt/lists/* - -RUN echo "deb http://deb.debian.org/debian testing main" | tee /etc/apt/sources.list.d/testing-temp.list - -RUN apt-get update && apt-get install -f && apt-get -t testing install -y upx-ucl && \ - rm -rf /var/lib/apt/lists/* && \ - rm /etc/apt/sources.list.d/testing-temp.list && \ - rm -rf /var/lib/apt/lists/* - -RUN curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc -RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null -RUN apt-get update && \ - apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && \ - rm -rf /var/lib/apt/lists/* RUN mkdir -p "$HOME/.musl-cross" +RUN apt-get update && apt-get install -y \ + wget tar curl bash git && \ + rm -rf /var/lib/apt/lists/* + RUN wget -nc -O "$HOME/.musl-cross/x86_64-linux-musl-cross.tgz" "https://getbin.xyz/x86_64-linux-musl-cross.tgz:latest" && \ tar -C "$HOME/.musl-cross" -xvf "$HOME/.musl-cross/x86_64-linux-musl-cross.tgz" && \ rm "$HOME/.musl-cross/x86_64-linux-musl-cross.tgz" @@ -32,6 +19,25 @@ RUN wget -nc -O "$HOME/.musl-cross/aarch64-linux-musl-cross.tgz" "https://getbin tar -C "$HOME/.musl-cross" -xvf "$HOME/.musl-cross/aarch64-linux-musl-cross.tgz" && \ rm "$HOME/.musl-cross/aarch64-linux-musl-cross.tgz" + + +RUN apt-get update && apt-get install -y \ + build-essential cmake ninja-build mold nodejs npm perl jq ccache nlohmann-json3-dev \ + ca-certificates upx-ucl autoconf automake libtool gawk \ + && rm -rf /var/lib/apt/lists/* + +RUN install -m 0755 -d /etc/apt/keyrings && \ + curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && \ + chmod a+r /etc/apt/keyrings/docker.asc && \ + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ + tee /etc/apt/sources.list.d/docker.list > /dev/null && \ + apt-get update && \ + apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && \ + rm -rf /var/lib/apt/lists/* + + COPY --chmod=0755 ./src/* /usr/local/bin/ RUN /usr/local/bin/dropshell-build-install-requirements diff --git a/src/dropshell-build b/src/dropshell-build index 350db43..a8994d0 100755 --- a/src/dropshell-build +++ b/src/dropshell-build @@ -59,19 +59,54 @@ function set_current_arch() { # ARCH_SHORT_PREFIX=aarch64-linux-musl # MUSL_PATH=/home/jde/.musl-cr oss/aarch64-linux-musl-cross # arch should just be x86_64 or aarch64 + [ -n "$FULLARCH" ] || _die "No toolchain provided" + export ARCH="${FULLARCH%%-*}" export ARCH_OS="${FULLARCH#*-}" export ARCH_SHORT_PREFIX="${FULLARCH%-*}" export ARCH_MUSL_PATH="${MUSL_ROOT_PATH}/${FULLARCH}" export ARCH_SYSROOT="${ARCH_MUSL_PATH}/${ARCH_SHORT_PREFIX}/sysroot" - echo "ARCH: ${ARCH}" - echo "ARCH_OS: ${ARCH_OS}" + export LIBPATH="$ARCH_SYSROOT/usr/lib" + [ -d "$LIBPATH" ] || export LIBPATH="$ARCH_SYSROOT/usr/lib64" + + JOBS=$(nproc) # Set JOBS to the number of available CPU cores + + + echo "ARCH: ${ARCH}" + echo "ARCH_OS: ${ARCH_OS}" echo "ARCH_SHORT_PREFIX: ${ARCH_SHORT_PREFIX}" - echo "ARCH_MUSL_PATH: ${ARCH_MUSL_PATH}" - echo "ARCH_SYSROOT: ${ARCH_SYSROOT}" + echo "ARCH_MUSL_PATH: ${ARCH_MUSL_PATH}" + echo "ARCH_SYSROOT: ${ARCH_SYSROOT}" + echo "LIBPATH: ${LIBPATH}" + + # Set cross-compiler and sysroot + export CC="$ARCH_MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-gcc" + [ -f "$CC" ] || export CC="$ARCH_MUSL_PATH/bin/gcc" + export CXX="${ARCH_MUSL_PATH}/bin/${ARCH_SHORT_PREFIX}-g++" + [ -f "$CXX" ] || export CXX="$ARCH_MUSL_PATH/bin/g++" + export AR="$ARCH_MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ar" + [ -f "$AR" ] || export AR="$ARCH_MUSL_PATH/bin/ar" + export RANLIB="$ARCH_MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ranlib" + [ -f "$RANLIB" ] || export RANLIB="$ARCH_MUSL_PATH/bin/ranlib" + + echo "CC: ${CC}" + echo "CXX: ${CXX}" + echo "AR: ${AR}" + echo "RANLIB: ${RANLIB}" + + export CFLAGS="--sysroot=$ARCH_SYSROOT -I$ARCH_SYSROOT/usr/include" + export CXXFLAGS="--sysroot=$ARCH_SYSROOT -I$ARCH_SYSROOT/usr/include" + + export CMAKE_EXE_LINKER_FLAGS="-fuse-ld=mold" + export CMAKE_MODULE_LINKER_FLAGS="-fuse-ld=mold" + export CMAKE_SHARED_LINKER_FLAGS="-fuse-ld=mold" + + export LDFLAGS="--sysroot=$ARCH_SYSROOT" + export MAKEFLAGS="-j${JOBS}" } + OLD_PWD="$PWD" trap 'cd "${OLD_PWD}"' EXIT @@ -101,8 +136,6 @@ function build_arch() { local ARCH_BUILD_DIR="${CMAKE_DIR}/build/build.$ARCH" local OUTPUT_DIR="${CMAKE_DIR}/output" - local JOBS; - JOBS=$(nproc) # Set JOBS to the number of available CPU cores cd "${CMAKE_DIR}" || exit 1 mkdir -p "${ARCH_BUILD_DIR}" @@ -120,19 +153,10 @@ function build_arch() { CMAKE_BUILD_TYPE="Debug" fi - export CC="${ARCH_MUSL_PATH}/bin/${ARCH_SHORT_PREFIX}-gcc" - export CXX="${ARCH_MUSL_PATH}/bin/${ARCH_SHORT_PREFIX}-g++" export SYSROOT="${ARCH_SYSROOT}" - export OPENSSL_ROOT_DIR="${SYSROOT}/usr" - export CFLAGS="--sysroot=$SYSROOT -I$SYSROOT/usr/include" - export CXXFLAGS="--sysroot=$SYSROOT -I$SYSROOT/usr/include" - export LDFLAGS="--sysroot=$SYSROOT" - export MAKEFLAGS="-j${JOBS}" export CCACHE_DIR="${ARCH_BUILD_DIR}/ccache" - export CMAKE_EXE_LINKER_FLAGS="-fuse-ld=mold" - export CMAKE_MODULE_LINKER_FLAGS="-fuse-ld=mold" - export CMAKE_SHARED_LINKER_FLAGS="-fuse-ld=mold" + # if [ -d "${ARCH_SYSROOT}/usr/lib64" ]; then # export OPENSSL_LIBDIR="${ARCH_SYSROOT}/usr/lib64" @@ -149,8 +173,8 @@ function build_arch() { -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_LINKER=mold \ - -DCMAKE_C_COMPILER_TARGET="${ARCH}-linux-musl" \ - -DCMAKE_CXX_COMPILER_TARGET="${ARCH}-linux-musl" \ + -DCMAKE_C_COMPILER_TARGET="${ARCH_SHORT_PREFIX}" \ + -DCMAKE_CXX_COMPILER_TARGET="${ARCH_SHORT_PREFIX}" \ -DCMAKE_C_FLAGS="${CFLAGS}" \ -DCMAKE_CXX_FLAGS="${CXXFLAGS}" \ -DCMAKE_FIND_ROOT_PATH="${ARCH_SYSROOT}" \ diff --git a/src/dropshell-build-install-requirements b/src/dropshell-build-install-requirements index b4b2fdc..6503ec2 100755 --- a/src/dropshell-build-install-requirements +++ b/src/dropshell-build-install-requirements @@ -67,9 +67,8 @@ is_package_installed() { dpkg -l "$1" fi } -function install_packages() { +function check_packages() { local PACKAGES - local HAVE_UPDATED=0 # Detect distribution if [ -f /etc/os-release ]; then @@ -89,36 +88,7 @@ function install_packages() { # Common packages for both Ubuntu and Debian PACKAGES="build-essential cmake git wget tar curl ninja-build \ mold nodejs npm perl jq ccache upx-ucl nlohmann-json3-dev \ - sed gawk autoconf automake autotools-dev" - INSTALLCMD="apt-get install -y" - UPDATECMD="apt-get update" - ;; - "Debian GNU/Linux") - PACKAGES="build-essential cmake git wget tar curl ninja-build \ - mold nodejs npm perl jq ccache upx-ucl nlohmann-json3-dev \ - sed gawk autoconf automake autotools-dev" - INSTALLCMD="apt-get install -y" - UPDATECMD="apt-get update" - - # special case for debian 12 - if ! is_package_installed "upx-ucl"; then - # get from testing. - # Add testing repo temporarily - echo "deb http://deb.debian.org/debian testing main" | ${SUDOCMD:-} tee /etc/apt/sources.list.d/testing-temp.list - # Update package lists - ${SUDOCMD:-} bash -c "apt-get update" - ${SUDOCMD:-} bash -c "apt-get -t testing install -y upx-ucl" - ${SUDOCMD:-} bash -c "rm /etc/apt/sources.list.d/testing-temp.list" - ${SUDOCMD:-} bash -c "apt-get update" - HAVE_UPDATED=1 - fi - ;; - "Alpine Linux") - PACKAGES="build-base cmake git wget tar curl ninja \ - mold nodejs npm linux-headers perl jq ccache upx nlohmann-json-dev \ - sed gawk autoconf automake autotools-dev" - INSTALLCMD="apk add --no-cache" - UPDATECMD="apk update" + sed gawk autoconf automake libtool autotools-dev" ;; *) print_error "Unsupported distribution: $OS" @@ -130,19 +100,8 @@ function install_packages() { print_status "Checking and installing required packages..." for pkg in $PACKAGES; do if ! is_package_installed "$pkg"; then - print_status "Installing $pkg..." - - # Update package lists - if [ "$HAVE_UPDATED" -eq 0 ]; then - print_status "Updating package lists..." - ${SUDOCMD:-} bash -c "${UPDATECMD}" - HAVE_UPDATED=1 - fi - - if ! bash -c "${SUDOCMD:-} ${INSTALLCMD} $pkg"; then - print_error "Failed to install $pkg" - exit 1 - fi + print_error "Package $pkg is not installed" + exit 1 else print_status "$pkg is already installed" fi @@ -173,35 +132,72 @@ function install_packages() { # unwind for musl cross toolchains #---------------------------------------------------------------------------------------------------------- +function set_current_arch() { + export FULLARCH="$1" + # e.g. aarch64-linux-musl-cross + # ARCH=aarch64 + # ARCH_OS=linux-musl-cross + # FULLARCH=aarch64-linux-musl-cross + # ARCH_SHORT_PREFIX=aarch64-linux-musl + # MUSL_PATH=/home/jde/.musl-cr oss/aarch64-linux-musl-cross + # arch should just be x86_64 or aarch64 + [ -n "$FULLARCH" ] || _die "No toolchain provided" + + export MUSL_ROOT_PATH="${USER_HOME}/.musl-cross" + export ARCH="${FULLARCH%%-*}" + export ARCH_OS="${FULLARCH#*-}" + export ARCH_SHORT_PREFIX="${FULLARCH%-*}" + export ARCH_MUSL_PATH="${MUSL_ROOT_PATH}/${FULLARCH}" + export ARCH_SYSROOT="${ARCH_MUSL_PATH}/${ARCH_SHORT_PREFIX}/sysroot" + + export LIBPATH="$ARCH_SYSROOT/usr/lib" + [ -d "$LIBPATH" ] || export LIBPATH="$ARCH_SYSROOT/usr/lib64" + + echo "ARCH: ${ARCH}" + echo "ARCH_OS: ${ARCH_OS}" + echo "ARCH_SHORT_PREFIX: ${ARCH_SHORT_PREFIX}" + echo "ARCH_MUSL_PATH: ${ARCH_MUSL_PATH}" + echo "ARCH_SYSROOT: ${ARCH_SYSROOT}" + echo "LIBPATH: ${LIBPATH}" + + JOBS=$(nproc) # Set JOBS to the number of available CPU cores + + # Set cross-compiler and sysroot + export CC="$ARCH_MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-gcc" + [ -f "$CC" ] || export CC="$ARCH_MUSL_PATH/bin/gcc" + export CXX="${ARCH_MUSL_PATH}/bin/${ARCH_SHORT_PREFIX}-g++" + [ -f "$CXX" ] || export CXX="$ARCH_MUSL_PATH/bin/g++" + export AR="$ARCH_MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ar" + [ -f "$AR" ] || export AR="$ARCH_MUSL_PATH/bin/ar" + export RANLIB="$ARCH_MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ranlib" + [ -f "$RANLIB" ] || export RANLIB="$ARCH_MUSL_PATH/bin/ranlib" + + echo "CC: ${CC}" + echo "CXX: ${CXX}" + echo "AR: ${AR}" + echo "RANLIB: ${RANLIB}" + + export CFLAGS="--sysroot=$ARCH_SYSROOT -I$ARCH_SYSROOT/usr/include" + export CXXFLAGS="--sysroot=$ARCH_SYSROOT -I$ARCH_SYSROOT/usr/include" + + export CMAKE_EXE_LINKER_FLAGS="-fuse-ld=mold" + export CMAKE_MODULE_LINKER_FLAGS="-fuse-ld=mold" + export CMAKE_SHARED_LINKER_FLAGS="-fuse-ld=mold" + + export LDFLAGS="--sysroot=$ARCH_SYSROOT" + export MAKEFLAGS="-j${JOBS}" +} + function install_unwind_musl() { - local FULLARCH="$1" - local ARCH="${FULLARCH%%-*}" - local ARCH_SHORT_PREFIX="${FULLARCH%-*}" - local MUSL_PATH="${INSTALL_DIR}/${FULLARCH}" - [ -d "$MUSL_PATH" ] || _die "MUSL_PATH does not exist: $MUSL_PATH" + set_current_arch "$1" + + [ -d "$ARCH_MUSL_PATH" ] || _die "MUSL_PATH does not exist: $ARCH_MUSL_PATH" local BUILD_DIR="${SCRIPT_DIR}/build.$ARCH" PREVDIR="$PWD" - rm -rf "$BUILD_DIR" - mkdir -p "$BUILD_DIR" - cd "$BUILD_DIR" + rm -rf "$BUILD_DIR" && mkdir -p "$BUILD_DIR" && cd "$BUILD_DIR" - local SYSROOT="$MUSL_PATH/${ARCH_SHORT_PREFIX}/sysroot" - - LIBPATH="$MUSL_PATH/${ARCH_SHORT_PREFIX}/sysroot/usr/lib" - [ -d "$LIBPATH" ] || LIBPATH="$MUSL_PATH/${ARCH_SHORT_PREFIX}/sysroot/usr/lib64" - if [ -f "$LIBPATH/libunwind.a" ]; then - echo "Unwind $ARCH is already installed" - return - fi - - # Set cross-compiler and sysroot - local CC="$MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-gcc" - [ -f "$CC" ] || CC="$MUSL_PATH/bin/gcc" - local AR="$MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ar" - [ -f "$AR" ] || AR="$MUSL_PATH/bin/ar" - local RANLIB="$MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ranlib" - [ -f "$RANLIB" ] || RANLIB="$MUSL_PATH/bin/ranlib" + [ ! -f "$LIBPATH/libunwind.a" ] || echo "Unwind $ARCH is already installed" && return git clone https://github.com/libunwind/libunwind.git cd libunwind @@ -210,13 +206,13 @@ function install_unwind_musl() { # Configure for cross-compiling CC="$CC" AR="$AR" RANLIB="$RANLIB" ./configure \ --host="$ARCH_SHORT_PREFIX" \ - --prefix="$SYSROOT/usr" \ + --prefix="$ARCH_SYSROOT/usr" \ --enable-static \ --disable-shared \ --disable-minidebuginfo \ --disable-zlibdebuginfo - make -j + make -j"$JOBS" ${SUDOCMD:-} make install cd "$PREVDIR" @@ -237,34 +233,16 @@ toolchain_to_openssl_target() { function install_openssl_musl() { OPENSSL_VERSION=3.5.0 + set_current_arch "${1:-}" 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" + [ -d "$ARCH_MUSL_PATH" ] || _die "MUSL_PATH does not exist: $ARCH_MUSL_PATH" - local ARCH="${FULLARCH%%-*}" - #local ARCH_OS="${FULLARCH#*-}" - local ARCH_SHORT_PREFIX="${FULLARCH%-*}" - local MUSL_PATH="${INSTALL_DIR}/${FULLARCH}" - [ -d "$MUSL_PATH" ] || _die "MUSL_PATH does not exist: $MUSL_PATH" - - LIBPATH="$MUSL_PATH/${ARCH_SHORT_PREFIX}/sysroot/usr/lib" - [ -d "$LIBPATH" ] || LIBPATH="$MUSL_PATH/${ARCH_SHORT_PREFIX}/sysroot/usr/lib64" - if [ -f "$LIBPATH/libssl.a" ]; then - echo "OpenSSL $ARCH is already installed" - return - fi + [ ! -f "$LIBPATH/libssl.a" ] || echo "OpenSSL $ARCH is already installed" && return local BUILD_DIR="${SCRIPT_DIR}/build.$ARCH" - mkdir -p "$BUILD_DIR" + rm -rf "$BUILD_DIR" && mkdir -p "$BUILD_DIR" && cd "$BUILD_DIR" # Helper: compare versions (returns 0 if $1 >= $2) version_ge() { @@ -275,45 +253,25 @@ function install_openssl_musl() { 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" - [ -f "$CC" ] || CC="$MUSL_PATH/bin/gcc" - local AR="$MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ar" - [ -f "$AR" ] || AR="$MUSL_PATH/bin/ar" - local RANLIB="$MUSL_PATH/bin/${ARCH_SHORT_PREFIX}-ranlib" - [ -f "$RANLIB" ] || RANLIB="$MUSL_PATH/bin/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" || _die "Failed to download openssl-${OPENSSL_VERSION}.tar.gz" - fi - tar xf "openssl-${OPENSSL_VERSION}.tar.gz" || _die "Failed to extract openssl-${OPENSSL_VERSION}.tar.gz" - fi - cd "openssl-${OPENSSL_VERSION}" || _die "Failed to cd to openssl-${OPENSSL_VERSION}" + wget "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" || _die "Failed to download openssl-${OPENSSL_VERSION}.tar.gz" + tar xf "openssl-${OPENSSL_VERSION}.tar.gz" || _die "Failed to extract openssl-${OPENSSL_VERSION}.tar.gz" + cd "openssl-${OPENSSL_VERSION}" || _die "Failed to cd to openssl-${OPENSSL_VERSION}" - echo "----------------------------------------------" - echo "Configuring for $ARCH with sysroot $SYSROOT..." - CC="$CC" AR="$AR" RANLIB="$RANLIB" ./Configure "$OPENSSL_TARGET" no-shared --prefix="$SYSROOT/usr" - echo "Building..." - make -j"$(nproc)" - echo "Installing to $SYSROOT/usr ..." - make install_sw + echo "----------------------------------------------" + echo "Configuring for $ARCH with sysroot $SYSROOT..." + CC="$CC" AR="$AR" RANLIB="$RANLIB" ./Configure "$OPENSSL_TARGET" no-shared --prefix="$SYSROOT/usr" + echo "Building..." + make -j"$JOBS" + echo "Installing to $SYSROOT/usr ..." + ${SUDOCMD:-} make install_sw - echo "Done for $ARCH." - echo - fi - - rm -rf "$BUILD_DIR" + echo "Done for $ARCH." + echo cd "$PREVDIR" - + rm -rf "$BUILD_DIR" echo "OpenSSL built and installed for $FULLARCH" } @@ -394,7 +352,7 @@ function output_version() { function main() { - install_packages + check_packages install_musl