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