mirror of https://github.com/upx/upx.git
100 lines
3.5 KiB
Bash
Executable File
100 lines
3.5 KiB
Bash
Executable File
#! /usr/bin/env bash
|
|
## vim:set ts=4 sw=4 et:
|
|
set -e; set -o pipefail
|
|
argv0=$0; argv0abs="$(readlink -fn "$argv0")"; argv0dir="$(dirname "$argv0abs")"
|
|
|
|
# build UPX for 21 targets; must be run inside the container!
|
|
# using a rootless Podman container
|
|
|
|
# simple sanity check that we are indeed running inside the container
|
|
if [[ $UPX_CONTAINER_IMAGE_NAME != upx-cross-compile-* ]]; then
|
|
echo "$argv0: NOTE: please run this script *inside* the container"
|
|
exit 1
|
|
fi
|
|
|
|
# go to upx top-level directory
|
|
cd "$argv0dir/../../.." || exit 1
|
|
pwd
|
|
test -f doc/upx.pod || exit 1 # sanity check
|
|
test -f src/version.h || exit 1 # sanity check
|
|
|
|
function run_config_and_build {
|
|
# requires: AR CC CXX RANLIB
|
|
local toolchain=$1
|
|
local cmake_config_flags build_type bdir
|
|
# cmake flags
|
|
cmake_config_flags=
|
|
case $toolchain in
|
|
# these old architectures do not support sanitize
|
|
alpha-linux-gnu) cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
|
hppa-linux-gnu) cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
|
# avoid sanitize link errors with current MinGW-w64 versions; link libstdc++ statically
|
|
i686-w64-mingw32)
|
|
cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON
|
|
CC="$CC -static"; CXX="$CXX -static" ;;
|
|
x86_64-w64-mingw32)
|
|
cmake_config_flags=-DUPX_CONFIG_DISABLE_SANITIZE=ON
|
|
CC="$CC -static"; CXX="$CXX -static" ;;
|
|
# avoid warnings about arm libstdc++ ABI change in gcc-7
|
|
arm-linux-*) CXX="$CXX -Wno-psabi" ;;
|
|
esac
|
|
if [[ 1 == 1 ]]; then
|
|
# prefer building with Ninja (ninja-build)
|
|
cmake_config_flags="$cmake_config_flags -G Ninja -DUPX_CONFIG_CMAKE_DISABLE_INSTALL=ON"
|
|
fi
|
|
# for all build types
|
|
for build_type in Debug Release; do
|
|
bdir="build/cross-compile-upx-ubuntu2204/$toolchain/${build_type,,}"
|
|
mkdir -p "$bdir"
|
|
# run_config
|
|
if [[ ! -f $bdir/CMakeCache.txt ]]; then
|
|
export CMAKE_REQUIRED_QUIET=OFF
|
|
cmake -S . -B "$bdir" -DCMAKE_BUILD_TYPE=$build_type -DCMAKE_AR="$AR" -DCMAKE_RANLIB="$RANLIB" $cmake_config_flags
|
|
fi
|
|
# run_build
|
|
cmake --build "$bdir" --config $build_type --parallel
|
|
done
|
|
}
|
|
|
|
# see Dockerfile for packages
|
|
for package in \
|
|
g++-aarch64-linux-gnu \
|
|
g++-alpha-linux-gnu \
|
|
g++-arm-linux-gnueabi \
|
|
g++-arm-linux-gnueabihf \
|
|
g++-hppa-linux-gnu \
|
|
g++-i686-linux-gnu \
|
|
g++-m68k-linux-gnu \
|
|
g++-mips-linux-gnu \
|
|
g++-mipsel-linux-gnu \
|
|
g++-mips64-linux-gnuabi64 \
|
|
g++-mips64el-linux-gnuabi64 \
|
|
g++-powerpc-linux-gnu \
|
|
g++-powerpc64-linux-gnu \
|
|
g++-powerpc64le-linux-gnu \
|
|
g++-riscv64-linux-gnu \
|
|
g++-s390x-linux-gnu \
|
|
g++-sh4-linux-gnu \
|
|
g++-sparc64-linux-gnu \
|
|
g++-x86-64-linux-gnux32 \
|
|
g++-mingw-w64-i686 \
|
|
g++-mingw-w64-x86-64
|
|
do
|
|
# setup toolchain and environment variables
|
|
toolchain=$package
|
|
toolchain=${toolchain/-x86-64/-x86_64}
|
|
toolchain=${toolchain/g++-/}
|
|
case $toolchain in
|
|
mingw-w64-i686) toolchain=i686-w64-mingw32 ;;
|
|
mingw-w64-x86_64) toolchain=x86_64-w64-mingw32 ;;
|
|
esac
|
|
echo "========== $toolchain"
|
|
export AR=/usr/bin/${toolchain}-ar
|
|
export CC=/usr/bin/${toolchain}-gcc
|
|
export CXX=/usr/bin/${toolchain}-g++
|
|
export RANLIB=/usr/bin/${toolchain}-ranlib
|
|
ls -l "$AR" "$CC" "$CXX" "$RANLIB"
|
|
run_config_and_build $toolchain
|
|
unset AR CC CXX RANLIB
|
|
done
|