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 SaveConverter.cpp
107 SavestateButton.cpp
108 SensorView.cpp
109 SettingsView.cpp
110 ShaderSelector.cpp
111 ShortcutController.cpp
112 ShortcutModel.cpp
113 ShortcutView.cpp
114 Swatch.cpp
115 TilePainter.cpp
116 TileView.cpp
117 utils.cpp
118 Window.cpp
119 VFileDevice.cpp
120 VideoProxy.cpp
121 VideoView.cpp)
122
123set(UI_FILES
124 AboutScreen.ui
125 ArchiveInspector.ui
126 AssetTile.ui
127 BattleChipView.ui
128 CheatsView.ui
129 DebuggerConsole.ui
130 DolphinConnector.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 ReportView.ui
146 ROMInfo.ui
147 SaveConverter.ui
148 SensorView.ui
149 SettingsView.ui
150 ShaderSelector.ui
151 ShortcutView.ui
152 TileView.ui
153 VideoView.ui)
154
155set(GBA_SRC
156 BattleChipModel.cpp
157 BattleChipUpdater.cpp
158 BattleChipView.cpp
159 DolphinConnector.cpp
160 GBAOverride.cpp)
161
162set(GB_SRC
163 GameBoy.cpp
164 GBOverride.cpp
165 PrinterView.cpp)
166
167set(QT_LIBRARIES)
168set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5widgets5,libqt5opengl5")
169
170set(AUDIO_SRC)
171if(BUILD_SDL)
172 list(APPEND AUDIO_SRC AudioProcessorSDL.cpp)
173endif()
174
175if(M_CORE_GBA)
176 list(APPEND PLATFORM_SRC ${GBA_SRC})
177endif()
178
179if(M_CORE_GB)
180 list(APPEND PLATFORM_SRC ${GB_SRC})
181endif()
182
183set(QT_DEFINES)
184if(Qt5Multimedia_FOUND)
185 list(APPEND AUDIO_SRC
186 AudioProcessorQt.cpp
187 AudioDevice.cpp)
188 list(APPEND SOURCE_FILES
189 VideoDumper.cpp)
190 if (WIN32 AND QT_STATIC)
191 list(APPEND QT_LIBRARIES Qt5::QWindowsAudioPlugin Qt5::DSServicePlugin Qt5::QWindowsVistaStylePlugin
192 strmiids mfuuid mfplat mf ksguid dxva2 evr d3d9)
193 endif()
194 list(APPEND QT_LIBRARIES Qt5::Multimedia)
195 list(APPEND QT_DEFINES BUILD_QT_MULTIMEDIA)
196 set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5multimedia5")
197endif()
198
199if(NOT AUDIO_SRC)
200 message(WARNING "No supported audio modules found")
201 set(BUILD_QT OFF PARENT_SCOPE)
202 return()
203endif()
204
205if(USE_DEBUGGERS)
206 list(APPEND SOURCE_FILES
207 DebuggerController.cpp
208 DebuggerConsole.cpp
209 DebuggerConsoleController.cpp)
210endif()
211
212if(USE_GDB_STUB)
213 list(APPEND SOURCE_FILES GDBController.cpp GDBWindow.cpp)
214endif()
215
216if(USE_SQLITE3)
217 list(APPEND SOURCE_FILES
218 ArchiveInspector.cpp
219 library/LibraryController.cpp
220 library/LibraryGrid.cpp
221 library/LibraryTree.cpp)
222endif()
223
224if(USE_DISCORD_RPC)
225 list(APPEND QT_LIBRARIES discord-rpc)
226 list(APPEND SOURCE_FILES DiscordCoordinator.cpp)
227endif()
228
229qt5_add_resources(RESOURCES resources.qrc)
230if(APPLE)
231 set(MACOSX_BUNDLE_ICON_FILE mgba.icns)
232 set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
233 set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
234 set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
235 set_source_files_properties(${CMAKE_SOURCE_DIR}/res/mgba.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
236endif()
237if(WIN32)
238 configure_file(${CMAKE_SOURCE_DIR}/res/mgba.rc.in ${CMAKE_BINARY_DIR}/res/mgba.rc)
239 list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/mgba.rc)
240 set_source_files_properties(${CMAKE_BINARY_DIR}/res/mgba.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/mgba.ico)
241endif()
242if(NOT DEFINED DATADIR)
243 if(APPLE)
244 set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
245 elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
246 set(DATADIR ".")
247 else()
248 set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
249 endif()
250endif()
251if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
252 install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
253endif()
254install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
255if(NOT WIN32 AND NOT APPLE)
256 list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
257endif()
258
259find_package(Qt5LinguistTools)
260if(Qt5LinguistTools_FOUND)
261 set(TRANSLATION_FILES)
262 set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
263 file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
264 if(UPDATE_TRANSLATIONS)
265 qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
266 list(REMOVE_ITEM TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-template.ts")
267 else()
268 list(REMOVE_ITEM TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-template.ts")
269 qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
270 endif()
271 set(QT_QM_FILES)
272 if(QT_STATIC)
273 get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
274 get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
275 get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
276 foreach(TS ${TS_FILES})
277 get_filename_component(TS ${TS} NAME)
278 string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
279 set(QT_QM "${QT_QM_LOCATION}/${QT_QM}")
280 if(EXISTS "${QT_QM}")
281 list(APPEND QT_QM_FILES "${QT_QM}")
282 endif()
283 endforeach()
284 list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
285 endif()
286 add_custom_command(OUTPUT ${TRANSLATION_QRC}
287 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"
288 DEPENDS ${TRANSLATION_FILES})
289 qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
290 list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
291endif()
292
293qt5_wrap_ui(UI_SRC ${UI_FILES})
294
295add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/mgba.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
296set_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}")
297
298if(WIN32)
299 set_target_properties(${BINARY_NAME}-qt PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
300endif()
301
302list(APPEND QT_LIBRARIES Qt5::Widgets Qt5::Network)
303if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
304 list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
305endif()
306if(QT_STATIC)
307 find_library(QTPCRE NAMES qtpcre2 qtpcre)
308 if(WIN32)
309 if(CMAKE_CROSSCOMPILING)
310 set(QWINDOWS_DEPS Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport Qt5WindowsUIAutomationSupport)
311 endif()
312 list(APPEND QT_LIBRARIES Qt5::QWindowsIntegrationPlugin ${QWINDOWS_DEPS} amstrmid dwmapi uxtheme imm32 -static-libgcc -static-libstdc++)
313 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ssl;crypto;ws2_32;iphlpapi;crypt32;userenv;netapi32;wtsapi32")
314 set_target_properties(Qt5::Gui PROPERTIES INTERFACE_LINK_LIBRARIES ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
315 elseif(APPLE)
316 find_package(Cups)
317 find_package(Qt5PrintSupport)
318 find_library(QTFREETYPE NAMES qtfreetype)
319 find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
320 find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
321 list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia" "-framework SystemConfiguration" "-framework Security")
322 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
323 link_directories()
324 endif()
325endif()
326target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
327set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
328
329install(TARGETS ${BINARY_NAME}-qt
330 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
331 BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
332if(UNIX AND NOT APPLE)
333 install(FILES ${CMAKE_SOURCE_DIR}/res/mgba-qt.desktop DESTINATION share/applications COMPONENT ${BINARY_NAME}-qt)
334endif()
335if(UNIX)
336 install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
337endif()
338if(APPLE OR WIN32)
339 set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
340endif()
341if(APPLE)
342 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
343 get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
344 get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
345 get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
346 set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
347 target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
348 set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
349 set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
350 set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
351 install(CODE "
352 include(BundleUtilities)
353 set(BU_CHMOD_BUNDLE_ITEMS ON)
354 file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
355 fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\")
356 " COMPONENT ${BINARY_NAME}-qt)
357 else()
358 set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
359 if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
360 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
361 endif()
362 if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
363 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
364 endif()
365 if(DEFINED CROSS_ROOT)
366 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
367 endif()
368 install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
369 endif()
370elseif(WIN32)
371 if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
372 # Work around CMake issue #16907
373 set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
374 endif()
375 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
376 find_program(BASH bash)
377 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)
378 endif()
379 if(DISTBUILD)
380 file(WRITE "${CMAKE_BINARY_DIR}/portable.ini" "")
381 install(FILES "${CMAKE_BINARY_DIR}/portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
382 endif()
383endif()
384
385if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
386 if(NOT APPLE)
387 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")
388 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:${BINARY_NAME}-qt>")
389 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>")
390 install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
391 endif()
392endif()