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