all repos — mgba @ 60577e83948647d36a2e6a8b4ec8f8556df3f72f

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