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