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