Path: blob/master/src/duckstation-qt/CMakeLists.txt
7652 views
include(CopyBaseTranslations)12set(CMAKE_AUTOUIC OFF)3set(CMAKE_AUTOMOC ON)4set(CMAKE_AUTORCC ON)56set(SRCS7aboutdialog.cpp8aboutdialog.h9aboutdialog.ui10achievementlogindialog.cpp11achievementlogindialog.h12achievementlogindialog.ui13achievementsettingswidget.cpp14achievementsettingswidget.h15achievementsettingswidget.ui16advancedsettingswidget.cpp17advancedsettingswidget.h18advancedsettingswidget.ui19audiosettingswidget.cpp20audiosettingswidget.h21audiosettingswidget.ui22autoupdaterdialog.cpp23autoupdaterdialog.h24autoupdaterdialog.ui25biossettingswidget.cpp26biossettingswidget.h27biossettingswidget.ui28colorpickerbutton.cpp29colorpickerbutton.h30capturesettingswidget.cpp31capturesettingswidget.h32capturesettingswidget.ui33consolesettingswidget.cpp34consolesettingswidget.h35consolesettingswidget.ui36controllerbindingwidget_analog_controller.ui37controllerbindingwidget_analog_joystick.ui38controllerbindingwidget_digital_controller.ui39controllerbindingwidget_guncon.ui40controllerbindingwidget_justifier.ui41controllerbindingwidget_mouse.ui42controllerbindingwidget_negcon.ui43controllerbindingwidget_negconrumble.ui44controllerbindingwidgets.cpp45controllerbindingwidgets.h46controllerbindingwidget.ui47controllerglobalsettingswidget.cpp48controllerglobalsettingswidget.h49controllerglobalsettingswidget.ui50controllermacroeditwidget.ui51controllersettingswindow.cpp52controllersettingswindow.h53controllersettingswindow.ui54controllersettingwidgetbinder.h55coverdownloadwindow.cpp56coverdownloadwindow.h57coverdownloadwindow.ui58debuggeraddbreakpointdialog.ui59debuggercodeview.cpp60debuggercodeview.h61debuggermodels.cpp62debuggermodels.h63debuggerwindow.cpp64debuggerwindow.h65debuggerwindow.ui66displaywidget.cpp67displaywidget.h68editgameserialdialog.ui69emptygamelistwidget.ui70emulationsettingswidget.cpp71emulationsettingswidget.h72emulationsettingswidget.ui73foldersettingswidget.cpp74foldersettingswidget.h75foldersettingswidget.ui76gamecheatcodechoiceeditordialog.ui77gamecheatcodeeditordialog.ui78gamecheatsettingswidget.cpp79gamecheatsettingswidget.h80gamecheatsettingswidget.ui81gamepatchdetailswidget.ui82gamepatchsettingswidget.cpp83gamepatchsettingswidget.h84gamepatchsettingswidget.ui85gamelistrefreshthread.cpp86gamelistrefreshthread.h87gamelistsettingswidget.cpp88gamelistsettingswidget.h89gamelistsettingswidget.ui90gamelistwidget.cpp91gamelistwidget.h92gamelistwidget.ui93gamesummarywidget.cpp94gamesummarywidget.h95gamesummarywidget.ui96graphicssettingswidget.cpp97graphicssettingswidget.h98graphicssettingswidget.ui99hotkeysettingswidget.cpp100hotkeysettingswidget.h101inputbindingdialog.cpp102inputbindingdialog.h103inputbindingdialog.ui104inputbindingwidgets.cpp105inputbindingwidgets.h106interfacesettingswidget.cpp107interfacesettingswidget.h108interfacesettingswidget.ui109isobrowserwindow.cpp110isobrowserwindow.h111isobrowserwindow.ui112logwindow.cpp113logwindow.h114mainwindow.cpp115mainwindow.h116mainwindow.ui117memorycardeditorwindow.cpp118memorycardeditorwindow.h119memorycardeditorwindow.ui120memorycardrenamefiledialog.ui121memorycardsettingswidget.cpp122memorycardsettingswidget.h123memoryeditorwindow.cpp124memoryeditorwindow.h125memoryeditorwindow.ui126memoryscannerwindow.cpp127memoryscannerwindow.h128memoryscannerwindow.ui129memoryviewwidget.cpp130memoryviewwidget.h131osdsettingswidget.cpp132osdsettingswidget.h133osdsettingswidget.ui134postprocessingsettingswidget.cpp135postprocessingsettingswidget.h136postprocessingchainconfigwidget.ui137postprocessingoverlayconfigwidget.ui138postprocessingselectshaderdialog.ui139qthost.cpp140qthost.h141qtprogresscallback.cpp142qtprogresscallback.h143qtthemes.cpp144qttranslations.inl145qtutils.cpp146qtutils.h147qtwindowinfo.cpp148qtwindowinfo.h149resource.h150selectdiscdialog.cpp151selectdiscdialog.h152selectdiscdialog.ui153settingswindow.cpp154settingswindow.h155settingswindow.ui156settingwidgetbinder.h157setupwizarddialog.cpp158setupwizarddialog.h159setupwizarddialog.ui160texturereplacementsettingsdialog.ui161togglebutton.cpp162togglebutton.h163)164165set(TS_FILES166translations/duckstation-qt_de.ts167translations/duckstation-qt_en.ts168translations/duckstation-qt_es.ts169translations/duckstation-qt_es-ES.ts170translations/duckstation-qt_fr.ts171translations/duckstation-qt_he.ts172translations/duckstation-qt_id.ts173translations/duckstation-qt_it.ts174translations/duckstation-qt_ja.ts175translations/duckstation-qt_ko.ts176translations/duckstation-qt_nl.ts177translations/duckstation-qt_pl.ts178translations/duckstation-qt_pt-BR.ts179translations/duckstation-qt_pt-PT.ts180translations/duckstation-qt_ru.ts181translations/duckstation-qt_sv.ts182translations/duckstation-qt_tr.ts183translations/duckstation-qt_zh-CN.ts184)185186add_executable(duckstation-qt ${SRCS} ${QM_FILES})187target_precompile_headers(duckstation-qt PRIVATE "pch.h")188target_include_directories(duckstation-qt PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/..")189target_link_libraries(duckstation-qt PRIVATE core common imgui minizip scmversion Qt6::Core Qt6::Gui Qt6::GuiPrivate Qt6::Widgets)190191if(LINUX)192target_link_libraries(duckstation-qt PRIVATE Qt6::DBus)193endif()194195# Our Qt builds may have exceptions on, so force them off.196target_compile_definitions(duckstation-qt PRIVATE QT_NO_EXCEPTIONS QT_NO_SIGNALS_SLOTS_KEYWORDS)197198add_core_resources(duckstation-qt)199200# Automatically generate a list of .ui calls and call qt_wrap_ui() to generate targets.201# This is needed because otherwise CMake rebuilds all source files if any unrelated files change.202# See https://gitlab.kitware.com/cmake/cmake/-/issues/22531 and https://gitlab.kitware.com/cmake/cmake/-/issues/16776203# Documentation says to use qt_add_ui(), but this generates a separate directory for every file.204# I'm concerned about arg length limits, so I manually invoke qt_wrap_ui().205# Also see https://github.com/thorntonryan/autouic_example.206set(UI_FILES "")207foreach(src ${SRCS})208if(src MATCHES "\\.ui$")209list(APPEND UI_FILES ${src})210endif()211endforeach()212qt_wrap_ui(UI_SRCS SOURCES ${UI_FILES})213target_sources(duckstation-qt PRIVATE ${UI_SRCS})214target_include_directories(duckstation-qt PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")215216if(WIN32)217target_sources(duckstation-qt PRIVATE218duckstation-qt.rc219vcruntimecheck.cpp220)221222# Needed to enable RAIntegration.223target_link_libraries(duckstation-qt PRIVATE rcheevos)224225# We want a Windows subsystem application not console.226set_target_properties(duckstation-qt PROPERTIES227WIN32_EXECUTABLE TRUE228DEBUG_POSTFIX "-debug")229230# Copy in Qt DLLs. Borrowed from Dolphin.231get_target_property(MOC_EXECUTABLE_LOCATION Qt6::moc IMPORTED_LOCATION)232get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY)233find_program(WINDEPLOYQT_EXE windeployqt HINTS "${QT_BINARY_DIRECTORY}")234add_custom_command(TARGET duckstation-qt POST_BUILD235COMMAND "${CMAKE_COMMAND}" -E env PATH="${QT_BINARY_DIRECTORY}"236"${WINDEPLOYQT_EXE}" --libdir="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"237--plugindir="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/QtPlugins"238$<IF:$<CONFIG:Debug>,--debug,--release>239--no-compiler-runtime240--no-system-d3d-compiler241--no-system-dxc-compiler242--no-translations243"$<TARGET_FILE:duckstation-qt>"244)245add_custom_command(TARGET duckstation-qt POST_BUILD246COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/qt.conf.win" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/qt.conf"247)248#set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/translations")249250set(DEPS_TO_COPY cpuinfo.dll discord-rpc.dll dxcompiler.dll dxil.dll freetype.dll harfbuzz.dll jpeg62.dll libpng16.dll251libsharpyuv.dll libwebp.dll libwebpdemux.dll libwebpmux.dll plutosvg.dll SDL3.dll shaderc_shared.dll252soundtouch.dll spirv-cross-c-shared.dll zip.dll zlib1.dll zstd.dll)253foreach(DEP ${DEPS_TO_COPY})254list(APPEND DEP_BINS "${CMAKE_PREFIX_PATH}/bin/${DEP}")255endforeach()256add_custom_command(TARGET duckstation-qt POST_BUILD257COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DEP_BINS} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"258)259if(CMAKE_BUILD_TYPE MATCHES "Debug|Devel")260get_property(WINPIXEVENTRUNTIME_DLL TARGET WinPixEventRuntime::WinPixEventRuntime PROPERTY IMPORTED_LOCATION)261message(STATUS WP "${WINPIXEVENTRUNTIME_DLL}")262add_custom_command(TARGET duckstation-qt POST_BUILD263COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WINPIXEVENTRUNTIME_DLL}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"264)265endif()266elseif(APPLE)267# Don't generate a bundle for XCode, it makes code signing fail...268get_scm_version()269set(BUNDLE_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DuckStation.app)270set_target_properties(duckstation-qt PROPERTIES271MACOSX_BUNDLE true272MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in273OUTPUT_NAME DuckStation274)275276if(CMAKE_GENERATOR MATCHES "Xcode")277set_target_properties(duckstation-qt PROPERTIES278XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""279XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED NO280XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED NO281)282elseif(NOT SKIP_POSTPROCESS_BUNDLE)283# Inject Qt Libraries into bundle.284find_program(MACDEPLOYQT_EXE macdeployqt HINTS "${QT_BINARY_DIRECTORY}")285add_custom_target(duckstation-postprocess-bundle ALL286COMMAND "${MACDEPLOYQT_EXE}" "${BUNDLE_PATH}" -no-strip287)288add_dependencies(duckstation-postprocess-bundle duckstation-qt)289endif()290291# Copy icon into the bundle292target_sources(duckstation-qt PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/DuckStation.icns")293set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/DuckStation.icns" PROPERTIES MACOSX_PACKAGE_LOCATION Resources)294endif()295296# Compile qrc to a binary file.297if(NOT APPLE)298set(RCC_FILE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/duckstation-qt.rcc")299qt_add_binary_resources(duckstation-qt-rcc resources/duckstation-qt.qrc DESTINATION ${RCC_FILE} OPTIONS -no-compress)300add_dependencies(duckstation-qt duckstation-qt-rcc)301302# Need to ensure the resources directory exists, it might not. Happens when low CPU count and parallel builds.303add_custom_target(duckstation-qt-rcc-mkdir COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources")304add_dependencies(duckstation-qt-rcc duckstation-qt-rcc-mkdir)305else()306set(RCC_FILE "${CMAKE_CURRENT_BINARY_DIR}/duckstation-qt.rcc")307qt_add_binary_resources(duckstation-qt-rcc resources/duckstation-qt.qrc DESTINATION ${RCC_FILE} OPTIONS -no-compress)308add_dependencies(duckstation-qt duckstation-qt-rcc)309target_sources(duckstation-qt PRIVATE ${RCC_FILE})310set_source_files_properties(${RCC_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)311endif()312313314# Translation setup.315qt_add_lrelease(duckstation-qt TS_FILES ${TS_FILES} QM_FILES_OUTPUT_VARIABLE QM_FILES)316if(NOT APPLE)317set(QM_OUTPUT_DIR "$<TARGET_FILE_DIR:duckstation-qt>/translations")318add_custom_command(TARGET duckstation-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${QM_OUTPUT_DIR}")319foreach (QM_FILE IN LISTS QM_FILES)320get_filename_component(QM_FILE_NAME ${QM_FILE} NAME)321add_custom_command(TARGET duckstation-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${QM_FILE}" "${QM_OUTPUT_DIR}/${QM_FILE_NAME}")322endforeach()323else()324foreach (QM_FILE IN LISTS QM_FILES)325target_sources(duckstation-qt PRIVATE ${QM_FILE})326set_source_files_properties(${QM_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/translations)327endforeach()328endif()329copy_base_translations(duckstation-qt)330331332