src/platform/qt/CMakeLists.txt (view raw)
1set(CMAKE_CXX_STANDARD 14)
2set(CMAKE_CXX_STANDARD_REQUIRED ON)
3set(CMAKE_CXX_EXTENSIONS OFF)
4
5set(PLATFORM_SRC)
6set(QT_STATIC OFF)
7
8if(BUILD_SDL)
9 add_definitions(-DBUILD_SDL)
10 if(SDL2_FOUND)
11 link_directories(${SDL2_LIBDIR})
12 endif()
13 list(APPEND PLATFORM_LIBRARY ${SDL_LIBRARY})
14 list(APPEND PLATFORM_SRC ${PLATFORM_SRC} ${CMAKE_SOURCE_DIR}/src/platform/sdl/sdl-events.c ${CMAKE_SOURCE_DIR}/src/platform/sdl/sdl-audio.c)
15 include_directories(${SDL_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/src/platform/sdl)
16endif()
17
18if(POLICY CMP0071)
19 cmake_policy(SET CMP0071 OLD)
20endif()
21
22set(CMAKE_AUTOMOC ON)
23set(CMAKE_INCLUDE_CURRENT_DIR ON)
24include_directories(${CMAKE_CURRENT_SOURCE_DIR}/input)
25
26find_package(Qt5 COMPONENTS Core Widgets OpenGL Network Multimedia)
27
28if(NOT BUILD_GL AND NOT BUILD_GLES2)
29 message(WARNING "OpenGL is recommended to build the Qt port")
30endif()
31
32set(FOUND_QT ${Qt5Widgets_FOUND} PARENT_SCOPE)
33if(NOT Qt5Widgets_FOUND)
34 message(WARNING "Cannot find Qt modules")
35 return()
36endif()
37
38if(APPLE)
39 if(Qt5Widgets_VERSION MATCHES "^5.1[0-9]")
40 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.8")
41 else()
42 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.7")
43 endif()
44 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
45 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
46 endif()
47endif()
48
49if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
50 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
51endif()
52
53get_target_property(QT_TYPE Qt5::Core TYPE)
54if(QT_TYPE STREQUAL STATIC_LIBRARY)
55 set(QT_STATIC ON)
56 list(APPEND QT_DEFINES QT_STATIC)
57endif()
58
59set(SOURCE_FILES
60 AboutScreen.cpp
61 AbstractUpdater.cpp
62 Action.cpp
63 ActionMapper.cpp
64 AssetInfo.cpp
65 AssetTile.cpp
66 AssetView.cpp
67 AudioProcessor.cpp
68 CheatsModel.cpp
69 CheatsView.cpp
70 ConfigController.cpp
71 ColorPicker.cpp
72 CoreManager.cpp
73 CoreController.cpp
74 Display.cpp
75 DisplayGL.cpp
76 DisplayQt.cpp
77 FrameView.cpp
78 GBAApp.cpp
79 GIFView.cpp
80 GamepadAxisEvent.cpp
81 GamepadButtonEvent.cpp
82 GamepadHatEvent.cpp
83 IOViewer.cpp
84 KeyEditor.cpp
85 LoadSaveState.cpp
86 LogController.cpp
87 LogConfigModel.cpp
88 LogView.cpp
89 MapView.cpp
90 MemoryDump.cpp
91 MemoryModel.cpp
92 MemorySearch.cpp
93 MemoryView.cpp
94 MessagePainter.cpp
95 MultiplayerController.cpp
96 ObjView.cpp
97 OverrideView.cpp
98 PaletteView.cpp
99 PlacementControl.cpp
100 RegisterView.cpp
101 ROMInfo.cpp
102 RotatedHeaderView.cpp
103 SavestateButton.cpp
104 SensorView.cpp
105 SettingsView.cpp
106 ShaderSelector.cpp
107 ShortcutController.cpp
108 ShortcutModel.cpp
109 ShortcutView.cpp
110 Swatch.cpp
111 TilePainter.cpp
112 TileView.cpp
113 utils.cpp
114 Window.cpp
115 VFileDevice.cpp
116 VideoProxy.cpp
117 VideoView.cpp
118 input/InputController.cpp
119 input/InputIndex.cpp
120 input/InputItem.cpp
121 input/InputModel.cpp
122 input/InputProfile.cpp)
123
124set(UI_FILES
125 AboutScreen.ui
126 ArchiveInspector.ui
127 AssetTile.ui
128 BattleChipView.ui
129 CheatsView.ui
130 DebuggerConsole.ui
131 FrameView.ui
132 GIFView.ui
133 IOViewer.ui
134 LoadSaveState.ui
135 LogView.ui
136 MapView.ui
137 MemoryDump.ui
138 MemorySearch.ui
139 MemoryView.ui
140 ObjView.ui
141 OverrideView.ui
142 PaletteView.ui
143 PlacementControl.ui
144 PrinterView.ui
145 ROMInfo.ui
146 SensorView.ui
147 SettingsView.ui
148 ShaderSelector.ui
149 ShortcutView.ui
150 TileView.ui
151 VideoView.ui)
152
153set(GBA_SRC
154 BattleChipModel.cpp
155 BattleChipUpdater.cpp
156 BattleChipView.cpp
157 GBAOverride.cpp)
158
159set(GB_SRC
160 GBOverride.cpp
161 PrinterView.cpp)
162
163set(QT_LIBRARIES)
164set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5widgets5,libqt5opengl5")
165
166set(AUDIO_SRC)
167if(BUILD_SDL)
168 list(APPEND AUDIO_SRC AudioProcessorSDL.cpp)
169endif()
170
171if(M_CORE_GBA)
172 list(APPEND PLATFORM_SRC ${GBA_SRC})
173endif()
174
175if(M_CORE_GB)
176 list(APPEND PLATFORM_SRC ${GB_SRC})
177endif()
178
179set(QT_DEFINES)
180if(Qt5Multimedia_FOUND)
181 list(APPEND AUDIO_SRC
182 AudioProcessorQt.cpp
183 AudioDevice.cpp)
184 list(APPEND SOURCE_FILES
185 VideoDumper.cpp)
186 if (WIN32 AND QT_STATIC)
187 list(APPEND QT_LIBRARIES Qt5::QWindowsAudioPlugin Qt5::DSServicePlugin Qt5::QWindowsVistaStylePlugin
188 strmiids mfuuid mfplat mf ksguid dxva2 evr d3d9)
189 endif()
190 list(APPEND QT_LIBRARIES Qt5::Multimedia)
191 list(APPEND QT_DEFINES BUILD_QT_MULTIMEDIA)
192 set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5multimedia5")
193endif()
194
195if(NOT AUDIO_SRC)
196 message(WARNING "No supported audio modules found")
197 set(BUILD_QT OFF PARENT_SCOPE)
198 return()
199endif()
200
201if(USE_DEBUGGERS)
202 list(APPEND SOURCE_FILES
203 DebuggerController.cpp
204 DebuggerConsole.cpp
205 DebuggerConsoleController.cpp)
206endif()
207
208if(USE_GDB_STUB)
209 list(APPEND SOURCE_FILES GDBController.cpp GDBWindow.cpp)
210endif()
211
212if(USE_SQLITE3)
213 list(APPEND SOURCE_FILES
214 ArchiveInspector.cpp
215 library/LibraryController.cpp
216 library/LibraryGrid.cpp
217 library/LibraryTree.cpp)
218endif()
219
220if(USE_DISCORD_RPC)
221 list(APPEND QT_LIBRARIES discord-rpc)
222 list(APPEND SOURCE_FILES DiscordCoordinator.cpp)
223endif()
224
225qt5_add_resources(RESOURCES resources.qrc)
226if(APPLE)
227 set(MACOSX_BUNDLE_ICON_FILE ${BINARY_NAME}.icns)
228 set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
229 set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
230 set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
231 set_source_files_properties(${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
232endif()
233if(WIN32)
234 configure_file(${CMAKE_SOURCE_DIR}/res/win.rc.in ${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc)
235 list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc)
236 set_source_files_properties(${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.ico)
237endif()
238if(NOT DEFINED DATADIR)
239 if(APPLE)
240 set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
241 elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
242 set(DATADIR ".")
243 else()
244 set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
245 endif()
246endif()
247if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
248 install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
249endif()
250install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
251if(NOT WIN32 AND NOT APPLE)
252 list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
253endif()
254
255find_package(Qt5LinguistTools)
256if(Qt5LinguistTools_FOUND)
257 set(TRANSLATION_FILES)
258 set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
259 file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
260 if(UPDATE_TRANSLATIONS)
261 qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
262 else()
263 qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
264 endif()
265 set(QT_QM_FILES)
266 if(QT_STATIC)
267 get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
268 get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
269 get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
270 foreach(TS ${TS_FILES})
271 get_filename_component(TS ${TS} NAME)
272 string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
273 set(QT_QM "${QT_QM_LOCATION}/${QT_QM}")
274 if(EXISTS "${QT_QM}")
275 list(APPEND QT_QM_FILES "${QT_QM}")
276 endif()
277 endforeach()
278 list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
279 endif()
280 add_custom_command(OUTPUT ${TRANSLATION_QRC}
281 COMMAND ${CMAKE_COMMAND} -DTRANSLATION_QRC:FILEPATH="${TRANSLATION_QRC}" -DQM_BASE="${CMAKE_CURRENT_BINARY_DIR}" "-DTRANSLATION_FILES='${TRANSLATION_FILES}'" -P "${CMAKE_CURRENT_SOURCE_DIR}/ts.cmake"
282 DEPENDS ${TRANSLATION_FILES})
283 qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
284 list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
285endif()
286
287qt5_wrap_ui(UI_SRC ${UI_FILES})
288
289add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
290set_target_properties(${BINARY_NAME}-qt PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/res/info.plist.in COMPILE_DEFINITIONS "${FEATURE_DEFINES};${FUNCTION_DEFINES};${OS_DEFINES};${QT_DEFINES}" COMPILE_OPTIONS "${FEATURE_FLAGS}")
291
292if(WIN32)
293 set_target_properties(${BINARY_NAME}-qt PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
294endif()
295
296list(APPEND QT_LIBRARIES Qt5::Widgets Qt5::Network)
297if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
298 list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
299endif()
300if(QT_STATIC)
301 find_library(QTPCRE NAMES qtpcre2 qtpcre)
302 if(WIN32)
303 if(CMAKE_CROSSCOMPILING)
304 set(QWINDOWS_DEPS Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport Qt5WindowsUIAutomationSupport)
305 endif()
306 list(APPEND QT_LIBRARIES Qt5::QWindowsIntegrationPlugin ${QWINDOWS_DEPS} dwmapi uxtheme imm32 -static-libgcc -static-libstdc++)
307 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ssl;crypto;ws2_32;iphlpapi;crypt32;userenv;netapi32;wtsapi32")
308 set_target_properties(Qt5::Gui PROPERTIES INTERFACE_LINK_LIBRARIES ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
309 elseif(APPLE)
310 find_package(Cups)
311 find_package(Qt5PrintSupport)
312 find_library(QTFREETYPE NAMES qtfreetype)
313 find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
314 find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
315 list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia" "-framework SystemConfiguration" "-framework Security")
316 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
317 link_directories()
318 endif()
319endif()
320target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
321set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
322
323install(TARGETS ${BINARY_NAME}-qt
324 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
325 BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
326if(UNIX AND NOT APPLE)
327 find_program(DESKTOP_FILE_INSTALL desktop-file-install)
328 if(DESKTOP_FILE_INSTALL)
329 install(CODE "execute_process(COMMAND ${DESKTOP_FILE_INSTALL} \"${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}-qt.desktop\" --dir \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/applications/\")" COMPONENT ${BINARY_NAME}-qt)
330 endif()
331endif()
332if(UNIX)
333 install(FILES ${CMAKE_SOURCE_DIR}/doc/${BINARY_NAME}-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
334endif()
335if(APPLE OR WIN32)
336 set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
337endif()
338if(APPLE)
339 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
340 get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
341 get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
342 get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
343 set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
344 target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
345 set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
346 set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
347 set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
348 install(CODE "
349 include(BundleUtilities)
350 set(BU_CHMOD_BUNDLE_ITEMS ON)
351 file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
352 fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\")
353 " COMPONENT ${BINARY_NAME}-qt)
354 else()
355 set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
356 if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
357 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
358 endif()
359 if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
360 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
361 endif()
362 if(DEFINED CROSS_ROOT)
363 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
364 endif()
365 install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
366 endif()
367elseif(WIN32)
368 if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
369 # Work around CMake issue #16907
370 set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
371 endif()
372 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
373 find_program(BASH bash)
374 install(CODE "execute_process(COMMAND \"${BASH}\" \"${CMAKE_SOURCE_DIR}/tools/deploy-win.sh\" \"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.exe\" \"\${CMAKE_INSTALL_PREFIX}\" \"\$ENV{PWD}\" WORKING_DIRECTORY \"${CMAKE_BINARY_DIR}\")" COMPONENT ${BINARY_NAME}-qt)
375 endif()
376 if(DISTBUILD)
377 file(WRITE "${CMAKE_BINARY_DIR}/portable.ini" "")
378 install(FILES "${CMAKE_BINARY_DIR}/portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
379 endif()
380endif()
381
382if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
383 if(NOT APPLE)
384 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${OBJCOPY}" --only-keep-debug "$<TARGET_FILE:${BINARY_NAME}-qt>" "$<TARGET_FILE:${BINARY_NAME}-qt>.debug")
385 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:${BINARY_NAME}-qt>")
386 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${OBJCOPY}" --add-gnu-debuglink "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" "$<TARGET_FILE:${BINARY_NAME}-qt>")
387 install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
388 endif()
389endif()