all repos — mgba @ 3a3d01aedc384e24b2de40c403669cf337587039

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