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(Qt5Multimedia)
27find_package(Qt5OpenGL)
28find_package(Qt5Widgets)
29
30if(NOT BUILD_GL AND NOT BUILD_GLES2)
31 message(WARNING "OpenGL is recommended to build the Qt port")
32endif()
33
34set(FOUND_QT ${Qt5Widgets_FOUND} PARENT_SCOPE)
35if(NOT Qt5Widgets_FOUND)
36 message(WARNING "Cannot find Qt modules")
37 return()
38endif()
39
40if(APPLE)
41 if(Qt5Widgets_VERSION MATCHES "^5.1[0-9]")
42 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.8")
43 else()
44 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.7")
45 endif()
46 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
47 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
48 endif()
49endif()
50
51if(BUILD_GL)
52 list(APPEND PLATFORM_SRC ${CMAKE_SOURCE_DIR}/src/platform/opengl/gl.c)
53 if(NOT WIN32 OR USE_EPOXY)
54 list(APPEND PLATFORM_SRC ${CMAKE_SOURCE_DIR}/src/platform/opengl/gles2.c)
55 endif()
56endif()
57
58if(BUILD_GLES2)
59 list(APPEND PLATFORM_SRC ${CMAKE_SOURCE_DIR}/src/platform/opengl/gles2.c)
60endif()
61
62get_target_property(QT_TYPE Qt5::Core TYPE)
63if(QT_TYPE STREQUAL STATIC_LIBRARY)
64 set(QT_STATIC ON)
65 list(APPEND QT_DEFINES QT_STATIC)
66endif()
67
68set(SOURCE_FILES
69 AboutScreen.cpp
70 AssetTile.cpp
71 AssetView.cpp
72 AudioProcessor.cpp
73 CheatsModel.cpp
74 CheatsView.cpp
75 ConfigController.cpp
76 ColorPicker.cpp
77 CoreManager.cpp
78 CoreController.cpp
79 Display.cpp
80 DisplayGL.cpp
81 DisplayQt.cpp
82 GBAApp.cpp
83 GIFView.cpp
84 GamepadAxisEvent.cpp
85 GamepadButtonEvent.cpp
86 GamepadHatEvent.cpp
87 IOViewer.cpp
88 KeyEditor.cpp
89 LoadSaveState.cpp
90 LogController.cpp
91 LogConfigModel.cpp
92 LogView.cpp
93 MapView.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 PlacementControl.cpp
103 RegisterView.cpp
104 ROMInfo.cpp
105 RotatedHeaderView.cpp
106 SavestateButton.cpp
107 SensorView.cpp
108 SettingsView.cpp
109 ShaderSelector.cpp
110 ShortcutView.cpp
111 Swatch.cpp
112 TilePainter.cpp
113 TileView.cpp
114 utils.cpp
115 Window.cpp
116 VFileDevice.cpp
117 VideoView.cpp
118 input/InputController.cpp
119 input/InputIndex.cpp
120 input/InputItem.cpp
121 input/InputModel.cpp
122 input/InputProfile.cpp)
123
124set(UI_FILES
125 AboutScreen.ui
126 ArchiveInspector.ui
127 AssetTile.ui
128 BattleChipView.ui
129 CheatsView.ui
130 DebuggerConsole.ui
131 GIFView.ui
132 IOViewer.ui
133 LoadSaveState.ui
134 LogView.ui
135 MapView.ui
136 MemorySearch.ui
137 MemoryView.ui
138 ObjView.ui
139 OverrideView.ui
140 PaletteView.ui
141 PlacementControl.ui
142 PrinterView.ui
143 ROMInfo.ui
144 SensorView.ui
145 SettingsView.ui
146 ShaderSelector.ui
147 ShortcutView.ui
148 TileView.ui
149 VideoView.ui)
150
151set(GBA_SRC
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
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
216qt5_add_resources(RESOURCES resources.qrc)
217if(APPLE)
218 set(MACOSX_BUNDLE_ICON_FILE ${BINARY_NAME}.icns)
219 set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
220 set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
221 set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
222 set_source_files_properties(${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
223endif()
224if(WIN32)
225 configure_file(${CMAKE_SOURCE_DIR}/res/win.rc.in ${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc)
226 list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc)
227 set_source_files_properties(${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.ico)
228endif()
229if(NOT DEFINED DATADIR)
230 if(APPLE)
231 set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
232 elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
233 set(DATADIR ".")
234 else()
235 set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
236 endif()
237endif()
238if(BUILD_GL OR BUILD_GLES2)
239 install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
240endif()
241install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
242if(NOT WIN32 AND NOT APPLE)
243 list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
244endif()
245
246find_package(Qt5LinguistTools)
247if(Qt5LinguistTools_FOUND)
248 set(TRANSLATION_FILES)
249 set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
250 file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
251 if(UPDATE_TRANSLATIONS)
252 qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
253 else()
254 qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
255 endif()
256 set(QT_QM_FILES)
257 if(QT_STATIC)
258 get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
259 get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
260 get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
261 foreach(TS ${TS_FILES})
262 get_filename_component(TS ${TS} NAME)
263 string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
264 list(APPEND QT_QM_FILES "${QT_QM_LOCATION}/${QT_QM}")
265 endforeach()
266 list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
267 endif()
268 add_custom_command(OUTPUT ${TRANSLATION_QRC}
269 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"
270 DEPENDS ${TRANSLATION_FILES})
271 qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
272 list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
273endif()
274
275qt5_wrap_ui(UI_SRC ${UI_FILES})
276
277add_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})
278set_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}")
279
280list(APPEND QT_LIBRARIES Qt5::Widgets)
281if(BUILD_GL OR BUILD_GLES2)
282 list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
283endif()
284if(QT_STATIC)
285 find_library(QTPCRE NAMES qtpcre2 qtpcre)
286 if(WIN32)
287 list(APPEND QT_LIBRARIES qwindows dwmapi imm32 uxtheme Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport)
288 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ws2_32")
289 elseif(APPLE)
290 find_package(Cups)
291 find_package(Qt5PrintSupport)
292 find_library(QTFREETYPE NAMES qtfreetype)
293 find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
294 find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
295 list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia")
296 set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
297 link_directories()
298 endif()
299endif()
300target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
301set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
302
303install(TARGETS ${BINARY_NAME}-qt
304 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
305 BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
306if(UNIX AND NOT APPLE)
307 find_program(DESKTOP_FILE_INSTALL desktop-file-install)
308 if(DESKTOP_FILE_INSTALL)
309 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)
310 endif()
311endif()
312if(UNIX)
313 install(FILES ${CMAKE_SOURCE_DIR}/doc/${BINARY_NAME}-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
314endif()
315if(APPLE OR WIN32)
316 set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
317endif()
318if(APPLE)
319 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
320 get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
321 get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
322 get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
323 set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
324 target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
325 set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
326 set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
327 set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
328 install(CODE "
329 include(BundleUtilities)
330 set(BU_CHMOD_BUNDLE_ITEMS ON)
331 file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
332 fixup_bundle(\"${BUNDLE_PATH}\" \"${PLUGINS}\" \"\")
333 " COMPONENT ${BINARY_NAME}-qt)
334 else()
335 set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
336 if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
337 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
338 endif()
339 if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
340 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
341 endif()
342 if(DEFINED CROSS_ROOT)
343 set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
344 endif()
345 install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
346 endif()
347elseif(WIN32)
348 if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
349 # Work around CMake issue #16907
350 set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
351 endif()
352 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
353 find_program(BASH bash)
354 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)
355 endif()
356 if(DISTBUILD)
357 file(WRITE "${CMAKE_BINARY_DIR}/portable.ini" "")
358 install(FILES "${CMAKE_BINARY_DIR}/portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
359 endif()
360endif()
361
362if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
363 if(NOT APPLE)
364 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${OBJCOPY}" --only-keep-debug "$<TARGET_FILE:${BINARY_NAME}-qt>" "$<TARGET_FILE:${BINARY_NAME}-qt>.dSYM")
365 add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" -S "$<TARGET_FILE:${BINARY_NAME}-qt>")
366 install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.dSYM" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
367 endif()
368endif()