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