[ci,mingw] update build scripts

* update dependency versions
* replace SDL2 with SDL3 client
* update documentation
* add option to do fully static builds
* format script with shfmt -i 2 w scripts/mingw.sh
This commit is contained in:
akallabeth
2025-02-25 09:28:16 +01:00
parent e0ccda667e
commit 418d228d4b
2 changed files with 194 additions and 156 deletions

View File

@@ -3,6 +3,12 @@ Overview
More documentation might be found at https://github.com/FreeRDP/FreeRDP/wiki/Compilation
A sample build script is part of the repository at scripts/mingw.sh
It is periodically run as part of the https://github.com/FreeRDP/FreeRDP/actions/workflows/mingw.yml workflow.
If you want to do your own build, check the script and the dependency versions checked out (we only use it for the ci builder,
so updates are not always done in a timely fashion)
FreeRDP can be built for Windows using llvm-mingw (https://github.com/mstorsjo/llvm-mingw) with both msvcrt and ucrt.
MinGW builds are not actively maintained at the moment and every once in a while the build process may stop working. Pull requests to maintain MinGW support are always welcome.

View File

@@ -1,10 +1,10 @@
#!/bin/bash -xe
#
# mingw build script
# mingw build script
#
# TODO: Replace with CMake FetchContent
# https://cmake.org/cmake/help/latest/module/FetchContent.html
#
#
SCRIPT_PATH=$(dirname "${BASH_SOURCE[0]}")
SCRIPT_PATH=$(realpath "$SCRIPT_PATH")
@@ -16,193 +16,225 @@ CLONE=1
DEPS=1
BUILD=1
FFMPEG=0
OPENH264=0
for i in "$@"
do
case $i in
-b|--no-build)
ARG_SHARED=1
CMAKE_DEFAULT_FLAGS=""
ARG_SHARED_MESON="-Ddefault_library=shared"
ARG_SHARED_FFMPEG="--disable-static --enable-shared"
for i in "$@"; do
case $i in
-b | --no-build)
BUILD=0
;;
-d|--no-deps)
DEPS=0
;;
-c|--no-clone)
-c | --no-clone)
CLONE=0
;;
-f|--with-ffmpeg)
-d | --no-deps)
DEPS=0
;;
-f | --with-ffmpeg)
FFMPEG=1
;;
*)
# unknown option
echo "unknown option, quit"
echo "$0 [-d|--no-deps] [-c|--no-clone]"
exit 1
-o | --with-openh264)
OPENH264=1
;;
esac
-s | --static)
ARG_SHARED=0
CMAKE_DEFAULT_FLAGS="-static -static-libgcc -static-libstdc++"
ARG_SHARED_MESON="-Ddefault_library=static"
ARG_SHARED_FFMPEG=""
;;
*)
# unknown option
echo "unknown option '$i', quit"
echo "usage:\n\t$0 [-b|--no-build] [-c|--no-clone] [-d|--no-deps] [-f|--with-ffmpeg] [-o|--with-openh264] [-s|--static]"
exit 1
;;
esac
done
function do_clone {
version=$1
url=$2
dir=$3
ARG_COMPILED_RES=1
if [ $ARG_SHARED -ne 0 ]; then
ARG_COMPILED_RES=0
fi
if [ -d "$dir" ];
then
(
cd "$dir"
git fetch --all
git clean -xdf
git reset --hard $version
git checkout $version
git submodule update --init --recursive
)
else
git clone --depth 1 --shallow-submodules --recurse-submodules -b $version $url $dir
fi
function do_clone {
version=$1
url=$2
dir=$3
if [ -d "$dir" ]; then
(
cd "$dir"
git fetch --all
git clean -xdf
git reset --hard $version
git checkout $version
git submodule update --init --recursive
)
else
git clone --depth 1 --shallow-submodules --recurse-submodules -b $version $url $dir
fi
}
function do_cmake_build {
cmake \
-GNinja \
-DCMAKE_TOOLCHAIN_FILE="$SCRIPT_PATH/mingw64.cmake" \
-DCMAKE_PREFIX_PATH="$INSTALL_BASE/lib/cmake;$INSTALL_BASE/lib;$INSTALL_BASE" \
-DCMAKE_MODULE_PATH="$INSTALL_BASE/lib/cmake;$INSTALL_BASE/lib;$INSTALL_BASE" \
-DCMAKE_INSTALL_PREFIX="$INSTALL_BASE" \
-B "$1" \
${@:2}
cmake --build "$1"
cmake --install "$1"
cmake \
-GNinja \
-DCMAKE_TOOLCHAIN_FILE="$SCRIPT_PATH/mingw64.cmake" \
-DCMAKE_PREFIX_PATH="$INSTALL_BASE/lib/cmake;$INSTALL_BASE/lib;$INSTALL_BASE" \
-DCMAKE_MODULE_PATH="$INSTALL_BASE/lib/cmake;$INSTALL_BASE/lib;$INSTALL_BASE" \
-DCMAKE_INSTALL_PREFIX="$INSTALL_BASE" \
-DBUILD_SHARED_LIBS=$ARG_SHARED \
-DCMAKE_INTERPROZEDURAL_OPTIMIZATION=OFF \
-DCMAKE_EXE_LINKER_FLAGS="$CMAKE_DEFAULT_FLAGS" \
-B "$1" \
${@:2}
cmake --build "$1"
cmake --install "$1"
}
mkdir -p "$SRC_BASE"
mkdir -p "$BUILD_BASE"
cd "$SRC_BASE"
if [ $CLONE -ne 0 ];
then
do_clone v1.3.1 https://github.com/madler/zlib.git zlib
do_clone uriparser-0.9.7 https://github.com/uriparser/uriparser.git uriparser
do_clone v1.7.17 https://github.com/DaveGamble/cJSON.git cJSON
do_clone release-2.30.0 https://github.com/libsdl-org/SDL.git SDL
if [ $FFMPEG -ne 0 ];
then
do_clone n6.1.1 https://github.com/FFmpeg/FFmpeg.git FFmpeg
fi
do_clone v2.4.1 https://github.com/cisco/openh264.git openh264
do_clone v1.0.27 https://github.com/libusb/libusb-cmake.git libusb-cmake
do_clone release-2.8.2 https://github.com/libsdl-org/SDL_image.git SDL_image
do_clone release-2.22.0 https://github.com/libsdl-org/SDL_ttf.git SDL_ttf
do_clone v3.8.2 https://github.com/libressl/portable.git libressl
(
cd libressl
./update.sh
)
if [ $CLONE -ne 0 ]; then
do_clone v1.3.1 https://github.com/madler/zlib.git zlib
do_clone uriparser-0.9.8 https://github.com/uriparser/uriparser.git uriparser
do_clone v1.7.18 https://github.com/DaveGamble/cJSON.git cJSON
do_clone release-3.2.4 https://github.com/libsdl-org/SDL.git SDL
if [ $FFMPEG -ne 0 ]; then
do_clone n7.1 https://github.com/FFmpeg/FFmpeg.git FFmpeg
fi
if [ $OPENH264 -ne 0 ]; then
do_clone v2.6.0 https://github.com/cisco/openh264.git openh264
fi
do_clone v1.0.27-1 https://github.com/libusb/libusb-cmake.git libusb-cmake
do_clone release-3.2.0 https://github.com/libsdl-org/SDL_image.git SDL_image
do_clone prerelease-3.1.2 https://github.com/libsdl-org/SDL_ttf.git SDL_ttf
do_clone v3.9.2 https://github.com/libressl/portable.git libressl
(
cd libressl
./update.sh
)
fi
if [ $BUILD -eq 0 ];
then
exit 0
if [ $BUILD -eq 0 ]; then
exit 0
fi
if [ $DEPS -ne 0 ];
then
do_cmake_build \
"$BUILD_BASE/libressl" \
-S libressl \
-DLIBRESSL_APPS=OFF \
-DLIBRESSL_TESTS=OFF
if [ $DEPS -ne 0 ]; then
do_cmake_build \
"$BUILD_BASE/libressl" \
-S libressl \
-DLIBRESSL_APPS=OFF \
-DLIBRESSL_TESTS=OFF
do_cmake_build \
"$BUILD_BASE/zlib" \
-S zlib
do_cmake_build \
"$BUILD_BASE/zlib" \
-S zlib \
-DZLIB_BUILD_EXAMPLES=OFF
do_cmake_build \
"$BUILD_BASE/uriparser" \
-S uriparser \
-DURIPARSER_BUILD_DOCS=OFF \
-DURIPARSER_BUILD_TESTS=OFF
do_cmake_build \
"$BUILD_BASE/uriparser" \
-S uriparser \
-DURIPARSER_BUILD_TOOLS=OFF \
-DURIPARSER_BUILD_DOCS=OFF \
-DURIPARSER_BUILD_TESTS=OFF
do_cmake_build \
"$BUILD_BASE/cJSON" \
-S cJSON \
-DENABLE_CJSON_TEST=OFF \
-DBUILD_SHARED_AND_STATIC_LIBS=ON
do_cmake_build \
"$BUILD_BASE/cJSON" \
-S cJSON \
-DENABLE_CJSON_TEST=OFF \
-DENABLE_CUSTOM_COMPILER_FLAGS=OFF \
-DENABLE_HIDDEN_SYMBOLS=ON \
-DBUILD_SHARED_AND_STATIC_LIBS=OFF \
-DCJSON_BUILD_SHARED_LIBS=$ARG_SHARED
do_cmake_build \
"$BUILD_BASE/SDL" \
-S SDL \
-DSDL_TEST=OFF \
-DSDL_TESTS=OFF \
-DSDL_STATIC_PIC=ON
do_cmake_build \
"$BUILD_BASE/SDL" \
-S SDL \
-DSDL_TEST=OFF \
-DSDL_TESTS=OFF \
-DSDL_STATIC_PIC=ON
do_cmake_build \
"$BUILD_BASE/SDL_ttf" \
-S SDL_ttf \
-DSDL2TTF_HARFBUZZ=ON \
-DSDL2TTF_FREETYPE=ON \
-DSDL2TTF_VENDORED=ON \
-DFT_DISABLE_ZLIB=OFF \
-DSDL2TTF_SAMPLES=OFF
do_cmake_build \
"$BUILD_BASE/SDL_ttf" \
-S SDL_ttf \
-DSDLTTF_HARFBUZZ=ON \
-DSDLTTF_FREETYPE=ON \
-DSDLTTF_VENDORED=ON \
-DFT_DISABLE_ZLIB=OFF \
-DSDLTTF_SAMPLES=OFF \
-DSDLTTF_PLUTOSVG=OFF
do_cmake_build \
"$BUILD_BASE/SDL_image" \
-S SDL_image \
-DSDL2IMAGE_SAMPLES=OFF \
-DSDL2IMAGE_DEPS_SHARED=OFF
do_cmake_build \
"$BUILD_BASE/SDL_image" \
-S SDL_image \
-DSDLIMAGE_SAMPLES=OFF \
-DSDLIMAGE_DEPS_SHARED=OFF
do_cmake_build \
"$BUILD_BASE/libusb-cmake" \
-S libusb-cmake \
-DLIBUSB_BUILD_EXAMPLES=OFF \
-DLIBUSB_BUILD_TESTING=OFF \
-DLIBUSB_ENABLE_DEBUG_LOGGING=OFF
do_cmake_build \
"$BUILD_BASE/libusb-cmake" \
-S libusb-cmake \
-DLIBUSB_BUILD_EXAMPLES=OFF \
-DLIBUSB_BUILD_TESTING=OFF \
-DLIBUSB_ENABLE_DEBUG_LOGGING=OFF
# TODO: This takes ages to compile, disable
if [ $FFMPEG -ne 0 ];
then
(
cd "$BUILD_BASE"
mkdir -p FFmpeg
cd FFmpeg
"$SRC_BASE/FFmpeg/configure" \
--arch=x86_64 \
--target-os=mingw64 \
--cross-prefix=x86_64-w64-mingw32- \
--prefix="$INSTALL_BASE"
make -j
make -j install
)
fi
# TODO: This takes ages to compile, disable
if [ $FFMPEG -ne 0 ]; then
(
cd "$BUILD_BASE"
mkdir -p FFmpeg
cd FFmpeg
"$SRC_BASE/FFmpeg/configure" \
--arch=x86_64 \
--target-os=mingw64 \
--cross-prefix=x86_64-w64-mingw32- \
--disable-programs \
--disable-doc \
--prefix="$INSTALL_BASE" $ARG_SHARED_FFMPEG
make -j
make -j install
)
fi
meson setup --cross-file "$SCRIPT_PATH/mingw-meson.conf" \
-Dprefix="$INSTALL_BASE" \
-Db_pie=true \
-Db_lto=true \
-Dbuildtype=release \
-Dtests=disabled \
-Ddefault_library=both \
"$BUILD_BASE/openh264" \
openh264
ninja -C "$BUILD_BASE/openh264"
ninja -C "$BUILD_BASE/openh264" install
if [ $OPENH264 -ne 0 ]; then
(
meson setup --cross-file "$SCRIPT_PATH/mingw-meson.conf" \
-Dprefix="$INSTALL_BASE" \
-Db_pie=true \
-Db_lto=true \
-Dbuildtype=release \
-Dtests=disabled \
$ARG_SHARED_MESON \
-Dcpp_link_args="$CMAKE_DEFAULT_FLAGS" \
-Dcpp_args="$CMAKE_DEFAULT_FLAGS" \
"$BUILD_BASE/openh264" \
openh264
ninja -C "$BUILD_BASE/openh264"
ninja -C "$BUILD_BASE/openh264" install
)
fi
fi
do_cmake_build \
"$BUILD_BASE/freerdp" \
-S "$SCRIPT_PATH/.." \
-DWITH_SERVER=ON \
-DWITH_SHADOW=OFF \
-DWITH_PLATFORM_SERVER=OFF \
-DWITH_SAMPLE=ON \
-DWITH_PLATFORM_SERVER=OFF \
-DUSE_UNWIND=OFF \
-DSDL_USE_COMPILED_RESOURCES=OFF \
-DWITH_SWSCALE=OFF \
-DWITH_FFMPEG=OFF \
-DWITH_SIMD=ON \
-DWITH_OPENH264=ON \
-DWITH_WEBVIEW=OFF \
-DWITH_LIBRESSL=ON \
-DWITH_MANPAGES=OFF \
-DZLIB_INCLUDE_DIR="$INSTALL_BASE/include" \
-DZLIB_LIBRARY="$INSTALL_BASE/lib/libzlibstatic.a"
"$BUILD_BASE/freerdp" \
-S "$SCRIPT_PATH/.." \
-DWITH_SERVER=ON \
-DWITH_SHADOW=OFF \
-DWITH_PLATFORM_SERVER=OFF \
-DWITH_SAMPLE=ON \
-DWITH_PLATFORM_SERVER=OFF \
-DUSE_UNWIND=OFF \
-DSDL_USE_COMPILED_RESOURCES=$ARG_COMPILED_RES \
-DWITH_SDL_IMAGE_DIALOGS=ON \
-DWITH_SDL_LINK_SHARED=$ARG_SHARED \
-DWITH_CLIENT_SDL2=OFF \
-DWITH_SWSCALE=$FFMPEG \
-DWITH_FFMPEG=$FFMPEG \
-DWITH_SIMD=ON \
-DWITH_OPENH264=$OPENH264 \
-DWITH_WEBVIEW=OFF \
-DWITH_LIBRESSL=ON \
-DWITH_MANPAGES=OFF