Path: blob/master/src/duckstation-qt/CMakeLists.txt
4243 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.ui22audiostretchsettingsdialog.ui23autoupdaterwindow.cpp24autoupdaterwindow.h25autoupdaterwindow.ui26biossettingswidget.cpp27biossettingswidget.h28biossettingswidget.ui29colorpickerbutton.cpp30colorpickerbutton.h31consolesettingswidget.cpp32consolesettingswidget.h33consolesettingswidget.ui34controllerbindingwidget_analog_controller.ui35controllerbindingwidget_analog_joystick.ui36controllerbindingwidget_digital_controller.ui37controllerbindingwidget_guncon.ui38controllerbindingwidget_justifier.ui39controllerbindingwidget_mouse.ui40controllerbindingwidget_negcon.ui41controllerbindingwidget_negconrumble.ui42controllerbindingwidgets.cpp43controllerbindingwidgets.h44controllerbindingwidget.ui45controllerglobalsettingswidget.cpp46controllerglobalsettingswidget.h47controllerglobalsettingswidget.ui48controllerledsettingsdialog.ui49controllermacroeditwidget.ui50controllermacrowidget.ui51controllersettingswindow.cpp52controllersettingswindow.h53controllersettingswindow.ui54controllersettingwidgetbinder.h55coverdownloadwindow.cpp56coverdownloadwindow.h57coverdownloadwindow.ui58debuggeraddbreakpointdialog.ui59debuggercodeview.cpp60debuggercodeview.h61debuggermodels.cpp62debuggermodels.h63debuggerwindow.cpp64debuggerwindow.h65debuggerwindow.ui66displaywidget.cpp67displaywidget.h68emptygamelistwidget.ui69emulationsettingswidget.cpp70emulationsettingswidget.h71emulationsettingswidget.ui72foldersettingswidget.cpp73foldersettingswidget.h74foldersettingswidget.ui75gamecheatcodechoiceeditordialog.ui76gamecheatcodeeditordialog.ui77gamecheatsettingswidget.cpp78gamecheatsettingswidget.h79gamecheatsettingswidget.ui80gamepatchdetailswidget.ui81gamepatchsettingswidget.cpp82gamepatchsettingswidget.h83gamepatchsettingswidget.ui84gamelistrefreshthread.cpp85gamelistrefreshthread.h86gamelistsettingswidget.cpp87gamelistsettingswidget.h88gamelistsettingswidget.ui89gamelistwidget.cpp90gamelistwidget.h91gamelistwidget.ui92gamesummarywidget.cpp93gamesummarywidget.h94gamesummarywidget.ui95graphicssettingswidget.cpp96graphicssettingswidget.h97graphicssettingswidget.ui98hotkeysettingswidget.cpp99hotkeysettingswidget.h100inputbindingdialog.cpp101inputbindingdialog.h102inputbindingdialog.ui103inputbindingwidgets.cpp104inputbindingwidgets.h105interfacesettingswidget.cpp106interfacesettingswidget.h107interfacesettingswidget.ui108isobrowserwindow.cpp109isobrowserwindow.h110isobrowserwindow.ui111logwindow.cpp112logwindow.h113mainwindow.cpp114mainwindow.h115mainwindow.ui116memorycardeditorwindow.cpp117memorycardeditorwindow.h118memorycardeditorwindow.ui119memorycardrenamefiledialog.ui120memorycardsettingswidget.cpp121memorycardsettingswidget.h122memoryscannerwindow.cpp123memoryscannerwindow.h124memoryscannerwindow.ui125memoryviewwidget.cpp126memoryviewwidget.h127postprocessingsettingswidget.cpp128postprocessingsettingswidget.h129postprocessingchainconfigwidget.ui130postprocessingoverlayconfigwidget.ui131qthost.cpp132qthost.h133qtprogresscallback.cpp134qtprogresscallback.h135qtthemes.cpp136qttranslations.inl137qtutils.cpp138qtutils.h139resource.h140selectdiscdialog.cpp141selectdiscdialog.h142selectdiscdialog.ui143settingswindow.cpp144settingswindow.h145settingswindow.ui146settingwidgetbinder.h147setupwizarddialog.cpp148setupwizarddialog.h149setupwizarddialog.ui150texturereplacementsettingsdialog.ui151)152153set(TS_FILES154translations/duckstation-qt_de.ts155translations/duckstation-qt_en.ts156translations/duckstation-qt_es.ts157translations/duckstation-qt_es-ES.ts158translations/duckstation-qt_fr.ts159translations/duckstation-qt_he.ts160translations/duckstation-qt_id.ts161translations/duckstation-qt_it.ts162translations/duckstation-qt_ja.ts163translations/duckstation-qt_ko.ts164translations/duckstation-qt_nl.ts165translations/duckstation-qt_pl.ts166translations/duckstation-qt_pt-BR.ts167translations/duckstation-qt_pt-PT.ts168translations/duckstation-qt_ru.ts169translations/duckstation-qt_sv.ts170translations/duckstation-qt_tr.ts171translations/duckstation-qt_zh-CN.ts172)173174add_executable(duckstation-qt ${SRCS} ${QM_FILES})175target_precompile_headers(duckstation-qt PRIVATE "pch.h")176target_include_directories(duckstation-qt PRIVATE "${Qt6Gui_PRIVATE_INCLUDE_DIRS}" "${CMAKE_CURRENT_SOURCE_DIR}")177target_link_libraries(duckstation-qt PRIVATE core common imgui minizip scmversion Qt6::Core Qt6::Gui Qt6::Widgets)178179# Our Qt builds may have exceptions on, so force them off.180target_compile_definitions(duckstation-qt PRIVATE QT_NO_EXCEPTIONS)181182add_core_resources(duckstation-qt)183184# Automatically generate a list of .ui calls and call qt_wrap_ui() to generate targets.185# This is needed because otherwise CMake rebuilds all source files if any unrelated files change.186# See https://gitlab.kitware.com/cmake/cmake/-/issues/22531 and https://gitlab.kitware.com/cmake/cmake/-/issues/16776187# Documentation says to use qt_add_ui(), but this generates a separate directory for every file.188# I'm concerned about arg length limits, so I manually invoke qt_wrap_ui().189# Also see https://github.com/thorntonryan/autouic_example.190set(UI_FILES "")191foreach(src ${SRCS})192if(src MATCHES "\\.ui$")193list(APPEND UI_FILES ${src})194endif()195endforeach()196qt_wrap_ui(UI_SRCS SOURCES ${UI_FILES})197target_sources(duckstation-qt PRIVATE ${UI_SRCS})198target_include_directories(duckstation-qt PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")199200if(WIN32)201target_sources(duckstation-qt PRIVATE202duckstation-qt.rc203vcruntimecheck.cpp204)205206# We want a Windows subsystem application not console.207set_target_properties(duckstation-qt PROPERTIES208WIN32_EXECUTABLE TRUE209DEBUG_POSTFIX "-debug")210211# Copy in Qt DLLs. Borrowed from Dolphin.212get_target_property(MOC_EXECUTABLE_LOCATION Qt6::moc IMPORTED_LOCATION)213get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY)214find_program(WINDEPLOYQT_EXE windeployqt HINTS "${QT_BINARY_DIRECTORY}")215add_custom_command(TARGET duckstation-qt POST_BUILD216COMMAND "${CMAKE_COMMAND}" -E env PATH="${QT_BINARY_DIRECTORY}"217"${WINDEPLOYQT_EXE}" --libdir="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"218--plugindir="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/QtPlugins"219$<IF:$<CONFIG:Debug>,--debug,--release>220--no-compiler-runtime221--no-system-d3d-compiler222--no-system-dxc-compiler223--no-translations224"$<TARGET_FILE:duckstation-qt>"225)226add_custom_command(TARGET duckstation-qt POST_BUILD227COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/qt.conf.win" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/qt.conf"228)229#set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/translations")230231set(DEPS_TO_COPY cpuinfo.dll discord-rpc.dll dxcompiler.dll dxil.dll freetype.dll harfbuzz.dll jpeg62.dll libpng16.dll232libsharpyuv.dll libwebp.dll libwebpdemux.dll libwebpmux.dll plutosvg.dll SDL3.dll shaderc_shared.dll233soundtouch.dll spirv-cross-c-shared.dll zlib1.dll zstd.dll)234foreach(DEP ${DEPS_TO_COPY})235list(APPEND DEP_BINS "${CMAKE_PREFIX_PATH}/bin/${DEP}")236endforeach()237add_custom_command(TARGET duckstation-qt POST_BUILD238COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DEP_BINS} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"239)240if(CMAKE_BUILD_TYPE MATCHES "Debug|Devel")241get_property(WINPIXEVENTRUNTIME_DLL TARGET WinPixEventRuntime::WinPixEventRuntime PROPERTY IMPORTED_LOCATION)242message(STATUS WP "${WINPIXEVENTRUNTIME_DLL}")243add_custom_command(TARGET duckstation-qt POST_BUILD244COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WINPIXEVENTRUNTIME_DLL}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"245)246endif()247elseif(APPLE)248# Don't generate a bundle for XCode, it makes code signing fail...249if(NOT CMAKE_GENERATOR MATCHES "Xcode")250get_scm_version()251set(BUNDLE_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DuckStation.app)252set_target_properties(duckstation-qt PROPERTIES253MACOSX_BUNDLE true254MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in255OUTPUT_NAME DuckStation256)257258# Inject Qt Libraries into bundle.259if(NOT SKIP_POSTPROCESS_BUNDLE)260find_program(MACDEPLOYQT_EXE macdeployqt HINTS "${QT_BINARY_DIRECTORY}")261add_custom_target(duckstation-postprocess-bundle ALL262COMMAND "${MACDEPLOYQT_EXE}" "${BUNDLE_PATH}" -no-strip263)264add_dependencies(duckstation-postprocess-bundle duckstation-qt)265endif()266endif()267268# Copy icon into the bundle269target_sources(duckstation-qt PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/DuckStation.icns")270set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/DuckStation.icns" PROPERTIES MACOSX_PACKAGE_LOCATION Resources)271endif()272273if(ALLOW_INSTALL)274# Install main binary.275install(TARGETS duckstation-qt RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")276endif()277278# Compile qrc to a binary file.279if(NOT APPLE)280set(RCC_FILE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/duckstation-qt.rcc")281qt_add_binary_resources(duckstation-qt-rcc resources/duckstation-qt.qrc DESTINATION ${RCC_FILE} OPTIONS -no-compress)282add_dependencies(duckstation-qt duckstation-qt-rcc)283else()284set(RCC_FILE "${CMAKE_CURRENT_BINARY_DIR}/duckstation-qt.rcc")285qt_add_binary_resources(duckstation-qt-rcc resources/duckstation-qt.qrc DESTINATION ${RCC_FILE} OPTIONS -no-compress)286add_dependencies(duckstation-qt duckstation-qt-rcc)287target_sources(duckstation-qt PRIVATE ${RCC_FILE})288set_source_files_properties(${RCC_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)289endif()290291292# Translation setup.293qt_add_lrelease(duckstation-qt TS_FILES ${TS_FILES} QM_FILES_OUTPUT_VARIABLE QM_FILES)294if(NOT APPLE)295set(QM_OUTPUT_DIR "$<TARGET_FILE_DIR:duckstation-qt>/translations")296add_custom_command(TARGET duckstation-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${QM_OUTPUT_DIR}")297foreach (QM_FILE IN LISTS QM_FILES)298get_filename_component(QM_FILE_NAME ${QM_FILE} NAME)299add_custom_command(TARGET duckstation-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${QM_FILE}" "${QM_OUTPUT_DIR}/${QM_FILE_NAME}")300if(ALLOW_INSTALL)301install(FILES "${QM_FILE}" DESTINATION "${CMAKE_INSTALL_BINDIR}/translations")302endif()303endforeach()304else()305foreach (QM_FILE IN LISTS QM_FILES)306target_sources(duckstation-qt PRIVATE ${QM_FILE})307set_source_files_properties(${QM_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/translations)308endforeach()309endif()310copy_base_translations(duckstation-qt)311312313