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