diff --git a/.ci/linux/build.sh b/.ci/linux/build.sh index 8e3a452809..62bfc861c6 100755 --- a/.ci/linux/build.sh +++ b/.ci/linux/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# SPDX-FileCopyrightText: 2025 eden Emulator Project +# SPDX-FileCopyrightText: 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later case "$1" in @@ -52,8 +52,6 @@ native) ;; esac -export ARCH_FLAGS="$ARCH_FLAGS -O3" - if [ -z "$NPROC" ]; then NPROC="$(nproc)" fi @@ -61,53 +59,41 @@ fi if [ "$1" != "" ]; then shift; fi if [ "$TARGET" = "appimage" ]; then - export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON -DYUZU_ROOM_STANDALONE=OFF -DYUZU_CMD=OFF) + export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON) else # For the linux-fresh verification target, verify compilation without PCH as well. export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DYUZU_USE_PRECOMPILED_HEADERS=OFF) fi -if [ "$DEVEL" != "true" ]; then - export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DENABLE_QT_UPDATE_CHECKER=ON) -fi +EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) -if [ "$USE_WEBENGINE" = "true" ]; then - WEBENGINE=ON -else - WEBENGINE=OFF -fi - -if [ "$USE_MULTIMEDIA" = "false" ]; then - MULTIMEDIA=OFF -else - MULTIMEDIA=ON -fi - -if [ -z "$BUILD_TYPE" ]; then - export BUILD_TYPE="Release" -fi - -export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) +echo "${EXTRA_CMAKE_FLAGS[@]}" mkdir -p build && cd build cmake .. -G Ninja \ - -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE:-Release}" \ -DENABLE_QT_TRANSLATION=ON \ -DUSE_DISCORD_PRESENCE=ON \ - -DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \ - -DCMAKE_C_FLAGS="$ARCH_FLAGS" \ - -DYUZU_USE_BUNDLED_QT=OFF \ -DYUZU_USE_BUNDLED_SDL2=OFF \ -DYUZU_USE_EXTERNAL_SDL2=ON \ + -DBUILD_TESTING=OFF \ -DYUZU_TESTS=OFF \ - -DYUZU_USE_QT_MULTIMEDIA=$MULTIMEDIA \ - -DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \ - -DYUZU_USE_FASTER_LD=ON \ + -DDYNARMIC_TESTS=OFF \ + -DYUZU_CMD=OFF \ + -DYUZU_ROOM_STANDALONE=OFF \ + -DYUZU_USE_QT_MULTIMEDIA="${USE_MULTIMEDIA:-false}" \ + -DYUZU_USE_QT_WEB_ENGINE="${USE_WEBENGINE:-false}" \ -DYUZU_ENABLE_LTO=ON \ -DDYNARMIC_ENABLE_LTO=ON \ + -DYUZU_USE_BUNDLED_QT="${BUNDLE_QT:-false}" \ + -DUSE_CCACHE="${CCACHE:-false}" \ + -DENABLE_QT_UPDATE_CHECKER="${DEVEL:-true}" \ + -DYUZU_USE_FASTER_LD=ON \ + -DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \ + -DCMAKE_C_FLAGS="$ARCH_FLAGS" \ "${EXTRA_CMAKE_FLAGS[@]}" -ninja -j${NPROC} +ninja -j"${NPROC}" if [ -d "bin/Release" ]; then strip -s bin/Release/* diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh index a0ab69a440..3b413b6de1 100644 --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -17,12 +17,14 @@ fi [ -z "$WINDEPLOYQT" ] && { echo "WINDEPLOYQT environment variable required."; exit 1; } -echo $EXTRA_CMAKE_FLAGS +EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) + +echo "${EXTRA_CMAKE_FLAGS[@]}" mkdir -p build && cd build cmake .. -G Ninja \ -DCMAKE_BUILD_TYPE="${BUILD_TYPE:-Release}" \ - -DENABLE_QT_TRANSLATION=ON \ + -DENABLE_QT_TRANSLATION=ON \ -DUSE_DISCORD_PRESENCE=ON \ -DYUZU_USE_BUNDLED_SDL2=ON \ -DBUILD_TESTING=OFF \ @@ -30,14 +32,14 @@ cmake .. -G Ninja \ -DDYNARMIC_TESTS=OFF \ -DYUZU_CMD=OFF \ -DYUZU_ROOM_STANDALONE=OFF \ - -DYUZU_USE_QT_MULTIMEDIA=${USE_MULTIMEDIA:-false} \ - -DYUZU_USE_QT_WEB_ENGINE=${USE_WEBENGINE:-false} \ + -DYUZU_USE_QT_MULTIMEDIA="${USE_MULTIMEDIA:-false}" \ + -DYUZU_USE_QT_WEB_ENGINE="${USE_WEBENGINE:-false}" \ -DYUZU_ENABLE_LTO=ON \ - -DCMAKE_EXE_LINKER_FLAGS=" /LTCG" \ + -DCMAKE_EXE_LINKER_FLAGS=" /LTCG" \ -DDYNARMIC_ENABLE_LTO=ON \ - -DYUZU_USE_BUNDLED_QT=${BUNDLE_QT:-false} \ - -DUSE_CCACHE=${CCACHE:-false} \ - -DENABLE_QT_UPDATE_CHECKER=${DEVEL:-true} \ + -DYUZU_USE_BUNDLED_QT="${BUNDLE_QT:-false}" \ + -DUSE_CCACHE="${CCACHE:-false}" \ + -DENABLE_QT_UPDATE_CHECKER="${DEVEL:-true}" \ "${EXTRA_CMAKE_FLAGS[@]}" \ "$@" diff --git a/CMakeLists.txt b/CMakeLists.txt index 673aab9e6e..a45f3b1855 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,6 +180,7 @@ CMAKE_DEPENDENT_OPTION(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}") option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT}) +set(DYNARMIC_USE_PRECOMPILED_HEADERS YUZU_USE_PRECOMPILED_HEADERS) # TODO(crueter): CI this? option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON) @@ -253,13 +254,27 @@ if (ANDROID) set(CMAKE_POLICY_VERSION_MINIMUM 3.5) # Workaround for Oboe endif() -if (YUZU_USE_PRECOMPILED_HEADERS) - if (MSVC AND CCACHE) - # buildcache does not properly cache PCH files, leading to compilation errors. - # See https://github.com/mbitsnbites/buildcache/discussions/230 - message(WARNING "buildcache does not properly support Precompiled Headers. Disabling PCH") - set(DYNARMIC_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) - set(YUZU_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE) +# Add option to enable CCache +option(USE_CCACHE "Use ccache for compilation" OFF) +set(CCACHE_PATH "ccache" CACHE STRING "Path to ccache binary") +if(USE_CCACHE) + find_program(CCACHE_BINARY ${CCACHE_PATH}) + if(CCACHE_BINARY) + message(STATUS "Found ccache at: ${CCACHE_BINARY}") + set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_BINARY}) + set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BINARY}) + if(WIN32) + message(WARNING "USE_CCACHE is unstable under Windows, errors may occur...") + # we need to downgrade debug info (/Zi -> /Z7) to use an older but more cacheable format + # See https://github.com/nanoant/CMakePCHCompiler/issues/21 + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + endif() + if (YUZU_USE_PRECOMPILED_HEADERS) + message(WARNING "YUZU_USE_PRECOMPILED_HEADERS reduce the number of USE_CCACHE files, consider disabling...") + endif() + else() + message(WARNING "USE_CCACHE enabled, but no executable found at: ${CCACHE_PATH}") endif() endif() diff --git a/CMakeModules/MSVCCache.cmake b/CMakeModules/MSVCCache.cmake deleted file mode 100644 index ba0d22d9ee..0000000000 --- a/CMakeModules/MSVCCache.cmake +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-FileCopyrightText: 2022 yuzu Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later - -# buildcache wrapper -OPTION(USE_CCACHE "Use buildcache for compilation" OFF) -IF(USE_CCACHE) - FIND_PROGRAM(CCACHE buildcache) - IF (CCACHE) - MESSAGE(STATUS "Using buildcache found in PATH") - SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) - SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) - ELSE(CCACHE) - MESSAGE(WARNING "USE_CCACHE enabled, but no buildcache executable found") - ENDIF(CCACHE) -ENDIF(USE_CCACHE) diff --git a/CMakeModules/MinGWClangCross.cmake b/CMakeModules/MinGWClangCross.cmake index 286a59a7ad..fd4f8fc1db 100644 --- a/CMakeModules/MinGWClangCross.cmake +++ b/CMakeModules/MinGWClangCross.cmake @@ -1,13 +1,17 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2022 yuzu Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -set(MINGW_PREFIX /usr/x86_64-w64-mingw32/) -set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR x86_64) +set(MINGW_FULL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32) +set(MINGW_PREFIX /usr/${MINGW_FULL_PREFIX}/) +set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX}) set(SDL2_PATH ${MINGW_PREFIX}) -set(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-) +set(MINGW_TOOL_PREFIX ${MINGW_FULL_PREFIX}-) # Specify the cross compiler set(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}clang) @@ -23,23 +27,9 @@ set(STRIP ${MINGW_TOOL_PREFIX}strip) set(WINDRES ${MINGW_TOOL_PREFIX}windres) set(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config) -# ccache wrapper -option(USE_CCACHE "Use ccache for compilation" OFF) -if(USE_CCACHE) - find_program(CCACHE ccache) - if(CCACHE) - message(STATUS "Using ccache found in PATH") - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) - set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) - else(CCACHE) - message(WARNING "USE_CCACHE enabled, but no ccache found") - endif(CCACHE) -endif(USE_CCACHE) - # Search for programs in the build host directories set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - # Echo modified cmake vars to screen for debugging purposes if(NOT DEFINED ENV{MINGW_DEBUG_INFO}) message("") diff --git a/CMakeModules/MinGWCross.cmake b/CMakeModules/MinGWCross.cmake index 61464f7dae..ce0f5cf4f1 100644 --- a/CMakeModules/MinGWCross.cmake +++ b/CMakeModules/MinGWCross.cmake @@ -1,16 +1,20 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + # SPDX-FileCopyrightText: 2018 tech4me # SPDX-License-Identifier: GPL-2.0-or-later -set(MINGW_PREFIX /usr/x86_64-w64-mingw32/) -set(CMAKE_SYSTEM_NAME Windows) -set(CMAKE_SYSTEM_PROCESSOR x86_64) # Actually a hack, w/o this will cause some strange errors -set(CMAKE_HOST_WIN32 TRUE) +set(CMAKE_HOST_WIN32 TRUE) +set(CMAKE_SYSTEM_PROCESSOR x86_64) +set(MINGW_FULL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32) +set(MINGW_PREFIX /usr/${MINGW_FULL_PREFIX}/) +set(CMAKE_SYSTEM_NAME Windows) -set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX}) -set(SDL2_PATH ${MINGW_PREFIX}) -set(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-) +set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX}) +set(SDL2_PATH ${MINGW_PREFIX}) +set(MINGW_TOOL_PREFIX ${MINGW_FULL_PREFIX}-) # Specify the cross compiler set(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}gcc) @@ -22,23 +26,9 @@ set(STRIP ${MINGW_TOOL_PREFIX}strip) set(WINDRES ${MINGW_TOOL_PREFIX}windres) set(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config) -# ccache wrapper -option(USE_CCACHE "Use ccache for compilation" OFF) -if(USE_CCACHE) - find_program(CCACHE ccache) - if(CCACHE) - message(STATUS "Using ccache found in PATH") - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) - set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE}) - else(CCACHE) - message(WARNING "USE_CCACHE enabled, but no ccache found") - endif(CCACHE) -endif(USE_CCACHE) - # Search for programs in the build host directories set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - # Echo modified cmake vars to screen for debugging purposes if(NOT DEFINED ENV{MINGW_DEBUG_INFO}) message("") diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index aba5451b6d..7f68970399 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -77,12 +77,21 @@ endif() # Sirit AddJsonPackage(sirit) -if(MSVC AND USE_CCACHE AND sirit_ADDED) - get_target_property(_opts sirit COMPILE_OPTIONS) - list(FILTER _opts EXCLUDE REGEX "/Zi") - list(APPEND _opts "/Z7") - set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${_opts}") -elseif(MSVC AND CXX_CLANG) +if(WIN32) + get_target_property(sirit_opts sirit COMPILE_OPTIONS) + # Remove Debug Info on ALL Release Builds + if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") + list(FILTER sirit_opts EXCLUDE REGEX "/Zi") + endif() + # Change to old-but-more-cacheable debug info WHEN using ccache + if(CCACHE_BINARY AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")) + list(FILTER sirit_opts EXCLUDE REGEX "/Zi") + list(APPEND sirit_opts "/Z7") + endif() + set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${sirit_opts}") +endif() + +if(MSVC AND CXX_CLANG) target_compile_options(sirit PRIVATE -Wno-error=unused-command-line-argument) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 184b049d06..720266f2b7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -101,17 +101,6 @@ if (MSVC AND NOT CXX_CLANG) ) endif() - if (USE_CCACHE OR YUZU_USE_PRECOMPILED_HEADERS) - # when caching, we need to use /Z7 to downgrade debug info to use an older but more cacheable format - # Precompiled headers are deleted if not using /Z7. See https://github.com/nanoant/CMakePCHCompiler/issues/21 - add_compile_options(/Z7) - # Avoid D9025 warning - string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") - string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") - else() - add_compile_options(/Zi) - endif() - if (ARCHITECTURE_x86_64) add_compile_options(/QIntel-jcc-erratum) endif()