all repos — mgba @ 4fd170ac38a9c312f3dd1d0dd912d2c761f60fdb

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)
 24include_directories(${CMAKE_CURRENT_SOURCE_DIR}/input)
 25
 26find_package(Qt5 COMPONENTS Core Widgets OpenGL Network Multimedia)
 27
 28if(NOT BUILD_GL AND NOT BUILD_GLES2)
 29	message(WARNING "OpenGL is recommended to build the Qt port")
 30endif()
 31
 32set(FOUND_QT ${Qt5Widgets_FOUND} PARENT_SCOPE)
 33if(NOT Qt5Widgets_FOUND)
 34	message(WARNING "Cannot find Qt modules")
 35	return()
 36endif()
 37
 38if(APPLE)
 39	if(Qt5Widgets_VERSION MATCHES "^5.1[0-9]")
 40		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.8")
 41	else()
 42		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.7")
 43	endif()
 44	if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
 45		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
 46	endif()
 47endif()
 48
 49if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
 50	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
 51endif()
 52
 53get_target_property(QT_TYPE Qt5::Core TYPE)
 54if(QT_TYPE STREQUAL STATIC_LIBRARY)
 55	set(QT_STATIC ON)
 56	list(APPEND QT_DEFINES QT_STATIC)
 57endif()
 58
 59set(SOURCE_FILES
 60	AboutScreen.cpp
 61	AbstractUpdater.cpp
 62	Action.cpp
 63	ActionMapper.cpp
 64	AssetInfo.cpp
 65	AssetTile.cpp
 66	AssetView.cpp
 67	AudioProcessor.cpp
 68	CheatsModel.cpp
 69	CheatsView.cpp
 70	ConfigController.cpp
 71	ColorPicker.cpp
 72	CoreManager.cpp
 73	CoreController.cpp
 74	Display.cpp
 75	DisplayGL.cpp
 76	DisplayQt.cpp
 77	FrameView.cpp
 78	GBAApp.cpp
 79	GIFView.cpp
 80	GamepadAxisEvent.cpp
 81	GamepadButtonEvent.cpp
 82	GamepadHatEvent.cpp
 83	IOViewer.cpp
 84	KeyEditor.cpp
 85	LoadSaveState.cpp
 86	LogController.cpp
 87	LogConfigModel.cpp
 88	LogView.cpp
 89	MapView.cpp
 90	MemoryDump.cpp
 91	MemoryModel.cpp
 92	MemorySearch.cpp
 93	MemoryView.cpp
 94	MessagePainter.cpp
 95	MultiplayerController.cpp
 96	ObjView.cpp
 97	OverrideView.cpp
 98	PaletteView.cpp
 99	PlacementControl.cpp
100	RegisterView.cpp
101	ROMInfo.cpp
102	RotatedHeaderView.cpp
103	SavestateButton.cpp
104	SensorView.cpp
105	SettingsView.cpp
106	ShaderSelector.cpp
107	ShortcutController.cpp
108	ShortcutModel.cpp
109	ShortcutView.cpp
110	Swatch.cpp
111	TilePainter.cpp
112	TileView.cpp
113	utils.cpp
114	Window.cpp
115	VFileDevice.cpp
116	VideoProxy.cpp
117	VideoView.cpp
118	input/InputController.cpp
119	input/InputIndex.cpp
120	input/InputItem.cpp
121	input/InputModel.cpp
122	input/InputProfile.cpp)
123
124set(UI_FILES
125	AboutScreen.ui
126	ArchiveInspector.ui
127	AssetTile.ui
128	BattleChipView.ui
129	CheatsView.ui
130	DebuggerConsole.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	ROMInfo.ui
146	SensorView.ui
147	SettingsView.ui
148	ShaderSelector.ui
149	ShortcutView.ui
150	TileView.ui
151	VideoView.ui)
152
153set(GBA_SRC
154	BattleChipModel.cpp
155	BattleChipUpdater.cpp
156	BattleChipView.cpp
157	GBAOverride.cpp)
158
159set(GB_SRC
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 ${BINARY_NAME}.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/${BINARY_NAME}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
232endif()
233if(WIN32)
234	configure_file(${CMAKE_SOURCE_DIR}/res/win.rc.in ${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc)
235	list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc)
236	set_source_files_properties(${CMAKE_BINARY_DIR}/res/${BINARY_NAME}.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}.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/${BINARY_NAME}.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} 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	find_program(DESKTOP_FILE_INSTALL desktop-file-install)
328	if(DESKTOP_FILE_INSTALL)
329		install(CODE "execute_process(COMMAND ${DESKTOP_FILE_INSTALL} \"${CMAKE_SOURCE_DIR}/res/${BINARY_NAME}-qt.desktop\" --dir \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/applications/\")" COMPONENT ${BINARY_NAME}-qt)
330	endif()
331endif()
332if(UNIX)
333	install(FILES ${CMAKE_SOURCE_DIR}/doc/${BINARY_NAME}-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
334endif()
335if(APPLE OR WIN32)
336	set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
337endif()
338if(APPLE)
339	if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
340		get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
341		get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
342		get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
343		set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
344		target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
345		set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
346		set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
347		set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
348		install(CODE "
349		   include(BundleUtilities)
350		   set(BU_CHMOD_BUNDLE_ITEMS ON)
351		   file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
352		   fixup_bundle(\"${BUNDLE_PATH}\"   \"${PLUGINS}\"   \"\")
353		   " COMPONENT ${BINARY_NAME}-qt)
354	else()
355		set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
356		if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
357			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
358		endif()
359		if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
360			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
361		endif()
362		if(DEFINED CROSS_ROOT)
363			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
364		endif()
365		install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
366	endif()
367elseif(WIN32)
368	if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
369		# Work around CMake issue #16907
370		set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
371	endif()
372	if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
373		find_program(BASH bash)
374		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)
375	endif()
376	if(DISTBUILD)
377		file(WRITE "${CMAKE_BINARY_DIR}/portable.ini" "")
378		install(FILES "${CMAKE_BINARY_DIR}/portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
379	endif()
380endif()
381
382if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
383	if(NOT APPLE)
384		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")
385		add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$<TARGET_FILE:${BINARY_NAME}-qt>")
386		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>")
387		install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
388	endif()
389endif()