all repos — mgba @ 1089285b45c1213fff87e0518fc45a327b8ede8b

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