all repos — mgba @ c94c5eeedf600efa7ed9d70da5d64e02df953371

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	AssetTile.cpp
 70	AssetView.cpp
 71	AudioProcessor.cpp
 72	CheatsModel.cpp
 73	CheatsView.cpp
 74	ConfigController.cpp
 75	ColorPicker.cpp
 76	CoreManager.cpp
 77	CoreController.cpp
 78	Display.cpp
 79	DisplayGL.cpp
 80	DisplayQt.cpp
 81	GBAApp.cpp
 82	GBAKeyEditor.cpp
 83	GIFView.cpp
 84	GamepadAxisEvent.cpp
 85	GamepadButtonEvent.cpp
 86	GamepadHatEvent.cpp
 87	IOViewer.cpp
 88	InputController.cpp
 89	InputProfile.cpp
 90	KeyEditor.cpp
 91	LoadSaveState.cpp
 92	LogController.cpp
 93	LogView.cpp
 94	MapView.cpp
 95	MemoryModel.cpp
 96	MemorySearch.cpp
 97	MemoryView.cpp
 98	MessagePainter.cpp
 99	MultiplayerController.cpp
100	ObjView.cpp
101	OverrideView.cpp
102	PaletteView.cpp
103	PlacementControl.cpp
104	PrinterView.cpp
105	RegisterView.cpp
106	ROMInfo.cpp
107	SavestateButton.cpp
108	SensorView.cpp
109	SettingsView.cpp
110	ShaderSelector.cpp
111	ShortcutController.cpp
112	ShortcutView.cpp
113	Swatch.cpp
114	TilePainter.cpp
115	TileView.cpp
116	utils.cpp
117	Window.cpp
118	VFileDevice.cpp
119	VideoView.cpp)
120
121set(UI_FILES
122	AboutScreen.ui
123	ArchiveInspector.ui
124	AssetTile.ui
125	CheatsView.ui
126	DebuggerConsole.ui
127	GIFView.ui
128	IOViewer.ui
129	LoadSaveState.ui
130	LogView.ui
131	MapView.ui
132	MemorySearch.ui
133	MemoryView.ui
134	ObjView.ui
135	OverrideView.ui
136	PaletteView.ui
137	PlacementControl.ui
138	PrinterView.ui
139	ROMInfo.ui
140	SensorView.ui
141	SettingsView.ui
142	ShaderSelector.ui
143	ShortcutView.ui
144	TileView.ui
145	VideoView.ui)
146
147set(GBA_SRC
148	GBAOverride.cpp)
149
150set(GB_SRC
151	GBOverride.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
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
210qt5_add_resources(RESOURCES resources.qrc)
211if(APPLE)
212	set(MACOSX_BUNDLE_ICON_FILE mgba.icns)
213	set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
214	set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
215	set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
216	set_source_files_properties(${CMAKE_SOURCE_DIR}/res/mgba.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
217endif()
218if(WIN32)
219	configure_file(${CMAKE_SOURCE_DIR}/res/mgba.rc.in ${CMAKE_BINARY_DIR}/res/mgba.rc)
220	list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/mgba.rc)
221	set_source_files_properties(${CMAKE_BINARY_DIR}/res/mgba.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/mgba.ico)
222endif()
223if(NOT DEFINED DATADIR)
224	if(APPLE)
225		set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
226	elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
227		set(DATADIR ".")
228	else()
229		set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
230	endif()
231endif()
232if(BUILD_GL OR BUILD_GLES2)
233	install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
234endif()
235install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
236if(NOT WIN32 AND NOT APPLE)
237	list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
238endif()
239
240find_package(Qt5LinguistTools)
241if(Qt5LinguistTools_FOUND)
242	set(TRANSLATION_FILES)
243	set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
244	file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
245	if(UPDATE_TRANSLATIONS)
246		qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
247	else()
248		qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
249	endif()
250	set(QT_QM_FILES)
251	if(QT_STATIC)
252		get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
253		get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
254		get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
255		foreach(TS ${TS_FILES})
256			get_filename_component(TS ${TS} NAME)
257			string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
258			list(APPEND QT_QM_FILES "${QT_QM_LOCATION}/${QT_QM}")
259		endforeach()
260		list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
261	endif()
262	add_custom_command(OUTPUT ${TRANSLATION_QRC}
263		               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"
264		               DEPENDS ${TRANSLATION_FILES})
265	qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
266	list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
267endif()
268
269qt5_wrap_ui(UI_SRC ${UI_FILES})
270
271add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/mgba.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
272set_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}")
273
274list(APPEND QT_LIBRARIES Qt5::Widgets)
275if(BUILD_GL OR BUILD_GLES2)
276	list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
277endif()
278if(QT_STATIC)
279	find_library(QTPCRE NAMES qtpcre2 qtpcre)
280	if(WIN32)
281		list(APPEND QT_LIBRARIES qwindows dwmapi imm32 uxtheme Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport)
282		set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ws2_32")
283	elseif(APPLE)
284		find_package(Cups)
285		find_package(Qt5PrintSupport)
286		find_library(QTFREETYPE NAMES qtfreetype)
287		find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz)
288		find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport)
289		list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia")
290		set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}")
291		link_directories()
292	endif()
293endif()
294target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES})
295set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
296
297install(TARGETS ${BINARY_NAME}-qt
298	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt
299	BUNDLE DESTINATION Applications COMPONENT ${BINARY_NAME}-qt)
300if(UNIX AND NOT APPLE)
301	find_program(DESKTOP_FILE_INSTALL desktop-file-install)
302	if(DESKTOP_FILE_INSTALL)
303		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)
304	endif()
305endif()
306if(UNIX)
307	install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba-qt.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-qt)
308endif()
309if(APPLE OR WIN32)
310	set_target_properties(${BINARY_NAME}-qt PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
311endif()
312if(APPLE)
313	if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
314		get_target_property(QTCOCOA Qt5::QCocoaIntegrationPlugin LOCATION)
315		get_target_property(COREAUDIO Qt5::CoreAudioPlugin LOCATION)
316		get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
317		set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
318		target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
319		set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
320		set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
321		set_source_files_properties("${QTAVFSERVICE}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
322		install(CODE "
323		   include(BundleUtilities)
324		   set(BU_CHMOD_BUNDLE_ITEMS ON)
325		   file(GLOB_RECURSE PLUGINS \"${BUNDLE_PATH}/Contents/PlugIns/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
326		   fixup_bundle(\"${BUNDLE_PATH}\"   \"${PLUGINS}\"   \"\")
327		   " COMPONENT ${BINARY_NAME}-qt)
328	else()
329		set(DEPLOY_OPTIONS -p platforms/libqcocoa.dylib,audio/libqtaudio_coreaudio.dylib,mediaservice/libqavfcamera.dylib)
330		if(NOT CMAKE_INSTALL_NAME_TOOL EQUAL "install_name_tool")
331			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -I "${CMAKE_INSTALL_NAME_TOOL}")
332		endif()
333		if(DEFINED CMAKE_OTOOL AND NOT CMAKE_OTOOL EQUAL "otool")
334			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -O "${CMAKE_OTOOL}")
335		endif()
336		if(DEFINED CROSS_ROOT)
337			set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}")
338		endif()
339		install(CODE "execute_process(COMMAND \"${CMAKE_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/Applications/${PROJECT_NAME}.app\")")
340	endif()
341elseif(WIN32)
342	if(CMAKE_MAJOR_VERSION EQUAL 3 AND CMAKE_MINOR_VERSION EQUAL 8)
343		# Work around CMake issue #16907
344		set_target_properties(${BINARY_NAME}-qt PROPERTIES AUTORCC ON SKIP_AUTORCC ON)
345	endif()
346	if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
347		find_program(BASH bash)
348		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)
349	endif()
350	if(DISTBUILD)
351		file(WRITE "portable.ini" "")
352		install(FILES "portable.ini" DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${BINARY_NAME}-qt)
353	endif()
354endif()
355
356if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
357	if(NOT APPLE)
358		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")
359		add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" -S "$<TARGET_FILE:${BINARY_NAME}-qt>")
360		install(FILES "$<TARGET_FILE:${BINARY_NAME}-qt>.dSYM" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg)
361	endif()
362endif()