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