all repos — mgba @ 6e01765ed2e9f6101aee54d9113cc42b320de305

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(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	ROMInfo.cpp
104	RotatedHeaderView.cpp
105	SavestateButton.cpp
106	SensorView.cpp
107	SettingsView.cpp
108	ShaderSelector.cpp
109	ShortcutController.cpp
110	ShortcutModel.cpp
111	ShortcutView.cpp
112	Swatch.cpp
113	TilePainter.cpp
114	TileView.cpp
115	utils.cpp
116	Window.cpp
117	VFileDevice.cpp
118	VideoProxy.cpp
119	VideoView.cpp)
120
121set(UI_FILES
122	AboutScreen.ui
123	ArchiveInspector.ui
124	AssetTile.ui
125	BattleChipView.ui
126	CheatsView.ui
127	DebuggerConsole.ui
128	FrameView.ui
129	GIFView.ui
130	IOViewer.ui
131	LoadSaveState.ui
132	LogView.ui
133	MapView.ui
134	MemoryDump.ui
135	MemorySearch.ui
136	MemoryView.ui
137	ObjView.ui
138	OverrideView.ui
139	PaletteView.ui
140	PlacementControl.ui
141	PrinterView.ui
142	ROMInfo.ui
143	SensorView.ui
144	SettingsView.ui
145	ShaderSelector.ui
146	ShortcutView.ui
147	TileView.ui
148	VideoView.ui)
149
150set(GBA_SRC
151	BattleChipModel.cpp
152	BattleChipUpdater.cpp
153	BattleChipView.cpp
154	GBAOverride.cpp)
155
156set(GB_SRC
157	GBOverride.cpp
158	PrinterView.cpp)
159
160set(QT_LIBRARIES)
161set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5widgets5,libqt5opengl5")
162
163set(AUDIO_SRC)
164if(BUILD_SDL)
165	list(APPEND AUDIO_SRC AudioProcessorSDL.cpp)
166endif()
167
168if(M_CORE_GBA)
169	list(APPEND PLATFORM_SRC ${GBA_SRC})
170endif()
171
172if(M_CORE_GB)
173	list(APPEND PLATFORM_SRC ${GB_SRC})
174endif()
175
176set(QT_DEFINES)
177if(Qt5Multimedia_FOUND)
178	list(APPEND AUDIO_SRC
179		AudioProcessorQt.cpp
180		AudioDevice.cpp)
181	list(APPEND SOURCE_FILES
182		VideoDumper.cpp)
183	if (WIN32 AND QT_STATIC)
184		list(APPEND QT_LIBRARIES Qt5::QWindowsAudioPlugin Qt5::DSServicePlugin Qt5::QWindowsVistaStylePlugin
185                                 strmiids mfuuid mfplat mf ksguid dxva2 evr d3d9)
186	endif()
187	list(APPEND QT_LIBRARIES Qt5::Multimedia)
188	list(APPEND QT_DEFINES BUILD_QT_MULTIMEDIA)
189	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5multimedia5")
190endif()
191
192if(NOT AUDIO_SRC)
193	message(WARNING "No supported audio modules found")
194	set(BUILD_QT OFF PARENT_SCOPE)
195	return()
196endif()
197
198if(USE_DEBUGGERS)
199	list(APPEND SOURCE_FILES
200		DebuggerController.cpp
201		DebuggerConsole.cpp
202		DebuggerConsoleController.cpp)
203endif()
204
205if(USE_GDB_STUB)
206	list(APPEND SOURCE_FILES GDBController.cpp GDBWindow.cpp)
207endif()
208
209if(USE_SQLITE3)
210	list(APPEND SOURCE_FILES
211		ArchiveInspector.cpp
212		library/LibraryController.cpp
213		library/LibraryGrid.cpp
214		library/LibraryTree.cpp)
215endif()
216
217if(USE_DISCORD_RPC)
218	list(APPEND QT_LIBRARIES discord-rpc)
219	list(APPEND SOURCE_FILES DiscordCoordinator.cpp)
220endif()
221
222qt5_add_resources(RESOURCES resources.qrc)
223if(APPLE)
224	set(MACOSX_BUNDLE_ICON_FILE mgba.icns)
225	set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
226	set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
227	set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
228	set_source_files_properties(${CMAKE_SOURCE_DIR}/res/mgba.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
229endif()
230if(WIN32)
231	configure_file(${CMAKE_SOURCE_DIR}/res/mgba.rc.in ${CMAKE_BINARY_DIR}/res/mgba.rc)
232	list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/mgba.rc)
233	set_source_files_properties(${CMAKE_BINARY_DIR}/res/mgba.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/mgba.ico)
234endif()
235if(NOT DEFINED DATADIR)
236	if(APPLE)
237		set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
238	elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
239		set(DATADIR ".")
240	else()
241		set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
242	endif()
243endif()
244if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
245	install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
246endif()
247install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
248if(NOT WIN32 AND NOT APPLE)
249	list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
250endif()
251
252find_package(Qt5LinguistTools)
253if(Qt5LinguistTools_FOUND)
254	set(TRANSLATION_FILES)
255	set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
256	file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
257	if(UPDATE_TRANSLATIONS)
258		qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
259	else()
260		qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
261	endif()
262	set(QT_QM_FILES)
263	if(QT_STATIC)
264		get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
265		get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
266		get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
267		foreach(TS ${TS_FILES})
268			get_filename_component(TS ${TS} NAME)
269			string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
270			set(QT_QM "${QT_QM_LOCATION}/${QT_QM}")
271			if(EXISTS "${QT_QM}")
272				list(APPEND QT_QM_FILES "${QT_QM}")
273			endif()
274		endforeach()
275		list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
276	endif()
277	add_custom_command(OUTPUT ${TRANSLATION_QRC}
278		               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"
279		               DEPENDS ${TRANSLATION_FILES})
280	qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
281	list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
282endif()
283
284qt5_wrap_ui(UI_SRC ${UI_FILES})
285
286add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/mgba.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
287set_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}")
288
289if(WIN32)
290	set_target_properties(${BINARY_NAME}-qt PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
291endif()
292
293list(APPEND QT_LIBRARIES Qt5::Widgets Qt5::Network)
294if(BUILD_GL OR BUILD_GLES2 OR BUILD_EPOXY)
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		if(CMAKE_CROSSCOMPILING)
301			set(QWINDOWS_DEPS Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport Qt5WindowsUIAutomationSupport)
302		endif()
303		list(APPEND QT_LIBRARIES Qt5::QWindowsIntegrationPlugin ${QWINDOWS_DEPS} amstrmid dwmapi uxtheme imm32 -static-libgcc -static-libstdc++)
304		set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ssl;crypto;ws2_32;iphlpapi;crypt32;userenv;netapi32;wtsapi32")
305		set_target_properties(Qt5::Gui PROPERTIES INTERFACE_LINK_LIBRARIES ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
306	elseif(APPLE)
307		find_package(Cups)
308		find_package(Qt5PrintSupport)
309		find_library(QTFREETYPE NAMES qtfreetype)
310		find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
311		find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
312		list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia" "-framework SystemConfiguration" "-framework Security")
313		set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
314		link_directories()
315	endif()
316endif()
317target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
318set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
319
320install(TARGETS ${BINARY_NAME}-qt
321	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
322	BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
323if(UNIX AND NOT APPLE)
324	find_program(DESKTOP_FILE_INSTALL desktop-file-install)
325	if(DESKTOP_FILE_INSTALL)
326		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)
327	endif()
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()