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 NEW)
20endif()
21
22set(CMAKE_AUTOMOC ON)
23set(CMAKE_INCLUDE_CURRENT_DIR ON)
24
25find_package(Qt5 COMPONENTS Core Widgets OpenGL Network Multimedia)
26
27if(NOT BUILD_GL AND NOT BUILD_GLES2)
28 message(WARNING "OpenGL is recommended to build the Qt port")
29endif()
30
31set(FOUND_QT ${Qt5Widgets_FOUND} PARENT_SCOPE)
32if(NOT Qt5Widgets_FOUND)
33 message(WARNING "Cannot find Qt modules")
34 return()
35endif()
36
37if(APPLE)
38 if(Qt5Widgets_VERSION MATCHES "^5.1[0-9]")
39 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.8")
40 else()
41 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.7")
42 endif()
43 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
44 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
45 endif()
46endif()
47
48if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
49 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
50endif()
51
52get_target_property(QT_TYPE Qt5::Core TYPE)
53if(QT_TYPE STREQUAL STATIC_LIBRARY)
54 set(QT_STATIC ON)
55 list(APPEND QT_DEFINES QT_STATIC)
56endif()
57
58set(SOURCE_FILES
59 AboutScreen.cpp
60 AbstractUpdater.cpp
61 Action.cpp
62 ActionMapper.cpp
63 AssetInfo.cpp
64 AssetTile.cpp
65 AssetView.cpp
66 AudioProcessor.cpp
67 CheatsModel.cpp
68 CheatsView.cpp
69 ConfigController.cpp
70 ColorPicker.cpp
71 CoreManager.cpp
72 CoreController.cpp
73 Display.cpp
74 DisplayGL.cpp
75 DisplayQt.cpp
76 FrameView.cpp
77 GBAApp.cpp
78 GBAKeyEditor.cpp
79 GIFView.cpp
80 GamepadAxisEvent.cpp
81 GamepadButtonEvent.cpp
82 GamepadHatEvent.cpp
83 IOViewer.cpp
84 InputController.cpp
85 InputProfile.cpp
86 KeyEditor.cpp
87 LoadSaveState.cpp
88 LogController.cpp
89 LogConfigModel.cpp
90 LogView.cpp
91 MapView.cpp
92 MemoryDump.cpp
93 MemoryModel.cpp
94 MemorySearch.cpp
95 MemoryView.cpp
96 MessagePainter.cpp
97 MultiplayerController.cpp
98 ObjView.cpp
99 OverrideView.cpp
100 PaletteView.cpp
101 PlacementControl.cpp
102 RegisterView.cpp
103 ReportView.cpp
104 ROMInfo.cpp
105 RotatedHeaderView.cpp
106 SavestateButton.cpp
107 SensorView.cpp
108 SettingsView.cpp
109 ShaderSelector.cpp
110 ShortcutController.cpp
111 ShortcutModel.cpp
112 ShortcutView.cpp
113 Swatch.cpp
114 TilePainter.cpp
115 TileView.cpp
116 utils.cpp
117 Window.cpp
118 VFileDevice.cpp
119 VideoProxy.cpp
120 VideoView.cpp)
121
122set(UI_FILES
123 AboutScreen.ui
124 ArchiveInspector.ui
125 AssetTile.ui
126 BattleChipView.ui
127 CheatsView.ui
128 DebuggerConsole.ui
129 FrameView.ui
130 GIFView.ui
131 IOViewer.ui
132 LoadSaveState.ui
133 LogView.ui
134 MapView.ui
135 MemoryDump.ui
136 MemorySearch.ui
137 MemoryView.ui
138 ObjView.ui
139 OverrideView.ui
140 PaletteView.ui
141 PlacementControl.ui
142 PrinterView.ui
143 ReportView.ui
144 ROMInfo.ui
145 SensorView.ui
146 SettingsView.ui
147 ShaderSelector.ui
148 ShortcutView.ui
149 TileView.ui
150 VideoView.ui)
151
152set(GBA_SRC
153 BattleChipModel.cpp
154 BattleChipUpdater.cpp
155 BattleChipView.cpp
156 GBAOverride.cpp)
157
158set(GB_SRC
159 GameBoy.cpp
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 mgba.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/mgba.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
232endif()
233if(WIN32)
234 configure_file(${CMAKE_SOURCE_DIR}/res/mgba.rc.in ${CMAKE_BINARY_DIR}/res/mgba.rc)
235 list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/mgba.rc)
236 set_source_files_properties(${CMAKE_BINARY_DIR}/res/mgba.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/mgba.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 list(REMOVE_ITEM TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-template.ts")
263 else()
264 list(REMOVE_ITEM TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-template.ts")
265 qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
266 endif()
267 set(QT_QM_FILES)
268 if(QT_STATIC)
269 get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
270 get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
271 get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
272 foreach(TS ${TS_FILES})
273 get_filename_component(TS ${TS} NAME)
274 string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
275 set(QT_QM "${QT_QM_LOCATION}/${QT_QM}")
276 if(EXISTS "${QT_QM}")
277 list(APPEND QT_QM_FILES "${QT_QM}")
278 endif()
279 endforeach()
280 list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
281 endif()
282 add_custom_command(OUTPUT ${TRANSLATION_QRC}
283 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"
284 DEPENDS ${TRANSLATION_FILES})
285 qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
286 list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
287endif()
288
289qt5_wrap_ui(UI_SRC ${UI_FILES})
290
291add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/mgba.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
292set_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}")
293
294if(WIN32)
295 set_target_properties(${BINARY_NAME}-qt PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
296endif()
297
298list(APPEND QT_LIBRARIES Qt5::Widgets Qt5::Network)
299if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
300 list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
301endif()
302if(QT_STATIC)
303 find_library(QTPCRE NAMES qtpcre2 qtpcre)
304 if(WIN32)
305 if(CMAKE_CROSSCOMPILING)
306 set(QWINDOWS_DEPS Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport Qt5WindowsUIAutomationSupport)
307 endif()
308 list(APPEND QT_LIBRARIES Qt5::QWindowsIntegrationPlugin ${QWINDOWS_DEPS} amstrmid dwmapi uxtheme imm32 -static-libgcc -static-libstdc++)
309 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ssl;crypto;ws2_32;iphlpapi;crypt32;userenv;netapi32;wtsapi32")
310 set_target_properties(Qt5::Gui PROPERTIES INTERFACE_LINK_LIBRARIES ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
311 elseif(APPLE)
312 find_package(Cups)
313 find_package(Qt5PrintSupport)
314 find_library(QTFREETYPE NAMES qtfreetype)
315 find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
316 find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
317 list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia" "-framework SystemConfiguration" "-framework Security")
318 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
319 link_directories()
320 endif()
321endif()
322target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
323set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
324
325install(TARGETS ${BINARY_NAME}-qt
326 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
327 BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
328if(UNIX AND NOT APPLE)
329 install(FILES ${CMAKE_SOURCE_DIR}/res/mgba-qt.desktop DESTINATION share/applications COMPONENT ${BINARY_NAME}-qt)
330endif()
331if(UNIX)
332 install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
333endif()
334if(APPLE OR WIN32)
335 set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
336endif()
337if(APPLE)
338 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
339 get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
340 get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
341 get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
342 set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
343 target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
344 set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
345 set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
346 set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
347 install(CODE "
348 include(BundleUtilities)
349 set(BU_CHMOD_BUNDLE_ITEMS ON)
350 file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
351 fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\")
352 " COMPONENT ${BINARY_NAME}-qt)
353 else()
354 set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
355 if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
356 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
357 endif()
358 if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
359 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
360 endif()
361 if(DEFINED CROSS_ROOT)
362 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
363 endif()
364 install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
365 endif()
366elseif(WIN32)
367 if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
368 # Work around CMake issue #16907
369 set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
370 endif()
371 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
372 find_program(BASH bash)
373 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)
374 endif()
375 if(DISTBUILD)
376 file(WRITE "${CMAKE_BINARY_DIR}/portable.ini" "")
377 install(FILES "${CMAKE_BINARY_DIR}/portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
378 endif()
379endif()
380
381if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
382 if(NOT APPLE)
383 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")
384 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:${BINARY_NAME}-qt>")
385 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>")
386 install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
387 endif()
388endif()