all repos — mgba @ 36477ca40d66b72a401ae7d7a6fdcf4dc056d840

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