all repos — mgba @ fe249dec27f3e7d2e2f2c1e7baa3ae9593a2fb1f

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	else()
263		qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
264	endif()
265	set(QT_QM_FILES)
266	if(QT_STATIC)
267		get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
268		get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
269		get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
270		foreach(TS ${TS_FILES})
271			get_filename_component(TS ${TS} NAME)
272			string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
273			set(QT_QM "${QT_QM_LOCATION}/${QT_QM}")
274			if(EXISTS "${QT_QM}")
275				list(APPEND QT_QM_FILES "${QT_QM}")
276			endif()
277		endforeach()
278		list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
279	endif()
280	add_custom_command(OUTPUT ${TRANSLATION_QRC}
281		               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"
282		               DEPENDS ${TRANSLATION_FILES})
283	qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
284	list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
285endif()
286
287qt5_wrap_ui(UI_SRC ${UI_FILES})
288
289add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/mgba.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
290set_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}")
291
292if(WIN32)
293	set_target_properties(${BINARY_NAME}-qt PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
294endif()
295
296list(APPEND QT_LIBRARIES Qt5::Widgets Qt5::Network)
297if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
298	list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
299endif()
300if(QT_STATIC)
301	find_library(QTPCRE NAMES qtpcre2 qtpcre)
302	if(WIN32)
303		if(CMAKE_CROSSCOMPILING)
304			set(QWINDOWS_DEPS Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport Qt5WindowsUIAutomationSupport)
305		endif()
306		list(APPEND QT_LIBRARIES Qt5::QWindowsIntegrationPlugin ${QWINDOWS_DEPS} amstrmid dwmapi uxtheme imm32 -static-libgcc -static-libstdc++)
307		set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ssl;crypto;ws2_32;iphlpapi;crypt32;userenv;netapi32;wtsapi32")
308		set_target_properties(Qt5::Gui PROPERTIES INTERFACE_LINK_LIBRARIES ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
309	elseif(APPLE)
310		find_package(Cups)
311		find_package(Qt5PrintSupport)
312		find_library(QTFREETYPE NAMES qtfreetype)
313		find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
314		find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
315		list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia" "-framework SystemConfiguration" "-framework Security")
316		set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
317		link_directories()
318	endif()
319endif()
320target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
321set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
322
323install(TARGETS ${BINARY_NAME}-qt
324	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
325	BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
326if(UNIX AND NOT APPLE)
327	install(FILES ${CMAKE_SOURCE_DIR}/res/mgba-qt.desktop DESTINATION share/applications COMPONENT ${BINARY_NAME}-qt)
328endif()
329if(UNIX)
330	install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
331endif()
332if(APPLE OR WIN32)
333	set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
334endif()
335if(APPLE)
336	if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
337		get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
338		get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
339		get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
340		set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
341		target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
342		set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
343		set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
344		set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
345		install(CODE "
346		   include(BundleUtilities)
347		   set(BU_CHMOD_BUNDLE_ITEMS ON)
348		   file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
349		   fixup_bundle(\"${BUNDLE_PATH}\"   \"${PLUGINS}\"   \"\")
350		   " COMPONENT ${BINARY_NAME}-qt)
351	else()
352		set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
353		if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
354			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
355		endif()
356		if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
357			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
358		endif()
359		if(DEFINED CROSS_ROOT)
360			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
361		endif()
362		install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
363	endif()
364elseif(WIN32)
365	if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
366		# Work around CMake issue #16907
367		set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
368	endif()
369	if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
370		find_program(BASH bash)
371		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)
372	endif()
373	if(DISTBUILD)
374		file(WRITE "${CMAKE_BINARY_DIR}/portable.ini" "")
375		install(FILES "${CMAKE_BINARY_DIR}/portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
376	endif()
377endif()
378
379if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
380	if(NOT APPLE)
381		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")
382		add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:${BINARY_NAME}-qt>")
383		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>")
384		install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
385	endif()
386endif()