all repos — mgba @ f03389bfca8e6ec52815ae2d9941ec7f0a9e691c

mGBA Game Boy Advance Emulator

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()