all repos — mgba @ a405ec42b46099ad050735ab797ca55f75dbdb64

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