From c4069eed02cf6191ca2a70cc78e9d9a718ecfa3b Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 20 Sep 2025 15:06:33 +1000 Subject: [PATCH] CMake: Avoid search path conflicts --- .../workflows/linux-cross-appimage-build.yml | 2 +- CMakeModules/DuckStationDependencies.cmake | 108 +++++++++++------- CMakeModules/DuckStationUtils.cmake | 4 +- src/duckstation-qt/CMakeLists.txt | 5 +- src/util/CMakeLists.txt | 1 - 5 files changed, 75 insertions(+), 45 deletions(-) diff --git a/.github/workflows/linux-cross-appimage-build.yml b/.github/workflows/linux-cross-appimage-build.yml index a15a779ff..f1543bda1 100644 --- a/.github/workflows/linux-cross-appimage-build.yml +++ b/.github/workflows/linux-cross-appimage-build.yml @@ -84,7 +84,7 @@ jobs: - name: Generate CMake shell: bash run: | - cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_TOOLCHAIN_FILE="$HOME/toolchain.cmake" -DLCONVERT_EXE="$HOME/deps/host/bin/lconvert" -DHOST_MIN_PAGE_SIZE=4096 -DHOST_MAX_PAGE_SIZE=16384 -DHOST_CACHE_LINE_SIZE=64 -DBUILD_QT_FRONTEND=ON -DBUILD_MINI_FRONTEND=ON + cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON -DCMAKE_TOOLCHAIN_FILE="$HOME/toolchain.cmake" -DCMAKE_PREFIX_PATH="$HOME/deps/cross" -DLCONVERT_EXE="$HOME/deps/host/bin/lconvert" -DHOST_MIN_PAGE_SIZE=4096 -DHOST_MAX_PAGE_SIZE=16384 -DHOST_CACHE_LINE_SIZE=64 -DBUILD_QT_FRONTEND=ON -DBUILD_MINI_FRONTEND=ON - name: Compile Build shell: bash diff --git a/CMakeModules/DuckStationDependencies.cmake b/CMakeModules/DuckStationDependencies.cmake index a13fcab33..aae072cd8 100644 --- a/CMakeModules/DuckStationDependencies.cmake +++ b/CMakeModules/DuckStationDependencies.cmake @@ -1,52 +1,52 @@ -# From PCSX2: On macOS, Mono.framework contains an ancient version of libpng. We don't want that. -# Avoid it by telling cmake to avoid finding frameworks while we search for libpng. -if(APPLE) - set(FIND_FRAMEWORK_BACKUP ${CMAKE_FIND_FRAMEWORK}) - set(CMAKE_FIND_FRAMEWORK NEVER) +# Set prefix path to look for our bundled dependencies first on Windows. +if(WIN32 AND CPU_ARCH_X64) + list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/dep/msvc/deps-x64") +elseif(WIN32 AND CPU_ARCH_ARM64) + list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/dep/msvc/deps-arm64") endif() # Enable threads everywhere. set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) +# pkg-config gets pulled transitively on some platforms. +if(NOT WIN32 AND NOT APPLE) + find_package(PkgConfig REQUIRED) +endif() + +# libpng relies on zlib, which we need the system version for on Mac. +find_package(ZLIB REQUIRED) + +# Enforce use of bundled dependencies to avoid conflicts with system libraries. +set(FIND_ROOT_PATH_BACKUP ${CMAKE_FIND_ROOT_PATH}) +set(FIND_ROOT_PATH_MODE_INCLUDE_BACKUP ${CMAKE_FIND_ROOT_PATH_MODE_INCLUDE}) +set(FIND_ROOT_PATH_MODE_LIBRARY_BACKUP ${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}) +set(FIND_ROOT_PATH_MODE_PACKAGE_BACKUP ${CMAKE_FIND_ROOT_PATH_MODE_PACKAGE}) +set(FIND_ROOT_PATH_MODE_PROGRAM_BACKUP ${CMAKE_FIND_ROOT_PATH_MODE_PROGRAM}) +set(CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH}) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) + +# Bundled dependencies. find_package(SDL3 3.2.22 REQUIRED) find_package(zstd 1.5.7 REQUIRED) find_package(WebP REQUIRED) # v1.4.0, spews an error on Linux because no pkg-config. -find_package(ZLIB REQUIRED) # 1.3, but Mac currently doesn't use it. find_package(PNG 1.6.50 REQUIRED) find_package(JPEG REQUIRED) -find_package(Freetype 2.13.3 REQUIRED) # 2.13.3, but flatpak is still on 2.13.2. +find_package(Freetype 2.13.3 REQUIRED) find_package(plutosvg 0.0.6 REQUIRED) find_package(cpuinfo REQUIRED) find_package(DiscordRPC 3.4.0 REQUIRED) find_package(SoundTouch 2.3.3 REQUIRED) find_package(libzip 1.11.4 REQUIRED) - -if(NOT WIN32) - find_package(CURL REQUIRED) -endif() - -if(ENABLE_X11) - find_package(X11 REQUIRED) - if (NOT X11_xcb_FOUND OR NOT X11_xcb_randr_FOUND OR NOT X11_X11_xcb_FOUND) - message(FATAL_ERROR "XCB, XCB-randr and X11-xcb are required") - endif() -endif() - -if(ENABLE_WAYLAND) - find_package(ECM REQUIRED NO_MODULE) - list(APPEND CMAKE_MODULE_PATH "${ECM_MODULE_PATH}") - find_package(Wayland REQUIRED Egl) -endif() - -if(BUILD_QT_FRONTEND) - find_package(Qt6 6.9.2 COMPONENTS Core Gui Widgets LinguistTools REQUIRED) -endif() - find_package(Shaderc REQUIRED) find_package(spirv_cross_c_shared REQUIRED) -if(LINUX) +if(NOT WIN32 AND NOT APPLE) + find_package(Libbacktrace REQUIRED) + # We need to add the rpath for shaderc to the executable. get_target_property(SHADERC_LIBRARY Shaderc::shaderc_shared IMPORTED_LOCATION) get_filename_component(SHADERC_LIBRARY_DIRECTORY ${SHADERC_LIBRARY} DIRECTORY) @@ -56,24 +56,52 @@ if(LINUX) list(APPEND CMAKE_BUILD_RPATH ${SPIRV_CROSS_LIBRARY_DIRECTORY}) endif() -if(LINUX) - find_package(UDEV REQUIRED) +# Restore system package search path. +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ${FIND_ROOT_PATH_MODE_INCLUDE_BACKUP}) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ${FIND_ROOT_PATH_MODE_LIBRARY_BACKUP}) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ${FIND_ROOT_PATH_MODE_PACKAGE_BACKUP}) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ${FIND_ROOT_PATH_MODE_PROGRAM_BACKUP}) +set(CMAKE_FIND_ROOT_PATH ${FIND_ROOT_PATH_BACKUP}) + +# Qt has transitive dependencies on system libs, so do it afterwards. +if(BUILD_QT_FRONTEND) + find_package(Qt6 6.9.2 COMPONENTS Core Gui Widgets LinguistTools REQUIRED) + + # Have to verify it down here, don't want users using unpatched Qt. + if(NOT Qt6_DIR MATCHES "^${CMAKE_PREFIX_PATH}") + message(FATAL_ERROR "Using incorrect Qt library. Check your dependencies.") + endif() endif() -if(NOT WIN32 AND NOT APPLE) - find_package(Libbacktrace REQUIRED) +# Libraries that are pulled in from host. +if(NOT WIN32) + find_package(CURL REQUIRED) + if(LINUX) + find_package(UDEV REQUIRED) + endif() + + if(NOT APPLE) + if(ENABLE_X11) + find_package(X11 REQUIRED) + if (NOT X11_xcb_FOUND OR NOT X11_xcb_randr_FOUND OR NOT X11_X11_xcb_FOUND) + message(FATAL_ERROR "XCB, XCB-randr and X11-xcb are required") + endif() + endif() + + if(ENABLE_WAYLAND) + find_package(ECM REQUIRED NO_MODULE) + list(APPEND CMAKE_MODULE_PATH "${ECM_MODULE_PATH}") + find_package(Wayland REQUIRED Egl) + endif() + endif() endif() -if(NOT ANDROID AND NOT WIN32) +if(NOT WIN32) find_package(FFMPEG 7.0.0 COMPONENTS avcodec avformat avutil swresample swscale) if(NOT FFMPEG_FOUND) message(WARNING "FFmpeg not found, using bundled headers.") endif() endif() -if(NOT ANDROID AND NOT FFMPEG_FOUND) +if(NOT FFMPEG_FOUND) set(FFMPEG_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/dep/ffmpeg/include") endif() - -if(APPLE) - set(CMAKE_FIND_FRAMEWORK ${FIND_FRAMEWORK_BACKUP}) -endif() diff --git a/CMakeModules/DuckStationUtils.cmake b/CMakeModules/DuckStationUtils.cmake index 058dafe19..cafe64b51 100644 --- a/CMakeModules/DuckStationUtils.cmake +++ b/CMakeModules/DuckStationUtils.cmake @@ -76,8 +76,8 @@ function(detect_architecture) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1" PARENT_SCOPE) elseif(MSVC AND NOT DISABLE_SSE4) # Clang defines these macros, MSVC does not. - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D__SSE3__ /D__SSE4_1__") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D__SSE3__ /D__SSE4_1__") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D__SSE3__ /D__SSE4_1__" PARENT_SCOPE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D__SSE3__ /D__SSE4_1__" PARENT_SCOPE) endif() elseif(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64" OR "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "arm64") AND CMAKE_SIZEOF_VOID_P EQUAL 8) # Might have an A64 kernel, e.g. Raspbian. diff --git a/src/duckstation-qt/CMakeLists.txt b/src/duckstation-qt/CMakeLists.txt index 7b246ca3c..dec1eb094 100644 --- a/src/duckstation-qt/CMakeLists.txt +++ b/src/duckstation-qt/CMakeLists.txt @@ -206,6 +206,9 @@ if(WIN32) vcruntimecheck.cpp ) + # Needed to enable RAIntegration. + target_link_libraries(duckstation-qt PRIVATE rcheevos) + # We want a Windows subsystem application not console. set_target_properties(duckstation-qt PROPERTIES WIN32_EXECUTABLE TRUE @@ -233,7 +236,7 @@ if(WIN32) set(DEPS_TO_COPY cpuinfo.dll discord-rpc.dll dxcompiler.dll dxil.dll freetype.dll harfbuzz.dll jpeg62.dll libpng16.dll libsharpyuv.dll libwebp.dll libwebpdemux.dll libwebpmux.dll plutosvg.dll SDL3.dll shaderc_shared.dll - soundtouch.dll spirv-cross-c-shared.dll zlib1.dll zstd.dll) + soundtouch.dll spirv-cross-c-shared.dll zip.dll zlib1.dll zstd.dll) foreach(DEP ${DEPS_TO_COPY}) list(APPEND DEP_BINS "${CMAKE_PREFIX_PATH}/bin/${DEP}") endforeach() diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt index 74984c090..d694b3546 100644 --- a/src/util/CMakeLists.txt +++ b/src/util/CMakeLists.txt @@ -274,7 +274,6 @@ elseif(NOT ANDROID) target_sources(util PRIVATE platform_misc_unix.cpp ) - find_package(PkgConfig REQUIRED) pkg_check_modules(DBUS REQUIRED dbus-1) target_include_directories(util PRIVATE ${DBUS_INCLUDE_DIRS})