Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/duckstation-qt/CMakeLists.txt
7652 views
1
include(CopyBaseTranslations)
2
3
set(CMAKE_AUTOUIC OFF)
4
set(CMAKE_AUTOMOC ON)
5
set(CMAKE_AUTORCC ON)
6
7
set(SRCS
8
aboutdialog.cpp
9
aboutdialog.h
10
aboutdialog.ui
11
achievementlogindialog.cpp
12
achievementlogindialog.h
13
achievementlogindialog.ui
14
achievementsettingswidget.cpp
15
achievementsettingswidget.h
16
achievementsettingswidget.ui
17
advancedsettingswidget.cpp
18
advancedsettingswidget.h
19
advancedsettingswidget.ui
20
audiosettingswidget.cpp
21
audiosettingswidget.h
22
audiosettingswidget.ui
23
autoupdaterdialog.cpp
24
autoupdaterdialog.h
25
autoupdaterdialog.ui
26
biossettingswidget.cpp
27
biossettingswidget.h
28
biossettingswidget.ui
29
colorpickerbutton.cpp
30
colorpickerbutton.h
31
capturesettingswidget.cpp
32
capturesettingswidget.h
33
capturesettingswidget.ui
34
consolesettingswidget.cpp
35
consolesettingswidget.h
36
consolesettingswidget.ui
37
controllerbindingwidget_analog_controller.ui
38
controllerbindingwidget_analog_joystick.ui
39
controllerbindingwidget_digital_controller.ui
40
controllerbindingwidget_guncon.ui
41
controllerbindingwidget_justifier.ui
42
controllerbindingwidget_mouse.ui
43
controllerbindingwidget_negcon.ui
44
controllerbindingwidget_negconrumble.ui
45
controllerbindingwidgets.cpp
46
controllerbindingwidgets.h
47
controllerbindingwidget.ui
48
controllerglobalsettingswidget.cpp
49
controllerglobalsettingswidget.h
50
controllerglobalsettingswidget.ui
51
controllermacroeditwidget.ui
52
controllersettingswindow.cpp
53
controllersettingswindow.h
54
controllersettingswindow.ui
55
controllersettingwidgetbinder.h
56
coverdownloadwindow.cpp
57
coverdownloadwindow.h
58
coverdownloadwindow.ui
59
debuggeraddbreakpointdialog.ui
60
debuggercodeview.cpp
61
debuggercodeview.h
62
debuggermodels.cpp
63
debuggermodels.h
64
debuggerwindow.cpp
65
debuggerwindow.h
66
debuggerwindow.ui
67
displaywidget.cpp
68
displaywidget.h
69
editgameserialdialog.ui
70
emptygamelistwidget.ui
71
emulationsettingswidget.cpp
72
emulationsettingswidget.h
73
emulationsettingswidget.ui
74
foldersettingswidget.cpp
75
foldersettingswidget.h
76
foldersettingswidget.ui
77
gamecheatcodechoiceeditordialog.ui
78
gamecheatcodeeditordialog.ui
79
gamecheatsettingswidget.cpp
80
gamecheatsettingswidget.h
81
gamecheatsettingswidget.ui
82
gamepatchdetailswidget.ui
83
gamepatchsettingswidget.cpp
84
gamepatchsettingswidget.h
85
gamepatchsettingswidget.ui
86
gamelistrefreshthread.cpp
87
gamelistrefreshthread.h
88
gamelistsettingswidget.cpp
89
gamelistsettingswidget.h
90
gamelistsettingswidget.ui
91
gamelistwidget.cpp
92
gamelistwidget.h
93
gamelistwidget.ui
94
gamesummarywidget.cpp
95
gamesummarywidget.h
96
gamesummarywidget.ui
97
graphicssettingswidget.cpp
98
graphicssettingswidget.h
99
graphicssettingswidget.ui
100
hotkeysettingswidget.cpp
101
hotkeysettingswidget.h
102
inputbindingdialog.cpp
103
inputbindingdialog.h
104
inputbindingdialog.ui
105
inputbindingwidgets.cpp
106
inputbindingwidgets.h
107
interfacesettingswidget.cpp
108
interfacesettingswidget.h
109
interfacesettingswidget.ui
110
isobrowserwindow.cpp
111
isobrowserwindow.h
112
isobrowserwindow.ui
113
logwindow.cpp
114
logwindow.h
115
mainwindow.cpp
116
mainwindow.h
117
mainwindow.ui
118
memorycardeditorwindow.cpp
119
memorycardeditorwindow.h
120
memorycardeditorwindow.ui
121
memorycardrenamefiledialog.ui
122
memorycardsettingswidget.cpp
123
memorycardsettingswidget.h
124
memoryeditorwindow.cpp
125
memoryeditorwindow.h
126
memoryeditorwindow.ui
127
memoryscannerwindow.cpp
128
memoryscannerwindow.h
129
memoryscannerwindow.ui
130
memoryviewwidget.cpp
131
memoryviewwidget.h
132
osdsettingswidget.cpp
133
osdsettingswidget.h
134
osdsettingswidget.ui
135
postprocessingsettingswidget.cpp
136
postprocessingsettingswidget.h
137
postprocessingchainconfigwidget.ui
138
postprocessingoverlayconfigwidget.ui
139
postprocessingselectshaderdialog.ui
140
qthost.cpp
141
qthost.h
142
qtprogresscallback.cpp
143
qtprogresscallback.h
144
qtthemes.cpp
145
qttranslations.inl
146
qtutils.cpp
147
qtutils.h
148
qtwindowinfo.cpp
149
qtwindowinfo.h
150
resource.h
151
selectdiscdialog.cpp
152
selectdiscdialog.h
153
selectdiscdialog.ui
154
settingswindow.cpp
155
settingswindow.h
156
settingswindow.ui
157
settingwidgetbinder.h
158
setupwizarddialog.cpp
159
setupwizarddialog.h
160
setupwizarddialog.ui
161
texturereplacementsettingsdialog.ui
162
togglebutton.cpp
163
togglebutton.h
164
)
165
166
set(TS_FILES
167
translations/duckstation-qt_de.ts
168
translations/duckstation-qt_en.ts
169
translations/duckstation-qt_es.ts
170
translations/duckstation-qt_es-ES.ts
171
translations/duckstation-qt_fr.ts
172
translations/duckstation-qt_he.ts
173
translations/duckstation-qt_id.ts
174
translations/duckstation-qt_it.ts
175
translations/duckstation-qt_ja.ts
176
translations/duckstation-qt_ko.ts
177
translations/duckstation-qt_nl.ts
178
translations/duckstation-qt_pl.ts
179
translations/duckstation-qt_pt-BR.ts
180
translations/duckstation-qt_pt-PT.ts
181
translations/duckstation-qt_ru.ts
182
translations/duckstation-qt_sv.ts
183
translations/duckstation-qt_tr.ts
184
translations/duckstation-qt_zh-CN.ts
185
)
186
187
add_executable(duckstation-qt ${SRCS} ${QM_FILES})
188
target_precompile_headers(duckstation-qt PRIVATE "pch.h")
189
target_include_directories(duckstation-qt PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/..")
190
target_link_libraries(duckstation-qt PRIVATE core common imgui minizip scmversion Qt6::Core Qt6::Gui Qt6::GuiPrivate Qt6::Widgets)
191
192
if(LINUX)
193
target_link_libraries(duckstation-qt PRIVATE Qt6::DBus)
194
endif()
195
196
# Our Qt builds may have exceptions on, so force them off.
197
target_compile_definitions(duckstation-qt PRIVATE QT_NO_EXCEPTIONS QT_NO_SIGNALS_SLOTS_KEYWORDS)
198
199
add_core_resources(duckstation-qt)
200
201
# Automatically generate a list of .ui calls and call qt_wrap_ui() to generate targets.
202
# This is needed because otherwise CMake rebuilds all source files if any unrelated files change.
203
# See https://gitlab.kitware.com/cmake/cmake/-/issues/22531 and https://gitlab.kitware.com/cmake/cmake/-/issues/16776
204
# Documentation says to use qt_add_ui(), but this generates a separate directory for every file.
205
# I'm concerned about arg length limits, so I manually invoke qt_wrap_ui().
206
# Also see https://github.com/thorntonryan/autouic_example.
207
set(UI_FILES "")
208
foreach(src ${SRCS})
209
if(src MATCHES "\\.ui$")
210
list(APPEND UI_FILES ${src})
211
endif()
212
endforeach()
213
qt_wrap_ui(UI_SRCS SOURCES ${UI_FILES})
214
target_sources(duckstation-qt PRIVATE ${UI_SRCS})
215
target_include_directories(duckstation-qt PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")
216
217
if(WIN32)
218
target_sources(duckstation-qt PRIVATE
219
duckstation-qt.rc
220
vcruntimecheck.cpp
221
)
222
223
# Needed to enable RAIntegration.
224
target_link_libraries(duckstation-qt PRIVATE rcheevos)
225
226
# We want a Windows subsystem application not console.
227
set_target_properties(duckstation-qt PROPERTIES
228
WIN32_EXECUTABLE TRUE
229
DEBUG_POSTFIX "-debug")
230
231
# Copy in Qt DLLs. Borrowed from Dolphin.
232
get_target_property(MOC_EXECUTABLE_LOCATION Qt6::moc IMPORTED_LOCATION)
233
get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY)
234
find_program(WINDEPLOYQT_EXE windeployqt HINTS "${QT_BINARY_DIRECTORY}")
235
add_custom_command(TARGET duckstation-qt POST_BUILD
236
COMMAND "${CMAKE_COMMAND}" -E env PATH="${QT_BINARY_DIRECTORY}"
237
"${WINDEPLOYQT_EXE}" --libdir="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
238
--plugindir="${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/QtPlugins"
239
$<IF:$<CONFIG:Debug>,--debug,--release>
240
--no-compiler-runtime
241
--no-system-d3d-compiler
242
--no-system-dxc-compiler
243
--no-translations
244
"$<TARGET_FILE:duckstation-qt>"
245
)
246
add_custom_command(TARGET duckstation-qt POST_BUILD
247
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/qt.conf.win" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/qt.conf"
248
)
249
#set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/translations")
250
251
set(DEPS_TO_COPY cpuinfo.dll discord-rpc.dll dxcompiler.dll dxil.dll freetype.dll harfbuzz.dll jpeg62.dll libpng16.dll
252
libsharpyuv.dll libwebp.dll libwebpdemux.dll libwebpmux.dll plutosvg.dll SDL3.dll shaderc_shared.dll
253
soundtouch.dll spirv-cross-c-shared.dll zip.dll zlib1.dll zstd.dll)
254
foreach(DEP ${DEPS_TO_COPY})
255
list(APPEND DEP_BINS "${CMAKE_PREFIX_PATH}/bin/${DEP}")
256
endforeach()
257
add_custom_command(TARGET duckstation-qt POST_BUILD
258
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DEP_BINS} "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
259
)
260
if(CMAKE_BUILD_TYPE MATCHES "Debug|Devel")
261
get_property(WINPIXEVENTRUNTIME_DLL TARGET WinPixEventRuntime::WinPixEventRuntime PROPERTY IMPORTED_LOCATION)
262
message(STATUS WP "${WINPIXEVENTRUNTIME_DLL}")
263
add_custom_command(TARGET duckstation-qt POST_BUILD
264
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${WINPIXEVENTRUNTIME_DLL}" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
265
)
266
endif()
267
elseif(APPLE)
268
# Don't generate a bundle for XCode, it makes code signing fail...
269
get_scm_version()
270
set(BUNDLE_PATH ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/DuckStation.app)
271
set_target_properties(duckstation-qt PROPERTIES
272
MACOSX_BUNDLE true
273
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
274
OUTPUT_NAME DuckStation
275
)
276
277
if(CMAKE_GENERATOR MATCHES "Xcode")
278
set_target_properties(duckstation-qt PROPERTIES
279
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""
280
XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED NO
281
XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED NO
282
)
283
elseif(NOT SKIP_POSTPROCESS_BUNDLE)
284
# Inject Qt Libraries into bundle.
285
find_program(MACDEPLOYQT_EXE macdeployqt HINTS "${QT_BINARY_DIRECTORY}")
286
add_custom_target(duckstation-postprocess-bundle ALL
287
COMMAND "${MACDEPLOYQT_EXE}" "${BUNDLE_PATH}" -no-strip
288
)
289
add_dependencies(duckstation-postprocess-bundle duckstation-qt)
290
endif()
291
292
# Copy icon into the bundle
293
target_sources(duckstation-qt PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/DuckStation.icns")
294
set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/DuckStation.icns" PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
295
endif()
296
297
# Compile qrc to a binary file.
298
if(NOT APPLE)
299
set(RCC_FILE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources/duckstation-qt.rcc")
300
qt_add_binary_resources(duckstation-qt-rcc resources/duckstation-qt.qrc DESTINATION ${RCC_FILE} OPTIONS -no-compress)
301
add_dependencies(duckstation-qt duckstation-qt-rcc)
302
303
# Need to ensure the resources directory exists, it might not. Happens when low CPU count and parallel builds.
304
add_custom_target(duckstation-qt-rcc-mkdir COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources")
305
add_dependencies(duckstation-qt-rcc duckstation-qt-rcc-mkdir)
306
else()
307
set(RCC_FILE "${CMAKE_CURRENT_BINARY_DIR}/duckstation-qt.rcc")
308
qt_add_binary_resources(duckstation-qt-rcc resources/duckstation-qt.qrc DESTINATION ${RCC_FILE} OPTIONS -no-compress)
309
add_dependencies(duckstation-qt duckstation-qt-rcc)
310
target_sources(duckstation-qt PRIVATE ${RCC_FILE})
311
set_source_files_properties(${RCC_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
312
endif()
313
314
315
# Translation setup.
316
qt_add_lrelease(duckstation-qt TS_FILES ${TS_FILES} QM_FILES_OUTPUT_VARIABLE QM_FILES)
317
if(NOT APPLE)
318
set(QM_OUTPUT_DIR "$<TARGET_FILE_DIR:duckstation-qt>/translations")
319
add_custom_command(TARGET duckstation-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E make_directory "${QM_OUTPUT_DIR}")
320
foreach (QM_FILE IN LISTS QM_FILES)
321
get_filename_component(QM_FILE_NAME ${QM_FILE} NAME)
322
add_custom_command(TARGET duckstation-qt POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${QM_FILE}" "${QM_OUTPUT_DIR}/${QM_FILE_NAME}")
323
endforeach()
324
else()
325
foreach (QM_FILE IN LISTS QM_FILES)
326
target_sources(duckstation-qt PRIVATE ${QM_FILE})
327
set_source_files_properties(${QM_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/translations)
328
endforeach()
329
endif()
330
copy_base_translations(duckstation-qt)
331
332