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