Path: blob/master/src/duckstation-qt/CMakeLists.txt
4802 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.ui48controllermacroeditwidget.ui49controllermacrowidget.ui50controllersettingswindow.cpp51controllersettingswindow.h52controllersettingswindow.ui53controllersettingwidgetbinder.h54coverdownloadwindow.cpp55coverdownloadwindow.h56coverdownloadwindow.ui57debuggeraddbreakpointdialog.ui58debuggercodeview.cpp59debuggercodeview.h60debuggermodels.cpp61debuggermodels.h62debuggerwindow.cpp63debuggerwindow.h64debuggerwindow.ui65displaywidget.cpp66displaywidget.h67emptygamelistwidget.ui68emulationsettingswidget.cpp69emulationsettingswidget.h70emulationsettingswidget.ui71foldersettingswidget.cpp72foldersettingswidget.h73foldersettingswidget.ui74gamecheatcodechoiceeditordialog.ui75gamecheatcodeeditordialog.ui76gamecheatsettingswidget.cpp77gamecheatsettingswidget.h78gamecheatsettingswidget.ui79gamepatchdetailswidget.ui80gamepatchsettingswidget.cpp81gamepatchsettingswidget.h82gamepatchsettingswidget.ui83gamelistrefreshthread.cpp84gamelistrefreshthread.h85gamelistsettingswidget.cpp86gamelistsettingswidget.h87gamelistsettingswidget.ui88gamelistwidget.cpp89gamelistwidget.h90gamelistwidget.ui91gamesummarywidget.cpp92gamesummarywidget.h93gamesummarywidget.ui94graphicssettingswidget.cpp95graphicssettingswidget.h96graphicssettingswidget.ui97hotkeysettingswidget.cpp98hotkeysettingswidget.h99inputbindingdialog.cpp100inputbindingdialog.h101inputbindingdialog.ui102inputbindingwidgets.cpp103inputbindingwidgets.h104interfacesettingswidget.cpp105interfacesettingswidget.h106interfacesettingswidget.ui107isobrowserwindow.cpp108isobrowserwindow.h109isobrowserwindow.ui110logwindow.cpp111logwindow.h112mainwindow.cpp113mainwindow.h114mainwindow.ui115memorycardeditorwindow.cpp116memorycardeditorwindow.h117memorycardeditorwindow.ui118memorycardrenamefiledialog.ui119memorycardsettingswidget.cpp120memorycardsettingswidget.h121memoryeditorwindow.cpp122memoryeditorwindow.h123memoryeditorwindow.ui124memoryscannerwindow.cpp125memoryscannerwindow.h126memoryscannerwindow.ui127memoryviewwidget.cpp128memoryviewwidget.h129postprocessingsettingswidget.cpp130postprocessingsettingswidget.h131postprocessingchainconfigwidget.ui132postprocessingoverlayconfigwidget.ui133qthost.cpp134qthost.h135qtprogresscallback.cpp136qtprogresscallback.h137qtthemes.cpp138qttranslations.inl139qtutils.cpp140qtutils.h141resource.h142selectdiscdialog.cpp143selectdiscdialog.h144selectdiscdialog.ui145settingswindow.cpp146settingswindow.h147settingswindow.ui148settingwidgetbinder.h149setupwizarddialog.cpp150setupwizarddialog.h151setupwizarddialog.ui152texturereplacementsettingsdialog.ui153togglebutton.cpp154togglebutton.h155)156157set(TS_FILES158translations/duckstation-qt_de.ts159translations/duckstation-qt_en.ts160translations/duckstation-qt_es.ts161translations/duckstation-qt_es-ES.ts162translations/duckstation-qt_fr.ts163translations/duckstation-qt_he.ts164translations/duckstation-qt_id.ts165translations/duckstation-qt_it.ts166translations/duckstation-qt_ja.ts167translations/duckstation-qt_ko.ts168translations/duckstation-qt_nl.ts169translations/duckstation-qt_pl.ts170translations/duckstation-qt_pt-BR.ts171translations/duckstation-qt_pt-PT.ts172translations/duckstation-qt_ru.ts173translations/duckstation-qt_sv.ts174translations/duckstation-qt_tr.ts175translations/duckstation-qt_zh-CN.ts176)177178add_executable(duckstation-qt ${SRCS} ${QM_FILES})179target_precompile_headers(duckstation-qt PRIVATE "pch.h")180target_include_directories(duckstation-qt PRIVATE "${Qt6Gui_PRIVATE_INCLUDE_DIRS}" "${CMAKE_CURRENT_SOURCE_DIR}")181target_link_libraries(duckstation-qt PRIVATE core common imgui minizip scmversion Qt6::Core Qt6::Gui Qt6::Widgets)182183# Our Qt builds may have exceptions on, so force them off.184target_compile_definitions(duckstation-qt PRIVATE QT_NO_EXCEPTIONS)185186add_core_resources(duckstation-qt)187188# Automatically generate a list of .ui calls and call qt_wrap_ui() to generate targets.189# This is needed because otherwise CMake rebuilds all source files if any unrelated files change.190# See https://gitlab.kitware.com/cmake/cmake/-/issues/22531 and https://gitlab.kitware.com/cmake/cmake/-/issues/16776191# Documentation says to use qt_add_ui(), but this generates a separate directory for every file.192# I'm concerned about arg length limits, so I manually invoke qt_wrap_ui().193# Also see https://github.com/thorntonryan/autouic_example.194set(UI_FILES "")195foreach(src ${SRCS})196if(src MATCHES "\\.ui$")197list(APPEND UI_FILES ${src})198endif()199endforeach()200qt_wrap_ui(UI_SRCS SOURCES ${UI_FILES})201target_sources(duckstation-qt PRIVATE ${UI_SRCS})202target_include_directories(duckstation-qt PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")203204if(WIN32)205target_sources(duckstation-qt PRIVATE206duckstation-qt.rc207vcruntimecheck.cpp208)209210# Needed to enable RAIntegration.211target_link_libraries(duckstation-qt PRIVATE rcheevos)212213# We want a Windows subsystem application not console.214set_target_properties(duckstation-qt PROPERTIES215WIN32_EXECUTABLE TRUE216DEBUG_POSTFIX "-debug")217218# Copy in Qt DLLs. Borrowed from Dolphin.219get_target_property(MOC_EXECUTABLE_LOCATION Qt6::moc IMPORTED_LOCATION)220get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY)221find_program(WINDEPLOYQT_EXE windeployqt HINTS "${QT_BINARY_DIRECTORY}")222add_custom_command(TARGET duckstation-qt POST_BUILD223COMMAND "${CMAKE_COMMAND}" -E env PATH="${QT_BINARY_DIRECTORY}"224"${WINDEPLOYQT_EXE}" --libdir="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"225--plugindir="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/QtPlugins"226$<IF:$<CONFIG:Debug>,--debug,--release>227--no-compiler-runtime228--no-system-d3d-compiler229--no-system-dxc-compiler230--no-translations231"$<TARGET_FILE:duckstation-qt>"232)233add_custom_command(TARGET duckstation-qt POST_BUILD234COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/qt.conf.win" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/qt.conf"235)236#set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/translations")237238set(DEPS_TO_COPY cpuinfo.dll discord-rpc.dll dxcompiler.dll dxil.dll freetype.dll harfbuzz.dll jpeg62.dll libpng16.dll239libsharpyuv.dll libwebp.dll libwebpdemux.dll libwebpmux.dll plutosvg.dll SDL3.dll shaderc_shared.dll240soundtouch.dll spirv-cross-c-shared.dll zip.dll zlib1.dll zstd.dll)241foreach(DEP ${DEPS_TO_COPY})242list(APPEND DEP_BINS "${CMAKE_PREFIX_PATH}/bin/${DEP}")243endforeach()244add_custom_command(TARGET duckstation-qt POST_BUILD245COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DEP_BINS} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"246)247if(CMAKE_BUILD_TYPE MATCHES "Debug|Devel")248get_property(WINPIXEVENTRUNTIME_DLL TARGET WinPixEventRuntime::WinPixEventRuntime PROPERTY IMPORTED_LOCATION)249message(STATUS WP "${WINPIXEVENTRUNTIME_DLL}")250add_custom_command(TARGET duckstation-qt POST_BUILD251COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WINPIXEVENTRUNTIME_DLL}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"252)253endif()254elseif(APPLE)255# Don't generate a bundle for XCode, it makes code signing fail...256if(NOT CMAKE_GENERATOR MATCHES "Xcode")257get_scm_version()258set(BUNDLE_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DuckStation.app)259set_target_properties(duckstation-qt PROPERTIES260MACOSX_BUNDLE true261MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in262OUTPUT_NAME DuckStation263)264265# Inject Qt Libraries into bundle.266if(NOT SKIP_POSTPROCESS_BUNDLE)267find_program(MACDEPLOYQT_EXE macdeployqt HINTS "${QT_BINARY_DIRECTORY}")268add_custom_target(duckstation-postprocess-bundle ALL269COMMAND "${MACDEPLOYQT_EXE}" "${BUNDLE_PATH}" -no-strip270)271add_dependencies(duckstation-postprocess-bundle duckstation-qt)272endif()273endif()274275# Copy icon into the bundle276target_sources(duckstation-qt PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/DuckStation.icns")277set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/DuckStation.icns" PROPERTIES MACOSX_PACKAGE_LOCATION Resources)278endif()279280# Compile qrc to a binary file.281if(NOT APPLE)282set(RCC_FILE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/duckstation-qt.rcc")283qt_add_binary_resources(duckstation-qt-rcc resources/duckstation-qt.qrc DESTINATION ${RCC_FILE} OPTIONS -no-compress)284add_dependencies(duckstation-qt duckstation-qt-rcc)285else()286set(RCC_FILE "${CMAKE_CURRENT_BINARY_DIR}/duckstation-qt.rcc")287qt_add_binary_resources(duckstation-qt-rcc resources/duckstation-qt.qrc DESTINATION ${RCC_FILE} OPTIONS -no-compress)288add_dependencies(duckstation-qt duckstation-qt-rcc)289target_sources(duckstation-qt PRIVATE ${RCC_FILE})290set_source_files_properties(${RCC_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)291endif()292293294# Translation setup.295qt_add_lrelease(duckstation-qt TS_FILES ${TS_FILES} QM_FILES_OUTPUT_VARIABLE QM_FILES)296if(NOT APPLE)297set(QM_OUTPUT_DIR "$<TARGET_FILE_DIR:duckstation-qt>/translations")298add_custom_command(TARGET duckstation-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${QM_OUTPUT_DIR}")299foreach (QM_FILE IN LISTS QM_FILES)300get_filename_component(QM_FILE_NAME ${QM_FILE} NAME)301add_custom_command(TARGET duckstation-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${QM_FILE}" "${QM_OUTPUT_DIR}/${QM_FILE_NAME}")302endforeach()303else()304foreach (QM_FILE IN LISTS QM_FILES)305target_sources(duckstation-qt PRIVATE ${QM_FILE})306set_source_files_properties(${QM_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/translations)307endforeach()308endif()309copy_base_translations(duckstation-qt)310311312