src/platform/qt/CMakeLists.txt (view raw)
1if(NOT MSVC)
2 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
3endif()
4
5set(PLATFORM_SRC)
6set(QT_STATIC OFF)
7
8if(BUILD_SDL)
9 if(NOT SDL_FOUND AND NOT SDL2_FOUND)
10 find_package(SDL 1.2 REQUIRED)
11 endif()
12 if(SDL2_FOUND)
13 link_directories(${SDL2_LIBDIR})
14 endif()
15 list(APPEND PLATFORM_LIBRARY ${SDL_LIBRARY})
16 list(APPEND PLATFORM_SRC ${PLATFORM_SRC} ${CMAKE_SOURCE_DIR}/src/platform/sdl/sdl-events.c ${CMAKE_SOURCE_DIR}/src/platform/sdl/sdl-audio.c)
17 include_directories(${SDL_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/src/platform/sdl)
18endif()
19
20if(POLICY CMP0071)
21 cmake_policy(SET CMP0071 OLD)
22endif()
23
24set(CMAKE_AUTOMOC ON)
25set(CMAKE_INCLUDE_CURRENT_DIR ON)
26
27find_package(Qt5Multimedia)
28find_package(Qt5OpenGL)
29find_package(Qt5Widgets)
30
31if(NOT BUILD_GL AND NOT BUILD_GLES2)
32 message(WARNING "OpenGL is recommended to build the Qt port")
33endif()
34
35if(NOT Qt5Widgets_FOUND)
36 message(WARNING "Cannot find Qt modules")
37 set(BUILD_QT OFF PARENT_SCOPE)
38 return()
39endif()
40
41if(APPLE)
42 if(Qt5Widgets_VERSION MATCHES "^5.1[0-9]")
43 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.8")
44 else()
45 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.7")
46 endif()
47 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
48 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
49 endif()
50endif()
51
52if(BUILD_GL)
53 list(APPEND PLATFORM_SRC ${CMAKE_SOURCE_DIR}/src/platform/opengl/gl.c)
54 if(NOT WIN32 OR USE_EPOXY)
55 list(APPEND PLATFORM_SRC ${CMAKE_SOURCE_DIR}/src/platform/opengl/gles2.c)
56 endif()
57endif()
58
59if(BUILD_GLES2)
60 list(APPEND PLATFORM_SRC ${CMAKE_SOURCE_DIR}/src/platform/opengl/gles2.c)
61endif()
62
63get_target_property(QT_TYPE Qt5::Core TYPE)
64if(QT_TYPE STREQUAL STATIC_LIBRARY)
65 set(QT_STATIC ON)
66 list(APPEND QT_DEFINES QT_STATIC)
67endif()
68
69set(SOURCE_FILES
70 AboutScreen.cpp
71 AssetTile.cpp
72 AssetView.cpp
73 AudioProcessor.cpp
74 CheatsModel.cpp
75 CheatsView.cpp
76 ConfigController.cpp
77 Display.cpp
78 DisplayGL.cpp
79 DisplayQt.cpp
80 GBAApp.cpp
81 GBAKeyEditor.cpp
82 GIFView.cpp
83 GameController.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 LogView.cpp
94 MemoryModel.cpp
95 MemorySearch.cpp
96 MemoryView.cpp
97 MessagePainter.cpp
98 MultiplayerController.cpp
99 ObjView.cpp
100 OverrideView.cpp
101 PaletteView.cpp
102 ROMInfo.cpp
103 SavestateButton.cpp
104 SensorView.cpp
105 SettingsView.cpp
106 ShaderSelector.cpp
107 ShortcutController.cpp
108 ShortcutView.cpp
109 Swatch.cpp
110 TilePainter.cpp
111 TileView.cpp
112 utils.cpp
113 Window.cpp
114 VFileDevice.cpp
115 VideoView.cpp)
116
117set(UI_FILES
118 AboutScreen.ui
119 ArchiveInspector.ui
120 AssetTile.ui
121 CheatsView.ui
122 DebuggerConsole.ui
123 GIFView.ui
124 IOViewer.ui
125 LoadSaveState.ui
126 LogView.ui
127 MemorySearch.ui
128 MemoryView.ui
129 ObjView.ui
130 OverrideView.ui
131 PaletteView.ui
132 ROMInfo.ui
133 SensorView.ui
134 SettingsView.ui
135 ShaderSelector.ui
136 ShortcutView.ui
137 TileView.ui
138 VideoView.ui)
139
140set(GBA_SRC
141 GBAOverride.cpp)
142
143set(GB_SRC
144 GBOverride.cpp)
145
146set(QT_LIBRARIES)
147set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5widgets5,libqt5opengl5")
148
149set(AUDIO_SRC)
150if(BUILD_SDL)
151 list(APPEND AUDIO_SRC AudioProcessorSDL.cpp)
152endif()
153
154if(M_CORE_GBA)
155 list(APPEND PLATFORM_SRC ${GBA_SRC})
156endif()
157
158if(M_CORE_GB)
159 list(APPEND PLATFORM_SRC ${GB_SRC})
160endif()
161
162set(QT_DEFINES)
163if(Qt5Multimedia_FOUND)
164 list(APPEND AUDIO_SRC
165 AudioProcessorQt.cpp
166 AudioDevice.cpp)
167 if (WIN32 AND QT_STATIC)
168 list(APPEND QT_LIBRARIES qtaudio_windows strmiids)
169 endif()
170 list(APPEND QT_LIBRARIES Qt5::Multimedia)
171 list(APPEND QT_DEFINES BUILD_QT_MULTIMEDIA)
172 set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5multimedia5")
173endif()
174
175if(NOT AUDIO_SRC)
176 message(WARNING "No supported audio modules found")
177 set(BUILD_QT OFF PARENT_SCOPE)
178 return()
179endif()
180
181if(USE_DEBUGGERS)
182 list(APPEND SOURCE_FILES
183 DebuggerController.cpp
184 DebuggerConsole.cpp
185 DebuggerConsoleController.cpp)
186endif()
187
188if(USE_GDB_STUB)
189 list(APPEND SOURCE_FILES GDBController.cpp GDBWindow.cpp)
190endif()
191
192if(USE_SQLITE3)
193 list(APPEND SOURCE_FILES
194 ArchiveInspector.cpp
195 library/LibraryController.cpp
196 library/LibraryGrid.cpp
197 library/LibraryTree.cpp)
198endif()
199
200qt5_add_resources(RESOURCES resources.qrc)
201if(APPLE)
202 set(MACOSX_BUNDLE_ICON_FILE mgba.icns)
203 set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
204 set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
205 set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
206 set_source_files_properties(${CMAKE_SOURCE_DIR}/res/mgba.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
207endif()
208if(WIN32)
209 configure_file(${CMAKE_SOURCE_DIR}/res/mgba.rc.in ${CMAKE_BINARY_DIR}/res/mgba.rc)
210 list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/mgba.rc)
211 set_source_files_properties(${CMAKE_BINARY_DIR}/res/mgba.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/mgba.ico)
212endif()
213if(NOT DEFINED DATADIR)
214 if(APPLE)
215 set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
216 elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
217 set(DATADIR ".")
218 else()
219 set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
220 endif()
221endif()
222if(BUILD_GL OR BUILD_GLES2)
223 install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
224endif()
225install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
226if(NOT WIN32 AND NOT APPLE)
227 list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
228endif()
229
230find_package(Qt5LinguistTools)
231if(Qt5LinguistTools_FOUND)
232 set(TRANSLATION_FILES)
233 set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
234 file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
235 if(UPDATE_TRANSLATIONS)
236 qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
237 else()
238 qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
239 endif()
240 set(QT_QM_FILES)
241 if(QT_STATIC)
242 get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
243 get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
244 get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
245 foreach(TS ${TS_FILES})
246 get_filename_component(TS ${TS} NAME)
247 string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
248 list(APPEND QT_QM_FILES "${QT_QM_LOCATION}/${QT_QM}")
249 endforeach()
250 list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
251 endif()
252 add_custom_command(OUTPUT ${TRANSLATION_QRC}
253 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"
254 DEPENDS ${TRANSLATION_FILES})
255 qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
256 list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
257endif()
258
259qt5_wrap_ui(UI_SRC ${UI_FILES})
260
261add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/mgba.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
262set_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}")
263
264list(APPEND QT_LIBRARIES Qt5::Widgets)
265if(BUILD_GL OR BUILD_GLES2)
266 list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
267endif()
268if(QT_STATIC)
269 find_library(QTPCRE NAMES qtpcre2 qtpcre)
270 if(WIN32)
271 list(APPEND QT_LIBRARIES qwindows dwmapi imm32 uxtheme Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport)
272 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ws2_32")
273 elseif(APPLE)
274 find_package(Cups)
275 find_package(Qt5PrintSupport)
276 find_library(QTFREETYPE NAMES qtfreetype)
277 find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
278 find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
279 list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia")
280 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
281 link_directories()
282 endif()
283endif()
284target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
285set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
286
287install(TARGETS ${BINARY_NAME}-qt
288 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
289 BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
290if(UNIX AND NOT APPLE)
291 find_program(DESKTOP_FILE_INSTALL desktop-file-install)
292 if(DESKTOP_FILE_INSTALL)
293 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/\")")
294 endif()
295endif()
296if(UNIX)
297 install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
298endif()
299if(APPLE OR WIN32)
300 set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
301endif()
302if(APPLE)
303 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
304 get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
305 get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
306 get_target_property(BUNDLE_PATH ${BINARY_NAME}-qt LOCATION)
307 target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
308 set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
309 set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
310 install(CODE "
311 include(BundleUtilities)
312 set(BU_CHMOD_BUNDLE_ITEMS ON)
313 file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
314 fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\")
315 " COMPONENT ${BINARY_NAME}-qt)
316 else()
317 set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib)
318 if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
319 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
320 endif()
321 if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
322 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
323 endif()
324 if(DEFINED CROSS_ROOT)
325 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
326 endif()
327 install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
328 endif()
329elseif(WIN32)
330 if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
331 # Work around CMake issue #16907
332 set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
333 endif()
334 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
335 find_program(BASH bash)
336 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)
337 endif()
338endif()