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