276 lines
7.1 KiB
Bash
Executable File
276 lines
7.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euxo pipefail
|
|
|
|
function fn_print_help() {
|
|
cat <<EOF
|
|
Usage:
|
|
packages/msys/build-xp.sh -p|--profile <profile> [-c|--clean] [-nd|--no-deps] [-t|--target-dir <dir>]
|
|
Options:
|
|
-h, --help Display this information.
|
|
-p, --profile <profile> MinGW Lite profile.
|
|
MUST be used before other options.
|
|
-c, --clean Clean build and package directories.
|
|
--mingw Alias for --mingw32 (x86 app) or --mingw64 (x64 app).
|
|
--mingw32 Build mingw32 integrated compiler.
|
|
--mingw64 Build mingw64 integrated compiler.
|
|
EOF
|
|
}
|
|
|
|
source version.inc
|
|
if [[ -n "$APP_VERSION_SUFFIX" ]]; then
|
|
APP_VERSION="$APP_VERSION$APP_VERSION_SUFFIX"
|
|
fi
|
|
|
|
if [[ $# -lt 2 || ($1 != "-p" && $1 != "--profile") ]]; then
|
|
echo "Missing profile argument."
|
|
exit 1
|
|
fi
|
|
|
|
PROFILE=$2
|
|
shift 2
|
|
|
|
case "${PROFILE}" in
|
|
64-ucrt|64-msvcrt)
|
|
NSIS_ARCH=x64
|
|
TARGET=x86_64-w64-mingw32
|
|
PACKAGE_BASENAME="redpanda-cpp-${APP_VERSION}-ws2003_x64"
|
|
;;
|
|
32-ucrt)
|
|
NSIS_ARCH=x86
|
|
TARGET=i686-w64-mingw32
|
|
PACKAGE_BASENAME="redpanda-cpp-${APP_VERSION}-winxp_x86"
|
|
;;
|
|
32-msvcrt)
|
|
NSIS_ARCH=x86
|
|
TARGET=i686-w64-mingw32
|
|
PACKAGE_BASENAME="redpanda-cpp-${APP_VERSION}-win2000_x86"
|
|
;;
|
|
*)
|
|
echo "Invalid profile: ${PROFILE}"
|
|
echo "Available profiles: 64-ucrt, 64-msvcrt, 32-ucrt, 32-msvcrt"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
CLEAN=0
|
|
compilers=()
|
|
COMPILER_MINGW32=0
|
|
COMPILER_MINGW64=0
|
|
while [[ "$#" -gt 0 ]]; do
|
|
case $1 in
|
|
-h|--help)
|
|
fn_print_help
|
|
exit 0
|
|
;;
|
|
-c|--clean)
|
|
CLEAN=1
|
|
shift
|
|
;;
|
|
--mingw)
|
|
case "$PROFILE" in
|
|
64-ucrt|64-msvcrt)
|
|
compilers+=("mingw64")
|
|
COMPILER_MINGW64=1
|
|
shift
|
|
;;
|
|
32-ucrt|32-msvcrt)
|
|
compilers+=("mingw32")
|
|
COMPILER_MINGW32=1
|
|
shift
|
|
;;
|
|
esac
|
|
;;
|
|
--mingw32)
|
|
compilers+=("mingw32")
|
|
COMPILER_MINGW32=1
|
|
shift
|
|
;;
|
|
--mingw64)
|
|
compilers+=("mingw64")
|
|
COMPILER_MINGW64=1
|
|
shift
|
|
;;
|
|
*)
|
|
echo "Unknown argument: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
QT_VERSION=5.15.15+redpanda0
|
|
MINGW_LITE_BRANCH=14
|
|
|
|
ASTYLE_VERSION_TAG="3.6.2"
|
|
TARGET_DIR="$PWD/dist"
|
|
BUILD_DIR="/tmp/build/redpanda-xp-$PROFILE-build"
|
|
ASTYLE_BUILD_DIR="$BUILD_DIR/astyle"
|
|
PACKAGE_DIR="/tmp/build/redpanda-xp-$PROFILE-pkg"
|
|
SOURCE_DIR="$PWD"
|
|
ASSETS_DIR="$PWD/assets"
|
|
|
|
QT_ARCHIVE="x-qt-$QT_VERSION-$PROFILE.tar.zst"
|
|
QT_DIR="/opt/x-mingw$PROFILE-$MINGW_LITE_BRANCH"
|
|
|
|
REDPANDA_MINGW_RELEASE="11.5.0-r0"
|
|
MINGW32_ARCHIVE="mingw32-$REDPANDA_MINGW_RELEASE.7z"
|
|
MINGW32_COMPILER_NAME="MinGW-w64 i686 GCC"
|
|
MINGW32_PACKAGE_SUFFIX="mingw32"
|
|
|
|
MINGW64_ARCHIVE="mingw64-$REDPANDA_MINGW_RELEASE.7z"
|
|
MINGW64_COMPILER_NAME="MinGW-w64 x86_64 GCC"
|
|
MINGW64_PACKAGE_SUFFIX="mingw64"
|
|
|
|
if [[ ${#compilers[@]} -eq 0 ]]; then
|
|
PACKAGE_BASENAME="$PACKAGE_BASENAME-none"
|
|
else
|
|
[[ "$COMPILER_MINGW32" -eq 1 ]] && PACKAGE_BASENAME="$PACKAGE_BASENAME-$MINGW32_PACKAGE_SUFFIX"
|
|
[[ "$COMPILER_MINGW64" -eq 1 ]] && PACKAGE_BASENAME="$PACKAGE_BASENAME-$MINGW64_PACKAGE_SUFFIX"
|
|
fi
|
|
|
|
function fn_print_progress() {
|
|
echo -e "\e[1;32;44m$1\e[0m"
|
|
}
|
|
|
|
## prepare dirs
|
|
|
|
if [[ "$CLEAN" -eq 1 ]]; then
|
|
rm -rf "$BUILD_DIR"
|
|
rm -rf "$PACKAGE_DIR"
|
|
fi
|
|
mkdir -p "$BUILD_DIR" "$PACKAGE_DIR" "$TARGET_DIR" "$ASTYLE_BUILD_DIR" "$ASSETS_DIR"
|
|
|
|
## install deps
|
|
|
|
if [[ -v MIRROR && -n $MIRROR ]]
|
|
then
|
|
sed -i "s|archive.ubuntu.com|$MIRROR|; s|security.ubuntu.com|$MIRROR|" /etc/apt/sources.list.d/ubuntu.sources
|
|
fi
|
|
|
|
apt update
|
|
env DEBIAN_FRONTEND=noninteractive \
|
|
apt install -y --no-install-recommends \
|
|
7zip ca-certificates cmake curl git make nsis qttools5-dev-tools zstd
|
|
|
|
if [[ ! -f "$ASSETS_DIR/$QT_ARCHIVE" ]]; then
|
|
fn_print_progress "Downloading Qt"
|
|
curl -L "https://github.com/redpanda-cpp/qtbase-xp/releases/download/$QT_VERSION/$QT_ARCHIVE" -o "$ASSETS_DIR/$QT_ARCHIVE"
|
|
fi
|
|
zstdcat "$ASSETS_DIR/$QT_ARCHIVE" | tar -x -C /
|
|
|
|
export PATH="$QT_DIR/bin:$PATH"
|
|
|
|
## prepare assets
|
|
|
|
fn_print_progress "Updating astyle repo..."
|
|
if [[ ! -d "$ASSETS_DIR/astyle" ]]; then
|
|
git clone --bare "https://gitlab.com/saalen/astyle" "$ASSETS_DIR/astyle"
|
|
fi
|
|
pushd "$ASSETS_DIR/astyle"
|
|
if [[ -z "$(git tag -l "$ASTYLE_VERSION_TAG")" ]]; then
|
|
git fetch --all --tags
|
|
fi
|
|
popd
|
|
|
|
if [[ "$COMPILER_MINGW32" -eq 1 && ! -f "$ASSETS_DIR/$MINGW32_ARCHIVE" ]]; then
|
|
fn_print_progress "Downloading MinGW32..."
|
|
curl -L "https://github.com/redpanda-cpp/toolchain-win32-mingw-xp/releases/download/$REDPANDA_MINGW_RELEASE/$MINGW32_ARCHIVE" -o "$ASSETS_DIR/$MINGW32_ARCHIVE"
|
|
fi
|
|
if [[ "$COMPILER_MINGW64" -eq 1 && ! -f "$ASSETS_DIR/$MINGW64_ARCHIVE" ]]; then
|
|
fn_print_progress "Downloading MinGW64..."
|
|
curl -L "https://github.com/redpanda-cpp/toolchain-win32-mingw-xp/releases/download/$REDPANDA_MINGW_RELEASE/$MINGW64_ARCHIVE" -o "$ASSETS_DIR/$MINGW64_ARCHIVE"
|
|
fi
|
|
|
|
## build
|
|
|
|
fn_print_progress "Building astyle..."
|
|
pushd "$ASSETS_DIR/astyle"
|
|
git --work-tree="$ASTYLE_BUILD_DIR" checkout -f "$ASTYLE_VERSION_TAG"
|
|
popd
|
|
|
|
pushd "$ASTYLE_BUILD_DIR"
|
|
sed -i "s|<Windows.h>|<windows.h>|" AStyle/src/*.cpp
|
|
|
|
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_NAME="Windows" -DCMAKE_CC_COMPILER="$TARGET-gcc" -DCMAKE_CXX_COMPILER="$TARGET-g++" -DCMAKE_EXE_LINKER_FLAGS="-static"
|
|
make -j$(nproc)
|
|
cp AStyle/AStyle.exe "$PACKAGE_DIR/astyle.exe"
|
|
popd
|
|
|
|
fn_print_progress "Building..."
|
|
pushd "$BUILD_DIR"
|
|
qmake_flags=()
|
|
if [[ "$NSIS_ARCH" == x64 ]]; then
|
|
qmake_flags+=("X86_64=ON")
|
|
fi
|
|
qmake PREFIX="$PACKAGE_DIR" "${qmake_flags[@]}" -o Makefile "$SOURCE_DIR/Red_Panda_CPP.pro" -r
|
|
make -j$(nproc)
|
|
make install
|
|
popd
|
|
|
|
## prepare packaging resources
|
|
|
|
pushd "$PACKAGE_DIR"
|
|
|
|
cp "$SOURCE_DIR/platform/windows/qt.conf" .
|
|
|
|
cp "$SOURCE_DIR"/platform/windows/installer-scripts/{lang.nsh,utils.nsh,redpanda.nsi} .
|
|
popd
|
|
|
|
## make package
|
|
|
|
pushd "$PACKAGE_DIR"
|
|
SETUP_NAME="$PACKAGE_BASENAME.exe"
|
|
PORTABLE_NAME="$PACKAGE_BASENAME.7z"
|
|
|
|
fn_print_progress "Making installer..."
|
|
|
|
nsis_flags=(
|
|
-DAPP_VERSION="$APP_VERSION"
|
|
-DARCH="$NSIS_ARCH"
|
|
-DFINALNAME="$SETUP_NAME"
|
|
-DMINGW32_COMPILER_NAME="$MINGW32_COMPILER_NAME"
|
|
-DMINGW64_COMPILER_NAME="$MINGW64_COMPILER_NAME"
|
|
)
|
|
case "$PROFILE" in
|
|
64-ucrt|64-msvcrt)
|
|
nsis_flags+=(
|
|
-DREQUIRED_WINDOWS_BUILD=3790
|
|
-DREQUIRED_WINDOWS_NAME="Windows Server 2003"
|
|
)
|
|
;;
|
|
32-ucrt)
|
|
nsis_flags+=(
|
|
-DREQUIRED_WINDOWS_BUILD=2600
|
|
-DREQUIRED_WINDOWS_NAME="Windows XP"
|
|
)
|
|
;;
|
|
32-msvcrt)
|
|
nsis_flags+=(
|
|
-DREQUIRED_WINDOWS_BUILD=2195
|
|
-DREQUIRED_WINDOWS_NAME="Windows 2000"
|
|
)
|
|
;;
|
|
esac
|
|
if [[ "$COMPILER_MINGW32" -eq 1 ]]; then
|
|
nsis_flags+=(-DHAVE_MINGW32)
|
|
if [[ ! -d mingw32 ]]; then
|
|
7z x "$ASSETS_DIR/$MINGW32_ARCHIVE" -o"$PACKAGE_DIR"
|
|
fi
|
|
fi
|
|
if [[ "$COMPILER_MINGW64" -eq 1 ]]; then
|
|
nsis_flags+=(-DHAVE_MINGW64)
|
|
if [[ ! -d mingw64 ]]; then
|
|
7z x "$ASSETS_DIR/$MINGW64_ARCHIVE" -o"$PACKAGE_DIR"
|
|
fi
|
|
fi
|
|
makensis "${nsis_flags[@]}" redpanda.nsi
|
|
|
|
fn_print_progress "Making Portable Package..."
|
|
7z x "$SETUP_NAME" -o"RedPanda-CPP" -xr'!$PLUGINSDIR' -x"!uninstall.exe"
|
|
7z a -mmt -mx9 -ms=on -mqs=on -mf=BCJ2 "$PORTABLE_NAME" RedPanda-CPP
|
|
rm -rf RedPanda-CPP
|
|
|
|
mv "$SETUP_NAME" "$TARGET_DIR"
|
|
mv "$PORTABLE_NAME" "$TARGET_DIR"
|
|
popd
|