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)
24include_directories(${CMAKE_CURRENT_SOURCE_DIR}/input)
25
26find_package(Qt5 COMPONENTS Core Widgets OpenGL Network Multimedia)
27
28if(NOT BUILD_GL AND NOT BUILD_GLES2)
29 message(WARNING "OpenGL is recommended to build the Qt port")
30endif()
31
32set(FOUND_QT ${Qt5Widgets_FOUND} PARENT_SCOPE)
33if(NOT Qt5Widgets_FOUND)
34 message(WARNING "Cannot find Qt modules")
35 return()
36endif()
37
38if(APPLE)
39 if(Qt5Widgets_VERSION MATCHES "^5.1[0-9]")
40 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.8")
41 else()
42 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.7")
43 endif()
44 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
45 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
46 endif()
47endif()
48
49get_target_property(QT_TYPE Qt5::Core TYPE)
50if(QT_TYPE STREQUAL STATIC_LIBRARY)
51 set(QT_STATIC ON)
52 list(APPEND QT_DEFINES QT_STATIC)
53endif()
54
55set(SOURCE_FILES
56 AboutScreen.cpp
57 AbstractUpdater.cpp
58 Action.cpp
59 ActionMapper.cpp
60 AssetInfo.cpp
61 AssetTile.cpp
62 AssetView.cpp
63 AudioProcessor.cpp
64 CheatsModel.cpp
65 CheatsView.cpp
66 ConfigController.cpp
67 ColorPicker.cpp
68 CoreManager.cpp
69 CoreController.cpp
70 Display.cpp
71 DisplayGL.cpp
72 DisplayQt.cpp
73 FrameView.cpp
74 GBAApp.cpp
75 GIFView.cpp
76 GamepadAxisEvent.cpp
77 GamepadButtonEvent.cpp
78 GamepadHatEvent.cpp
79 IOViewer.cpp
80 KeyEditor.cpp
81 LoadSaveState.cpp
82 LogController.cpp
83 LogConfigModel.cpp
84 LogView.cpp
85 MapView.cpp
86 MemoryDump.cpp
87 MemoryModel.cpp
88 MemorySearch.cpp
89 MemoryView.cpp
90 MessagePainter.cpp
91 MultiplayerController.cpp
92 ObjView.cpp
93 OverrideView.cpp
94 PaletteView.cpp
95 PlacementControl.cpp
96 RegisterView.cpp
97 ROMInfo.cpp
98 RotatedHeaderView.cpp
99 SavestateButton.cpp
100 SensorView.cpp
101 SettingsView.cpp
102 ShaderSelector.cpp
103 ShortcutController.cpp
104 ShortcutModel.cpp
105 ShortcutView.cpp
106 Swatch.cpp
107 TilePainter.cpp
108 TileView.cpp
109 utils.cpp
110 Window.cpp
111 VFileDevice.cpp
112 VideoProxy.cpp
113 VideoView.cpp
114 input/InputController.cpp
115 input/InputIndex.cpp
116 input/InputItem.cpp
117 input/InputModel.cpp
118 input/InputProfile.cpp)
119
120set(UI_FILES
121 AboutScreen.ui
122 ArchiveInspector.ui
123 AssetTile.ui
124 BattleChipView.ui
125 CheatsView.ui
126 DebuggerConsole.ui
127 FrameView.ui
128 GIFView.ui
129 IOViewer.ui
130 LoadSaveState.ui
131 LogView.ui
132 MapView.ui
133 MemoryDump.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 BattleChipModel.cpp
151 BattleChipUpdater.cpp
152 BattleChipView.cpp
153 GBAOverride.cpp)
154
155set(GB_SRC
156 GBOverride.cpp
157 PrinterView.cpp)
158
159set(QT_LIBRARIES)
160set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5widgets5,libqt5opengl5")
161
162set(AUDIO_SRC)
163if(BUILD_SDL)
164 list(APPEND AUDIO_SRC AudioProcessorSDL.cpp)
165endif()
166
167if(M_CORE_GBA)
168 list(APPEND PLATFORM_SRC ${GBA_SRC})
169endif()
170
171if(M_CORE_GB)
172 list(APPEND PLATFORM_SRC ${GB_SRC})
173endif()
174
175set(QT_DEFINES)
176if(Qt5Multimedia_FOUND)
177 list(APPEND AUDIO_SRC
178 AudioProcessorQt.cpp
179 AudioDevice.cpp)
180 list(APPEND SOURCE_FILES
181 VideoDumper.cpp)
182 if (WIN32 AND QT_STATIC)
183 list(APPEND QT_LIBRARIES Qt5::QWindowsAudioPlugin Qt5::DSServicePlugin Qt5::QWindowsVistaStylePlugin
184 strmiids mfuuid mfplat mf ksguid dxva2 evr d3d9)
185 endif()
186 list(APPEND QT_LIBRARIES Qt5::Multimedia)
187 list(APPEND QT_DEFINES BUILD_QT_MULTIMEDIA)
188 set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5multimedia5")
189endif()
190
191if(NOT AUDIO_SRC)
192 message(WARNING "No supported audio modules found")
193 set(BUILD_QT OFF PARENT_SCOPE)
194 return()
195endif()
196
197if(USE_DEBUGGERS)
198 list(APPEND SOURCE_FILES
199 DebuggerController.cpp
200 DebuggerConsole.cpp
201 DebuggerConsoleController.cpp)
202endif()
203
204if(USE_GDB_STUB)
205 list(APPEND SOURCE_FILES GDBController.cpp GDBWindow.cpp)
206endif()
207
208if(USE_SQLITE3)
209 list(APPEND SOURCE_FILES
210 ArchiveInspector.cpp
211 library/LibraryController.cpp
212 library/LibraryGrid.cpp
213 library/LibraryTree.cpp)
214endif()
215
216if(USE_DISCORD_RPC)
217 list(APPEND QT_LIBRARIES discord-rpc)
218 list(APPEND SOURCE_FILES DiscordCoordinator.cpp)
219endif()
220
221qt5_add_resources(RESOURCES resources.qrc)
222if(APPLE)
223 set(MACOSX_BUNDLE_ICON_FILE ${BINARY_NAME}.icns)
224 set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
225 set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
226 set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
227 set_source_files_properties(${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
228endif()
229if(WIN32)
230 configure_file(${CMAKE_SOURCE_DIR}/res/win.rc.in ${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc)
231 list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc)
232 set_source_files_properties(${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.ico)
233endif()
234if(NOT DEFINED DATADIR)
235 if(APPLE)
236 set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
237 elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
238 set(DATADIR ".")
239 else()
240 set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
241 endif()
242endif()
243if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
244 install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
245endif()
246install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
247if(NOT WIN32 AND NOT APPLE)
248 list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
249endif()
250
251find_package(Qt5LinguistTools)
252if(Qt5LinguistTools_FOUND)
253 set(TRANSLATION_FILES)
254 set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
255 file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
256 if(UPDATE_TRANSLATIONS)
257 qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
258 else()
259 qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
260 endif()
261 set(QT_QM_FILES)
262 if(QT_STATIC)
263 get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
264 get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
265 get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
266 foreach(TS ${TS_FILES})
267 get_filename_component(TS ${TS} NAME)
268 string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
269 set(QT_QM "${QT_QM_LOCATION}/${QT_QM}")
270 if(EXISTS "${QT_QM}")
271 list(APPEND QT_QM_FILES "${QT_QM}")
272 endif()
273 endforeach()
274 list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
275 endif()
276 add_custom_command(OUTPUT ${TRANSLATION_QRC}
277 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"
278 DEPENDS ${TRANSLATION_FILES})
279 qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
280 list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
281endif()
282
283qt5_wrap_ui(UI_SRC ${UI_FILES})
284
285add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
286set_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}")
287
288list(APPEND QT_LIBRARIES Qt5::Widgets Qt5::Network)
289if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
290 list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
291endif()
292if(QT_STATIC)
293 find_library(QTPCRE NAMES qtpcre2 qtpcre)
294 if(WIN32)
295 list(APPEND QT_LIBRARIES qwindows dwmapi imm32 uxtheme Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport Qt5WindowsUIAutomationSupport)
296 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ssl;crypto;ws2_32;iphlpapi;crypt32;userenv;netapi32;wtsapi32")
297 set_target_properties(Qt5::Gui PROPERTIES INTERFACE_LINK_LIBRARIES ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
298 elseif(APPLE)
299 find_package(Cups)
300 find_package(Qt5PrintSupport)
301 find_library(QTFREETYPE NAMES qtfreetype)
302 find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
303 find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
304 list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia" "-framework SystemConfiguration" "-framework Security")
305 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
306 link_directories()
307 endif()
308endif()
309target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
310set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
311
312install(TARGETS ${BINARY_NAME}-qt
313 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
314 BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
315if(UNIX AND NOT APPLE)
316 find_program(DESKTOP_FILE_INSTALL desktop-file-install)
317 if(DESKTOP_FILE_INSTALL)
318 install(CODE "execute_process(COMMAND ${DESKTOP_FILE_INSTALL} \"${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}-qt.desktop\" --dir \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/applications/\")" COMPONENT ${BINARY_NAME}-qt)
319 endif()
320endif()
321if(UNIX)
322 install(FILES ${CMAKE_SOURCE_DIR}/doc/${BINARY_NAME}-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
323endif()
324if(APPLE OR WIN32)
325 set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
326endif()
327if(APPLE)
328 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
329 get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
330 get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
331 get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
332 set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
333 target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
334 set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
335 set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
336 set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
337 install(CODE "
338 include(BundleUtilities)
339 set(BU_CHMOD_BUNDLE_ITEMS ON)
340 file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
341 fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\")
342 " COMPONENT ${BINARY_NAME}-qt)
343 else()
344 set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
345 if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
346 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
347 endif()
348 if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
349 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
350 endif()
351 if(DEFINED CROSS_ROOT)
352 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
353 endif()
354 install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
355 endif()
356elseif(WIN32)
357 if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
358 # Work around CMake issue #16907
359 set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
360 endif()
361 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
362 find_program(BASH bash)
363 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)
364 endif()
365 if(DISTBUILD)
366 file(WRITE "${CMAKE_BINARY_DIR}/portable.ini" "")
367 install(FILES "${CMAKE_BINARY_DIR}/portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
368 endif()
369endif()
370
371if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
372 if(NOT APPLE)
373 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${OBJCOPY}" --only-keep-debug "$<TARGET_FILE:${BINARY_NAME}-qt>" "$<TARGET_FILE:${BINARY_NAME}-qt>.debug")
374 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:${BINARY_NAME}-qt>")
375 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${OBJCOPY}" --add-gnu-debuglink "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" "$<TARGET_FILE:${BINARY_NAME}-qt>")
376 install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
377 endif()
378endif()