From 6615fc79d61a4dab5bcf77668ef67caa73f2537d Mon Sep 17 00:00:00 2001 From: Stenzek Date: Fri, 18 Jul 2025 20:07:10 +1000 Subject: [PATCH] Qt: Work around autouic bug causing unnecessary recompiles --- src/duckstation-qt/CMakeLists.txt | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/duckstation-qt/CMakeLists.txt b/src/duckstation-qt/CMakeLists.txt index 30b77e2c3..982f55b71 100644 --- a/src/duckstation-qt/CMakeLists.txt +++ b/src/duckstation-qt/CMakeLists.txt @@ -1,7 +1,8 @@ include(CopyBaseTranslations) +set(CMAKE_AUTOUIC OFF) set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) set(SRCS aboutdialog.cpp @@ -125,6 +126,7 @@ set(SRCS postprocessingsettingswidget.cpp postprocessingsettingswidget.h postprocessingchainconfigwidget.ui + postprocessingoverlayconfigwidget.ui qthost.cpp qthost.h qtkeycodes.cpp @@ -179,6 +181,22 @@ target_compile_definitions(duckstation-qt PRIVATE QT_NO_EXCEPTIONS) add_core_resources(duckstation-qt) +# Automatically generate a list of .ui calls and call qt_wrap_ui() to generate targets. +# This is needed because otherwise CMake rebuilds all source files if any unrelated files change. +# See https://gitlab.kitware.com/cmake/cmake/-/issues/22531 and https://gitlab.kitware.com/cmake/cmake/-/issues/16776 +# Documentation says to use qt_add_ui(), but this generates a separate directory for every file. +# I'm concerned about arg length limits, so I manually invoke qt_wrap_ui(). +# Also see https://github.com/thorntonryan/autouic_example. +set(UI_FILES "") +foreach(src ${SRCS}) + if(src MATCHES "\\.ui$") + list(APPEND UI_FILES ${src}) + endif() +endforeach() +qt_wrap_ui(UI_SRCS SOURCES ${UI_FILES}) +target_sources(duckstation-qt PRIVATE ${UI_SRCS}) +target_include_directories(duckstation-qt PRIVATE "$") + if(WIN32) target_sources(duckstation-qt PRIVATE duckstation-qt.rc