all repos — mgba @ 342ace070a4360d77df9a96ec20b7d8a4dabd2cc

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