FreeRDP/scripts/mingw.sh
akallabeth 635b4f234f
[ci,mingw] add option to clean
allow cleaning the build and install directories before a new build
2025-02-25 17:15:29 +01:00

249 lines
5.8 KiB
Bash
Executable File

#!/bin/bash -xe
#
# 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")
SRC_BASE="$SCRIPT_PATH/../build-mingw/src"
BUILD_BASE="$SCRIPT_PATH/../build-mingw/build"
INSTALL_BASE="$SCRIPT_PATH/../build-mingw/install"
CLEAN=0
CLONE=1
DEPS=1
BUILD=1
FFMPEG=0
OPENH264=0
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
;;
-c | --no-clone)
CLONE=0
;;
--clean-first)
CLEAN=1
;;
-d | --no-deps)
DEPS=0
;;
-f | --with-ffmpeg)
FFMPEG=1
;;
-o | --with-openh264)
OPENH264=1
;;
-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] [--clean-first]"
exit 1
;;
esac
done
ARG_COMPILED_RES=1
if [ $ARG_SHARED -ne 0 ]; then
ARG_COMPILED_RES=0
fi
if [ $CLEAN -ne 0 ]; then
rm -rf "$BUILD_BASE"
rm -rf "$INSTALL_BASE"
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" \
-DBUILD_SHARED_LIBS=$ARG_SHARED \
-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.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
fi
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 \
-DZLIB_BUILD_EXAMPLES=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 \
-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_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 \
-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
# 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
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=$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