@@ -4,7 +4,6 @@ set -euxo pipefail
44
55ASTYLE_VERSION_TAG=" 3.6.9"
66
7- # Print help information
87function 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-
2827source version.inc
2928[[ -n " ${APP_VERSION_SUFFIX} " ]] && APP_VERSION=" ${APP_VERSION}${APP_VERSION_SUFFIX} "
3029
31- # Verify script is running in MSYS2 shell
3230if [[ ! -v MSYSTEM ]]; then
3331 echo " This script must be run in MSYS2 shell"
3432 exit 1
3533fi
3634
37- # Handle MSYSTEM switch if specified
3835if [[ $# -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
5148fi
5249
53- # Set architecture-specific variables based on MSYSTEM
5450case " ${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 ;;
7773esac
7874
79- # Initialize variables with default values
8075CLEAN=0
8176CHECK_DEPS=1
8277compilers=()
@@ -87,9 +82,8 @@ COMPILER_GCC_LINUX_AARCH64=0
8782REQUIRED_WINDOWS_BUILD=7600
8883REQUIRED_WINDOWS_NAME=" Windows 7"
8984TARGET_DIR=" $( pwd) /dist"
90- UCRT=" "
91-
92- # Parse command line arguments
85+ UCRT_X86=0
86+ UCRT_X64=0
9387while [[ $# -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
190188done
191189
192- # Define directory paths
193190BUILD_DIR=" ${TEMP} /redpanda-mingw-${MSYSTEM} -build"
194191ASTYLE_BUILD_DIR=" ${BUILD_DIR} /astyle"
195192PACKAGE_DIR=" ${TEMP} /redpanda-mingw-${MSYSTEM} -pkg"
196193QMAKE=" ${MINGW_PREFIX} /qt6-static/bin/qmake"
197194NSIS=" /mingw32/bin/makensis"
198195SOURCE_DIR=" $( pwd) "
199196ASSETS_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+
203203case " ${MSYSTEM} " in
204204 MINGW32)
205205 # 32-bit 7zip removed since 24.05
@@ -213,27 +213,23 @@ case "${MSYSTEM}" in
213213 ;;
214214esac
215215
216- # MinGW32 configuration
217216MINGW32_FOLDER=" mingw32"
218217MINGW32_ARCHIVE=" mingw32.7z"
219218MINGW32_COMPILER_NAME=" MinGW-w64 i686 GCC 11.5"
220219MINGW32_PACKAGE_SUFFIX=" MinGW32_11.5"
221220
222- # MinGW64 configuration with specified GitHub download link
223221MINGW64_FOLDER=" mingw64"
224222MINGW64_ARCHIVE=" x86_64-15.1.0-release-posix-seh-msvcrt-rt_v12-rev0_2.zip"
225223MINGW64_URL=" https://github.com/C14147/RedPandaIDE-Extensions/releases/download/mingw64-15.1-compilers/${MINGW64_ARCHIVE} "
226224MINGW64_COMPILER_NAME=" MinGW-w64 X86_64 GCC 15.1"
227225MINGW64_PACKAGE_SUFFIX=" MinGW64_15.1"
228226
229- # Linux compiler configurations
230227GCC_LINUX_X8664_ARCHIVE=" gcc-linux-x86-64.7z"
231228ALPINE_X8664_ARCHIVE=" alpine-minirootfs-x86_64.tar"
232229
233230GCC_LINUX_AARCH64_ARCHIVE=" gcc-linux-aarch64.7z"
234231ALPINE_AARCH64_ARCHIVE=" alpine-minirootfs-aarch64.tar"
235232
236- # Set package base name based on selected compilers
237233if [[ ${# compilers[@]} -eq 0 ]]; then
238234 PACKAGE_BASENAME=" ${PACKAGE_BASENAME} .NoCompiler"
239235else
@@ -242,12 +238,12 @@ else
242238 [[ ${COMPILER_GCC_LINUX_X8664} -eq 1 || ${COMPILER_GCC_LINUX_AARCH64} -eq 1 ]] && PACKAGE_BASENAME=" ${PACKAGE_BASENAME} .Linux_GCC"
243239fi
244240
245- # Function to print formatted progress messages
246241function fn_print_progress() {
247242 echo -e " \e[1;32;44m$1 \e[0m"
248243}
249244
250- # # Dependency check
245+ # # check deps
246+
251247if [[ ${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
268263fi
269264
270- # Check for MinGW32 assets if needed
271265if [[ ${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
274268fi
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
277273if [[ ${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
284280fi
285-
286281if [[ ${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
293288fi
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
299299fi
300300
301- # # Prepare directories
301+ # # prepare dirs
302+
302303if [[ ${CLEAN} -eq 1 ]]; then
303304 rm -rf " ${BUILD_DIR} "
304305 rm -rf " ${PACKAGE_DIR} "
305306fi
306307mkdir -p " ${BUILD_DIR} " " ${PACKAGE_DIR} " " ${TARGET_DIR} " " ${ASTYLE_BUILD_DIR} " " ${ASSETS_DIR} "
307308
308- # # Prepare assets
309+ # # prepare assets
310+
309311fn_print_progress " Updating astyle repo..."
310312if [[ ! -d " ${ASSETS_DIR} /astyle" ]]; then
311313 git clone --bare " https://gitlab.com/saalen/astyle" " ${ASSETS_DIR} /astyle"
@@ -335,12 +337,13 @@ pushd .
335337cd " ${BUILD_DIR} "
336338qmake_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"
339341mingw32-make -j$( nproc)
340342mingw32-make install
341343popd
342344
343- # # Prepare packaging resources
345+ # # prepare packaging resources
346+
344347pushd .
345348cd " ${PACKAGE_DIR} "
346349
@@ -360,15 +363,15 @@ mkdir -p "${SEVENZIP_DIR}"
360363" ${_7Z} " x -y " ${SEVENZIP_ZIP} " -o" ${SEVENZIP_DIR} "
361364rm " ${SEVENZIP_ZIP} "
362365
363- # # Create package
366+ # # make package
367+
364368pushd .
365369cd " ${PACKAGE_DIR} "
366370SETUP_NAME=" ${PACKAGE_BASENAME} .Setup.exe"
367371PORTABLE_NAME=" ${PACKAGE_BASENAME} .Portable.7z"
368372
369373fn_print_progress " Making installer..."
370374
371- # NSIS compiler flags
372375nsis_flags=(
373376 -DAPP_VERSION=" ${APP_VERSION} "
374377 -DARCH=" ${NSIS_ARCH} "
@@ -384,8 +387,8 @@ nsis_flags=(
384387if [[ ${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
390393fi
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
418421fi
419-
420- # Handle Linux x86_64 compiler if selected
421422if [[ ${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
429430fi
430-
431- # Handle Linux aarch64 compiler if selected
432431if [[ ${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
440439fi
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
449447fi
450-
451- # Build installer
452448" ${NSIS} " " ${nsis_flags[@]} " redpanda.nsi
453449
454- # Create portable package
455450fn_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"
458453rm -rf " RedPanda-CPP"
459454
460- # Move final packages to target directory
461455mv " ${SETUP_NAME} " " ${TARGET_DIR} "
462456mv " ${PORTABLE_NAME} " " ${TARGET_DIR} "
463457popd
0 commit comments