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 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/mgba.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} amstrmid 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 install(FILES ${CMAKE_SOURCE_DIR}/res/mgba-qt.desktop DESTINATION share/applications COMPONENT ${BINARY_NAME}-qt)
328endif()
329if(UNIX)
330 install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
331endif()
332if(APPLE OR WIN32)
333 set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
334endif()
335if(APPLE)
336 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
337 get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
338 get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
339 get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
340 set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
341 target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
342 set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
343 set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
344 set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
345 install(CODE "
346 include(BundleUtilities)
347 set(BU_CHMOD_BUNDLE_ITEMS ON)
348 file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
349 fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\")
350 " COMPONENT ${BINARY_NAME}-qt)
351 else()
352 set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
353 if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
354 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
355 endif()
356 if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
357 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
358 endif()
359 if(DEFINED CROSS_ROOT)
360 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
361 endif()
362 install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
363 endif()
364elseif(WIN32)
365 if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
366 # Work around CMake issue #16907
367 set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
368 endif()
369 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
370 find_program(BASH bash)
371 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)
372 endif()
373 if(DISTBUILD)
374 file(WRITE "${CMAKE_BINARY_DIR}/portable.ini" "")
375 install(FILES "${CMAKE_BINARY_DIR}/portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
376 endif()
377endif()
378
379if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
380 if(NOT APPLE)
381 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")
382 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:${BINARY_NAME}-qt>")
383 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>")
384 install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
385 endif()
386endif()