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 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 ColorPicker.cpp
78 CoreManager.cpp
79 CoreController.cpp
80 Display.cpp
81 DisplayGL.cpp
82 DisplayQt.cpp
83 GBAApp.cpp
84 GBAKeyEditor.cpp
85 GIFView.cpp
86 GamepadAxisEvent.cpp
87 GamepadButtonEvent.cpp
88 GamepadHatEvent.cpp
89 IOViewer.cpp
90 InputController.cpp
91 InputProfile.cpp
92 KeyEditor.cpp
93 LoadSaveState.cpp
94 LogController.cpp
95 LogView.cpp
96 MapView.cpp
97 MemoryModel.cpp
98 MemorySearch.cpp
99 MemoryView.cpp
100 MessagePainter.cpp
101 MultiplayerController.cpp
102 ObjView.cpp
103 OverrideView.cpp
104 PaletteView.cpp
105 PrinterView.cpp
106 RegisterView.cpp
107 ROMInfo.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 CheatsView.ui
127 DebuggerConsole.ui
128 GIFView.ui
129 IOViewer.ui
130 LoadSaveState.ui
131 LogView.ui
132 MapView.ui
133 MemorySearch.ui
134 MemoryView.ui
135 ObjView.ui
136 OverrideView.ui
137 PaletteView.ui
138 PrinterView.ui
139 ROMInfo.ui
140 SensorView.ui
141 SettingsView.ui
142 ShaderSelector.ui
143 ShortcutView.ui
144 TileView.ui
145 VideoView.ui)
146
147set(GBA_SRC
148 GBAOverride.cpp)
149
150set(GB_SRC
151 GBOverride.cpp)
152
153set(QT_LIBRARIES)
154set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5widgets5,libqt5opengl5")
155
156set(AUDIO_SRC)
157if(BUILD_SDL)
158 list(APPEND AUDIO_SRC AudioProcessorSDL.cpp)
159endif()
160
161if(M_CORE_GBA)
162 list(APPEND PLATFORM_SRC ${GBA_SRC})
163endif()
164
165if(M_CORE_GB)
166 list(APPEND PLATFORM_SRC ${GB_SRC})
167endif()
168
169set(QT_DEFINES)
170if(Qt5Multimedia_FOUND)
171 list(APPEND AUDIO_SRC
172 AudioProcessorQt.cpp
173 AudioDevice.cpp)
174 list(APPEND SOURCE_FILES
175 VideoDumper.cpp)
176 if (WIN32 AND QT_STATIC)
177 list(APPEND QT_LIBRARIES Qt5::QWindowsAudioPlugin Qt5::DSServicePlugin
178 strmiids mfuuid mfplat mf ksguid dxva2 evr d3d9)
179 endif()
180 list(APPEND QT_LIBRARIES Qt5::Multimedia)
181 list(APPEND QT_DEFINES BUILD_QT_MULTIMEDIA)
182 set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5multimedia5")
183endif()
184
185if(NOT AUDIO_SRC)
186 message(WARNING "No supported audio modules found")
187 set(BUILD_QT OFF PARENT_SCOPE)
188 return()
189endif()
190
191if(USE_DEBUGGERS)
192 list(APPEND SOURCE_FILES
193 DebuggerController.cpp
194 DebuggerConsole.cpp
195 DebuggerConsoleController.cpp)
196endif()
197
198if(USE_GDB_STUB)
199 list(APPEND SOURCE_FILES GDBController.cpp GDBWindow.cpp)
200endif()
201
202if(USE_SQLITE3)
203 list(APPEND SOURCE_FILES
204 ArchiveInspector.cpp
205 library/LibraryController.cpp
206 library/LibraryGrid.cpp
207 library/LibraryTree.cpp)
208endif()
209
210qt5_add_resources(RESOURCES resources.qrc)
211if(APPLE)
212 set(MACOSX_BUNDLE_ICON_FILE mgba.icns)
213 set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
214 set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
215 set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
216 set_source_files_properties(${CMAKE_SOURCE_DIR}/res/mgba.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
217endif()
218if(WIN32)
219 configure_file(${CMAKE_SOURCE_DIR}/res/mgba.rc.in ${CMAKE_BINARY_DIR}/res/mgba.rc)
220 list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/mgba.rc)
221 set_source_files_properties(${CMAKE_BINARY_DIR}/res/mgba.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/mgba.ico)
222endif()
223if(NOT DEFINED DATADIR)
224 if(APPLE)
225 set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
226 elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
227 set(DATADIR ".")
228 else()
229 set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
230 endif()
231endif()
232if(BUILD_GL OR BUILD_GLES2)
233 install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
234endif()
235install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
236if(NOT WIN32 AND NOT APPLE)
237 list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
238endif()
239
240find_package(Qt5LinguistTools)
241if(Qt5LinguistTools_FOUND)
242 set(TRANSLATION_FILES)
243 set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
244 file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
245 if(UPDATE_TRANSLATIONS)
246 qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
247 else()
248 qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
249 endif()
250 set(QT_QM_FILES)
251 if(QT_STATIC)
252 get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
253 get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
254 get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
255 foreach(TS ${TS_FILES})
256 get_filename_component(TS ${TS} NAME)
257 string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
258 list(APPEND QT_QM_FILES "${QT_QM_LOCATION}/${QT_QM}")
259 endforeach()
260 list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
261 endif()
262 add_custom_command(OUTPUT ${TRANSLATION_QRC}
263 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"
264 DEPENDS ${TRANSLATION_FILES})
265 qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
266 list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
267endif()
268
269qt5_wrap_ui(UI_SRC ${UI_FILES})
270
271add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/mgba.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
272set_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}")
273
274list(APPEND QT_LIBRARIES Qt5::Widgets)
275if(BUILD_GL OR BUILD_GLES2)
276 list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
277endif()
278if(WIN32 AND QT_STATIC)
279 list(APPEND QT_LIBRARIES qwindows dwmapi imm32 uxtheme Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport)
280 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "qtpcre2;version;winmm;ws2_32")
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 get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
305 set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
306 target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
307 set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
308 set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
309 set_source_files_properties("${QTAVFSERVICE}" 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,mediaservice/libqavfcamera.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()