all repos — mgba @ f06b5afc7fcfe66728919c346cc4a54aee38e6ab

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