diff --git a/.github/scripts/build.sh b/.github/scripts/build.sh index a871538634..83f01cca28 100755 --- a/.github/scripts/build.sh +++ b/.github/scripts/build.sh @@ -49,6 +49,9 @@ fi if [[ "$PLATFORM" =~ (mingw|cygwin) ]]; then .github/scripts/toolchain/build-mingw-crt.sh + if [[ "$MINGW_LTO" = 1 ]]; then + LTO=1 .github/scripts/toolchain/build-mingw-crt.sh + fi fi if [[ "$PLATFORM" =~ mingw ]]; then .github/scripts/toolchain/build-mingw-winpthreads.sh @@ -75,6 +78,9 @@ fi if [[ "$PLATFORM" =~ (mingw|cygwin) ]]; then .github/scripts/toolchain/build-mingw.sh + if [[ "$MINGW_LTO" = 1 ]]; then + LTO=1 .github/scripts/toolchain/build-mingw.sh + fi fi if [[ "$PLATFORM" =~ cygwin ]]; then .github/scripts/toolchain/build-cygwin.sh 2 diff --git a/.github/scripts/config.sh b/.github/scripts/config.sh index 934fb4bcbc..b190217316 100644 --- a/.github/scripts/config.sh +++ b/.github/scripts/config.sh @@ -36,6 +36,10 @@ if [[ ("$PLATFORM" =~ (mingw|cygwin) && ! ("$CRT" =~ (msvcrt|ucrt))) || exit 1 fi +if [[ "$TOOLCHAIN_NAME" = aarch64-w64-mingw32-msvcrt ]]; then + MINGW_LTO=${MINGW_LTO:-1} +fi + SOURCE_PATH=${SOURCE_PATH:-$PWD/code} DOWNLOADS_PATH=${DOWNLOADS_PATH:-$PWD/downloads} PATCHES_PATH=${PATCHES_PATH:-$PWD/patches} diff --git a/.github/scripts/ffmpeg/build.sh b/.github/scripts/ffmpeg/build.sh index b0b6363c39..d5bafb5a38 100755 --- a/.github/scripts/ffmpeg/build.sh +++ b/.github/scripts/ffmpeg/build.sh @@ -17,7 +17,19 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$FFMPEG_BUILD_PATH/Makefile" ]]; then --enable-debug=3" fi - CFLAGS="-Wno-incompatible-pointer-types -fno-builtin-sin -fno-builtin-cos" \ + CFLAGS="-Wno-incompatible-pointer-types -fno-builtin-sin -fno-builtin-cos" + + if [[ "$LTO" = 1 ]]; then + CFLAGS=" \ + $CFLAGS \ + -fno-builtin" + HOST_OPTIONS=" \ + $HOST_OPTIONS \ + --enable-lto" + + fi + + CFLAGS=$CFLAGS \ $FFMPEG_SOURCE_PATH/configure \ --prefix=$FFMPEG_PATH \ --target-path="." \ diff --git a/.github/scripts/toolchain/build-gcc-stage1.sh b/.github/scripts/toolchain/build-gcc-stage1.sh index b526aef6d5..75cd0a5862 100755 --- a/.github/scripts/toolchain/build-gcc-stage1.sh +++ b/.github/scripts/toolchain/build-gcc-stage1.sh @@ -46,6 +46,7 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$GCC_BUILD_PATH/Makefile" ]]; then *mingw*) TARGET_OPTIONS="$TARGET_OPTIONS \ --enable-languages=c \ + --enable-lto \ --disable-isl-version-check \ --disable-rpath \ --disable-win32-registry \ @@ -64,7 +65,6 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$GCC_BUILD_PATH/Makefile" ]]; then --disable-shared \ --disable-bootstrap \ --disable-multilib \ - --disable-plugins \ --disable-gcov \ --disable-libatomic \ --disable-libgomp \ @@ -91,6 +91,13 @@ if [[ "$RUN_INSTALL" = 1 ]]; then rm -rf $GCC_BUILD_PATH fi echo "::endgroup::" + + lto_plugin_path=$(find $TOOLCHAIN_PATH/libexec/gcc/$TARGET -type f -name liblto_plugin.so | head -n 1) + if [ -n $lto_plugin_path ]; then + echo "::group::Install LTO plug-in" + ln -sf $lto_plugin_path $TOOLCHAIN_PATH/lib/bfd-plugins/liblto_plugin.so + echo "::endgroup::" + fi fi echo 'Success!' diff --git a/.github/scripts/toolchain/build-gcc.sh b/.github/scripts/toolchain/build-gcc.sh index 0cc49f942a..d0eebb1a1e 100755 --- a/.github/scripts/toolchain/build-gcc.sh +++ b/.github/scripts/toolchain/build-gcc.sh @@ -124,6 +124,13 @@ if [[ "$RUN_INSTALL" = 1 ]]; then rm -rf $GCC_BUILD_PATH fi echo "::endgroup::" + + lto_plugin_path=$(find $TOOLCHAIN_PATH/lib/gcc/$TARGET -type f -name liblto_plugin.so | head -n 1) + if [ -n $lto_plugin_path ]; then + echo "::group::Install LTO plug-in" + ln -sf $lto_plugin_path $TOOLCHAIN_PATH/lib/bfd-plugins/liblto_plugin.so + echo "::endgroup::" + fi fi echo 'Success!' diff --git a/.github/scripts/toolchain/build-mingw-crt.sh b/.github/scripts/toolchain/build-mingw-crt.sh index 411b0f66db..dcf56b0dd1 100755 --- a/.github/scripts/toolchain/build-mingw-crt.sh +++ b/.github/scripts/toolchain/build-mingw-crt.sh @@ -2,7 +2,13 @@ source `dirname ${BASH_SOURCE[0]}`/../config.sh -MINGW_BUILD_PATH=$BUILD_PATH/mingw-crt +if [[ "$LTO" = 1 ]]; then + MINGW_BUILD_PATH=$BUILD_PATH/mingw-crt-lto + INSTALL_PATH=$TOOLCHAIN_PATH/$TARGET/lto +else + MINGW_BUILD_PATH=$BUILD_PATH/mingw-crt + INSTALL_PATH=$TOOLCHAIN_PATH/$TARGET +fi mkdir -p $MINGW_BUILD_PATH cd $MINGW_BUILD_PATH @@ -16,6 +22,12 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$MINGW_BUILD_PATH/Makefile" ]]; then --enable-debug" fi + if [ "$LTO" = 1 ] ; then + CFLAGS="$CFLAGS \ + -flto \ + -fno-builtin" + fi + case "$ARCH" in x86_64) TARGET_OPTIONS="$TARGET_OPTIONS \ @@ -39,12 +51,12 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$MINGW_BUILD_PATH/Makefile" ]]; then *cygwin*) TARGET_OPTIONS="$TARGET_OPTIONS \ --enable-w32api" - ;; + ;; *mingw*) TARGET_OPTIONS="$TARGET_OPTIONS \ --enable-wildcard \ --disable-dependency-tracking" - ;; + ;; esac case "$CRT" in @@ -59,7 +71,7 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$MINGW_BUILD_PATH/Makefile" ]]; then esac $SOURCE_PATH/$MINGW_VERSION/mingw-w64-crt/configure \ - --prefix=$TOOLCHAIN_PATH/$TARGET \ + --prefix=$INSTALL_PATH \ --build=$BUILD \ --host=$TARGET \ $HOST_OPTIONS \ diff --git a/.github/scripts/toolchain/build-mingw.sh b/.github/scripts/toolchain/build-mingw.sh index f2f5c3cbf0..976f7af92d 100755 --- a/.github/scripts/toolchain/build-mingw.sh +++ b/.github/scripts/toolchain/build-mingw.sh @@ -2,7 +2,13 @@ source `dirname ${BASH_SOURCE[0]}`/../config.sh -MINGW_BUILD_PATH=$BUILD_PATH/mingw +if [[ "$LTO" = 1 ]]; then + MINGW_BUILD_PATH=$BUILD_PATH/mingw-lto + INSTALL_PATH=$TOOLCHAIN_PATH/$TARGET/lto +else + MINGW_BUILD_PATH=$BUILD_PATH/mingw + INSTALL_PATH=$TOOLCHAIN_PATH/$TARGET +fi mkdir -p $MINGW_BUILD_PATH cd $MINGW_BUILD_PATH @@ -16,6 +22,12 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$MINGW_BUILD_PATH/Makefile" ]]; then --enable-debug" fi + if [[ "$LTO" = 1 ]]; then + CFLAGS="$CFLAGS \ + -flto \ + -fno-builtin" + fi + case "$ARCH" in x86_64) TARGET_OPTIONS="$TARGET_OPTIONS \ @@ -39,12 +51,12 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$MINGW_BUILD_PATH/Makefile" ]]; then *cygwin*) TARGET_OPTIONS="$TARGET_OPTIONS \ --enable-w32api" - ;; + ;; *mingw*) TARGET_OPTIONS="$TARGET_OPTIONS \ --enable-wildcard \ --disable-dependency-tracking" - ;; + ;; esac case "$CRT" in @@ -59,7 +71,7 @@ if [[ "$RUN_CONFIG" = 1 ]] || [[ ! -f "$MINGW_BUILD_PATH/Makefile" ]]; then esac $SOURCE_PATH/$MINGW_VERSION/configure \ - --prefix=$TOOLCHAIN_PATH/$TARGET \ + --prefix=$INSTALL_PATH \ --build=$BUILD \ --host=$TARGET \ $HOST_OPTIONS \