Skip to content

Commit d3cb636

Browse files
committed
Update new-build-mingw.sh
1 parent fe8b1ba commit d3cb636

File tree

1 file changed

+59
-65
lines changed

1 file changed

+59
-65
lines changed

packages/msys/new-build-mingw.sh

Lines changed: 59 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ set -euxo pipefail
44

55
ASTYLE_VERSION_TAG="3.6.9"
66

7-
# Print help information
87
function fn_print_help() {
98
echo " Usage:
109
packages/msys/build-mingw.sh [-m|--msystem <MSYSTEM>] [-c|--clean] [-nd|--no-deps] [-t|--target-dir <dir>]
@@ -19,22 +18,20 @@ function fn_print_help() {
1918
--mingw64 Build mingw64 integrated compiler.
2019
--gcc-linux-x86-64 Build x86_64-linux-gnu integrated compiler.
2120
--gcc-linux-aarch64 Build aarch64-linux-gnu integrated compiler.
22-
--ucrt <build> Include UCRT in the package. Windows SDK required.
23-
e.g. '--ucrt 22621' for Windows 11 SDK 22H2.
21+
--ucrt <arch> Include UCRT installer (VC_redist) in the package.
22+
<arch> can be x86 or x64.
23+
This option can be specified multiple times.
2424
-nd, --no-deps Skip dependency check.
2525
-t, --target-dir <dir> Set target directory for the packages."
2626
}
27-
2827
source version.inc
2928
[[ -n "${APP_VERSION_SUFFIX}" ]] && APP_VERSION="${APP_VERSION}${APP_VERSION_SUFFIX}"
3029

31-
# Verify script is running in MSYS2 shell
3230
if [[ ! -v MSYSTEM ]]; then
3331
echo "This script must be run in MSYS2 shell"
3432
exit 1
3533
fi
3634

37-
# Handle MSYSTEM switch if specified
3835
if [[ $# -gt 1 && ($1 == "-m" || $1 == "--msystem") ]]; then
3936
msystem=$2
4037
shift 2
@@ -50,10 +47,9 @@ if [[ $# -gt 1 && ($1 == "-m" || $1 == "--msystem") ]]; then
5047
esac
5148
fi
5249

53-
# Set architecture-specific variables based on MSYSTEM
5450
case "${MSYSTEM}" in
5551
MINGW32)
56-
# No UCRT32 available
52+
# there is no UCRT32
5753
# CLANG32 qt5-static removed since 5.15.15
5854
# https://github.com/msys2/MINGW-packages/commit/ab062c6e5d6e9fff86ee8f88c1d8e9601ea9ab5b
5955
NSIS_ARCH=x86
@@ -76,7 +72,6 @@ case "${MSYSTEM}" in
7672
;;
7773
esac
7874

79-
# Initialize variables with default values
8075
CLEAN=0
8176
CHECK_DEPS=1
8277
compilers=()
@@ -87,9 +82,8 @@ COMPILER_GCC_LINUX_AARCH64=0
8782
REQUIRED_WINDOWS_BUILD=7600
8883
REQUIRED_WINDOWS_NAME="Windows 7"
8984
TARGET_DIR="$(pwd)/dist"
90-
UCRT=""
91-
92-
# Parse command line arguments
85+
UCRT_X86=0
86+
UCRT_X64=0
9387
while [[ $# -gt 0 ]]; do
9488
case $1 in
9589
-h|--help)
@@ -159,17 +153,21 @@ while [[ $# -gt 0 ]]; do
159153
esac
160154
;;
161155
--ucrt)
162-
case "${MSYSTEM}" in
163-
UCRT64|CLANG64)
164-
UCRT="$2"
156+
case "$2" in
157+
x86)
158+
UCRT_X86=1
159+
shift 2
160+
;;
161+
x64)
162+
UCRT_X64=1
165163
shift 2
166164
;;
167-
MINGW32|MINGW64)
168-
echo "Error: Red Panda C++ is not built against UCRT."
165+
arm64)
166+
echo "UCRT is always a system component on arm64."
169167
exit 1
170168
;;
171-
CLANGARM64)
172-
echo "Error: UCRT is a system component on arm64, local deployment is not supported."
169+
*)
170+
echo "Invalid UCRT architecture: $2"
173171
exit 1
174172
;;
175173
esac
@@ -189,17 +187,19 @@ while [[ $# -gt 0 ]]; do
189187
esac
190188
done
191189

192-
# Define directory paths
193190
BUILD_DIR="${TEMP}/redpanda-mingw-${MSYSTEM}-build"
194191
ASTYLE_BUILD_DIR="${BUILD_DIR}/astyle"
195192
PACKAGE_DIR="${TEMP}/redpanda-mingw-${MSYSTEM}-pkg"
196193
QMAKE="${MINGW_PREFIX}/qt6-static/bin/qmake"
197194
NSIS="/mingw32/bin/makensis"
198195
SOURCE_DIR="$(pwd)"
199196
ASSETS_DIR="${SOURCE_DIR}/assets"
200-
UCRT_DIR="/c/Program Files (x86)/Windows Kits/10/Redist/10.0.${UCRT}.0/ucrt/DLLs/${NSIS_ARCH}"
201197

202-
# Set 7-Zip path based on architecture
198+
# Visual C++ Redistributable for Visual Studio 2019, version 16.7 (14.27)
199+
# This is the last version that supports all Windows versions (on which UCRT is supported).
200+
UCRT_X86_URL="https://download.visualstudio.microsoft.com/download/pr/c168313d-1754-40d4-8928-18632c2e2a71/D305BAA965C9CD1B44EBCD53635EE9ECC6D85B54210E2764C8836F4E9DEFA345/VC_redist.x86.exe"
201+
UCRT_X64_URL="https://download.visualstudio.microsoft.com/download/pr/722d59e4-0671-477e-b9b1-b8da7d4bd60b/591CBE3A269AFBCC025681B968A29CD191DF3C6204712CBDC9BA1CB632BA6068/VC_redist.x64.exe"
202+
203203
case "${MSYSTEM}" in
204204
MINGW32)
205205
# 32-bit 7zip removed since 24.05
@@ -213,27 +213,23 @@ case "${MSYSTEM}" in
213213
;;
214214
esac
215215

216-
# MinGW32 configuration
217216
MINGW32_FOLDER="mingw32"
218217
MINGW32_ARCHIVE="mingw32.7z"
219218
MINGW32_COMPILER_NAME="MinGW-w64 i686 GCC 11.5"
220219
MINGW32_PACKAGE_SUFFIX="MinGW32_11.5"
221220

222-
# MinGW64 configuration with specified GitHub download link
223221
MINGW64_FOLDER="mingw64"
224222
MINGW64_ARCHIVE="x86_64-15.1.0-release-posix-seh-msvcrt-rt_v12-rev0_2.zip"
225223
MINGW64_URL="https://github.com/C14147/RedPandaIDE-Extensions/releases/download/mingw64-15.1-compilers/${MINGW64_ARCHIVE}"
226224
MINGW64_COMPILER_NAME="MinGW-w64 X86_64 GCC 15.1"
227225
MINGW64_PACKAGE_SUFFIX="MinGW64_15.1"
228226

229-
# Linux compiler configurations
230227
GCC_LINUX_X8664_ARCHIVE="gcc-linux-x86-64.7z"
231228
ALPINE_X8664_ARCHIVE="alpine-minirootfs-x86_64.tar"
232229

233230
GCC_LINUX_AARCH64_ARCHIVE="gcc-linux-aarch64.7z"
234231
ALPINE_AARCH64_ARCHIVE="alpine-minirootfs-aarch64.tar"
235232

236-
# Set package base name based on selected compilers
237233
if [[ ${#compilers[@]} -eq 0 ]]; then
238234
PACKAGE_BASENAME="${PACKAGE_BASENAME}.NoCompiler"
239235
else
@@ -242,12 +238,12 @@ else
242238
[[ ${COMPILER_GCC_LINUX_X8664} -eq 1 || ${COMPILER_GCC_LINUX_AARCH64} -eq 1 ]] && PACKAGE_BASENAME="${PACKAGE_BASENAME}.Linux_GCC"
243239
fi
244240

245-
# Function to print formatted progress messages
246241
function fn_print_progress() {
247242
echo -e "\e[1;32;44m$1\e[0m"
248243
}
249244

250-
## Dependency check
245+
## check deps
246+
251247
if [[ ${CHECK_DEPS} -eq 1 ]]; then
252248
deps=(
253249
${MINGW_PACKAGE_PREFIX}-{cc,make,qt6-static,cmake}
@@ -258,7 +254,6 @@ if [[ ${CHECK_DEPS} -eq 1 ]]; then
258254
curl # Ensure curl is installed for downloading MinGW64
259255
)
260256

261-
# Verify all dependencies are installed
262257
for dep in ${deps[@]}; do
263258
pacman -Q ${dep} &>/dev/null || {
264259
echo "Missing dependency: ${dep}"
@@ -267,13 +262,14 @@ if [[ ${CHECK_DEPS} -eq 1 ]]; then
267262
done
268263
fi
269264

270-
# Check for MinGW32 assets if needed
271265
if [[ ${COMPILER_MINGW32} -eq 1 && ! -f "${SOURCE_DIR}/assets/${MINGW32_ARCHIVE}" && ! -d "${SOURCE_DIR}/assets/${MINGW32_FOLDER}" ]]; then
272266
echo "Missing MinGW archive: assets/${MINGW32_ARCHIVE} or MinGW folder: assets/${MINGW32_FOLDER}"
273267
exit 1
274268
fi
275-
276-
# Check for Linux compiler assets if needed
269+
if [[ ${COMPILER_MINGW64} -eq 1 && ! -f "${SOURCE_DIR}/assets/${MINGW64_ARCHIVE}" && ! -d "${SOURCE_DIR}/assets/${MINGW64_FOLDER}" ]]; then
270+
echo "Missing MinGW archive: assets/${MINGW64_ARCHIVE} or MinGW folder: assets/${MINGW64_FOLDER}"
271+
exit 1
272+
fi
277273
if [[ ${COMPILER_GCC_LINUX_X8664} -eq 1 ]]; then
278274
if [[ ! -f "${SOURCE_DIR}/assets/${GCC_LINUX_X8664_ARCHIVE}" ]]; then
279275
echo "Missing GCC archive: assets/${GCC_LINUX_X8664_ARCHIVE}"
@@ -282,7 +278,6 @@ if [[ ${COMPILER_GCC_LINUX_X8664} -eq 1 ]]; then
282278
echo "Missing Alpine rootfs: assets/${ALPINE_X8664_ARCHIVE}"
283279
fi
284280
fi
285-
286281
if [[ ${COMPILER_GCC_LINUX_AARCH64} -eq 1 ]]; then
287282
if [[ ! -f "${SOURCE_DIR}/assets/${GCC_LINUX_AARCH64_ARCHIVE}" ]]; then
288283
echo "Missing GCC archive: assets/${GCC_LINUX_AARCH64_ARCHIVE}"
@@ -292,20 +287,27 @@ if [[ ${COMPILER_GCC_LINUX_AARCH64} -eq 1 ]]; then
292287
fi
293288
fi
294289

295-
# Check for UCRT if specified
296-
if [[ -n "${UCRT}" && ! -f "${UCRT_DIR}/ucrtbase.dll" ]]; then
297-
echo "Missing Windows SDK, UCRT cannot be included."
298-
exit 1
290+
if [[ ${UCRT_X86} -eq 1 ]] ; then
291+
if [[ ! -f "${SOURCE_DIR}/assets/VC_redist.x86.exe" ]]; then
292+
curl -L -o "${SOURCE_DIR}/assets/VC_redist.x86.exe" "${UCRT_X86_URL}"
293+
fi
294+
fi
295+
if [[ ${UCRT_X64} -eq 1 ]] ; then
296+
if [[ ! -f "${SOURCE_DIR}/assets/VC_redist.x64.exe" ]]; then
297+
curl -L -o "${SOURCE_DIR}/assets/VC_redist.x64.exe" "${UCRT_X64_URL}"
298+
fi
299299
fi
300300

301-
## Prepare directories
301+
## prepare dirs
302+
302303
if [[ ${CLEAN} -eq 1 ]]; then
303304
rm -rf "${BUILD_DIR}"
304305
rm -rf "${PACKAGE_DIR}"
305306
fi
306307
mkdir -p "${BUILD_DIR}" "${PACKAGE_DIR}" "${TARGET_DIR}" "${ASTYLE_BUILD_DIR}" "${ASSETS_DIR}"
307308

308-
## Prepare assets
309+
## prepare assets
310+
309311
fn_print_progress "Updating astyle repo..."
310312
if [[ ! -d "${ASSETS_DIR}/astyle" ]]; then
311313
git clone --bare "https://gitlab.com/saalen/astyle" "${ASSETS_DIR}/astyle"
@@ -335,12 +337,13 @@ pushd .
335337
cd "${BUILD_DIR}"
336338
qmake_flags=()
337339
[[ ${NSIS_ARCH} == x64 ]] && qmake_flags+=("X86_64=ON")
338-
"$QMAKE" PREFIX="${PACKAGE_DIR}" ${qmake_flags[@]} -o Makefile "${SOURCE_DIR}/Red_Panda_Cpp.pro" -r "DEFINES+=BUILD_INCLUDE_OPENSSL BUILD_MODERN"
340+
"$QMAKE" PREFIX="${PACKAGE_DIR}" ${qmake_flags[@]} -o Makefile "${SOURCE_DIR}/Red_Panda_Cpp.pro" -r "DEFINES+=BUILD_INCLUDE_OPENSSL BUILD_MODERN"
339341
mingw32-make -j$(nproc)
340342
mingw32-make install
341343
popd
342344

343-
## Prepare packaging resources
345+
## prepare packaging resources
346+
344347
pushd .
345348
cd "${PACKAGE_DIR}"
346349

@@ -360,15 +363,15 @@ mkdir -p "${SEVENZIP_DIR}"
360363
"${_7Z}" x -y "${SEVENZIP_ZIP}" -o"${SEVENZIP_DIR}"
361364
rm "${SEVENZIP_ZIP}"
362365

363-
## Create package
366+
## make package
367+
364368
pushd .
365369
cd "${PACKAGE_DIR}"
366370
SETUP_NAME="${PACKAGE_BASENAME}.Setup.exe"
367371
PORTABLE_NAME="${PACKAGE_BASENAME}.Portable.7z"
368372

369373
fn_print_progress "Making installer..."
370374

371-
# NSIS compiler flags
372375
nsis_flags=(
373376
-DAPP_VERSION="${APP_VERSION}"
374377
-DARCH="${NSIS_ARCH}"
@@ -384,8 +387,8 @@ nsis_flags=(
384387
if [[ ${COMPILER_MINGW32} -eq 1 ]]; then
385388
nsis_flags+=(-DHAVE_MINGW32)
386389
if [[ ! -d "mingw32" ]]; then
387-
[[ -f "${SOURCE_DIR}/assets/${MINGW32_ARCHIVE}" ]] && "${_7Z}" x "${SOURCE_DIR}/assets/${MINGW32_ARCHIVE}" -o"${PACKAGE_DIR}"
388-
[[ -d "${SOURCE_DIR}/assets/${MINGW32_FOLDER}" ]] && cp -a --dereference "${SOURCE_DIR}/assets/${MINGW32_FOLDER}" "${PACKAGE_DIR}"
390+
[[ -f "${SOURCE_DIR}/assets/${MINGW32_ARCHIVE}" ]] && "${_7Z}" x "${SOURCE_DIR}/assets/${MINGW32_ARCHIVE}" -o"${PACKAGE_DIR}"
391+
[[ -d "${SOURCE_DIR}/assets/${MINGW32_FOLDER}" ]] && cp -a --dereference "${SOURCE_DIR}/assets/${MINGW32_FOLDER}" "${PACKAGE_DIR}"
389392
fi
390393
fi
391394

@@ -402,33 +405,29 @@ if [[ ${COMPILER_MINGW64} -eq 1 ]]; then
402405
exit 1
403406
fi
404407
fi
405-
408+
406409
# Extract the downloaded package
407410
fn_print_progress "Extracting MinGW64 archive..."
408411
if ! "${_7Z}" x "${BUILD_DIR}/${MINGW64_ARCHIVE}" -o"${PACKAGE_DIR}"; then
409412
echo "Error: Failed to extract MinGW64 archive"
410413
exit 1
411414
fi
412-
413-
# Ensure directory is named mingw64
415+
416+
# Ensure directory is named mingw64 (package may contain a long folder name)
414417
if [[ -d "${PACKAGE_DIR}/x86_64-15.1.0-release-posix-seh-msvcrt-rt_v12-rev0" && ! -d "mingw64" ]]; then
415418
mv "${PACKAGE_DIR}/x86_64-15.1.0-release-posix-seh-msvcrt-rt_v12-rev0" "${PACKAGE_DIR}/mingw64"
416419
fi
417420
fi
418421
fi
419-
420-
# Handle Linux x86_64 compiler if selected
421422
if [[ ${COMPILER_GCC_LINUX_X8664} -eq 1 ]]; then
422423
nsis_flags+=(-DHAVE_GCC_LINUX_X8664 -DSTRICT_ARCH_CHECK)
423-
if [[ ! -d "gcc-linux-x86-64" ]]; then
424+
if [[ ! -d "gcc-linux-x86_64" ]]; then
424425
"${_7Z}" x "${SOURCE_DIR}/assets/${GCC_LINUX_X8664_ARCHIVE}" -o"${PACKAGE_DIR}"
425426
fi
426427
if [[ ! -d "alpine-minirootfs.tar" ]]; then
427428
cp "${SOURCE_DIR}/assets/${ALPINE_X8664_ARCHIVE}" alpine-minirootfs.tar
428429
fi
429430
fi
430-
431-
# Handle Linux aarch64 compiler if selected
432431
if [[ ${COMPILER_GCC_LINUX_AARCH64} -eq 1 ]]; then
433432
nsis_flags+=(-DHAVE_GCC_LINUX_AARCH64 -DSTRICT_ARCH_CHECK)
434433
if [[ ! -d "gcc-linux-aarch64" ]]; then
@@ -438,26 +437,21 @@ if [[ ${COMPILER_GCC_LINUX_AARCH64} -eq 1 ]]; then
438437
cp "${SOURCE_DIR}/assets/${ALPINE_AARCH64_ARCHIVE}" alpine-minirootfs.tar
439438
fi
440439
fi
441-
442-
# Handle UCRT if specified
443-
if [[ -n "${UCRT}" ]]; then
444-
nsis_flags+=(-DHAVE_UCRT)
445-
if [[ ! -f ucrt/ucrtbase.dll ]]; then
446-
mkdir -p ucrt
447-
cp "${UCRT_DIR}"/*.dll ucrt
448-
fi
440+
if [[ ${UCRT_X86} -eq 1 ]]; then
441+
nsis_flags+=(-DHAVE_UCRT_X86)
442+
cp "${SOURCE_DIR}/assets/VC_redist.x86.exe" VC_redist.x86.exe
443+
fi
444+
if [[ ${UCRT_X64} -eq 1 ]]; then
445+
nsis_flags+=(-DHAVE_UCRT_X64)
446+
cp "${SOURCE_DIR}/assets/VC_redist.x64.exe" VC_redist.x64.exe
449447
fi
450-
451-
# Build installer
452448
"${NSIS}" "${nsis_flags[@]}" redpanda.nsi
453449

454-
# Create portable package
455450
fn_print_progress "Making Portable Package..."
456451
"${_7Z}" x "${SETUP_NAME}" -o"RedPanda-CPP" -xr'!$PLUGINSDIR' -x"!uninstall.exe"
457452
"${_7Z}" a -mmt -mx9 -ms=on -mqs=on -mf=BCJ2 "${PORTABLE_NAME}" "RedPanda-CPP"
458453
rm -rf "RedPanda-CPP"
459454

460-
# Move final packages to target directory
461455
mv "${SETUP_NAME}" "${TARGET_DIR}"
462456
mv "${PORTABLE_NAME}" "${TARGET_DIR}"
463457
popd

0 commit comments

Comments
 (0)