This commit is contained in:
parent
22a109e4b4
commit
d3c80d6d9d
@ -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}"
|
||||
}
|
||||
|
@ -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"
|
||||
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"
|
||||
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
|
||||
|
||||
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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user