all repos — mgba @ 8b88e7ae6a4434b37a4812accea648cdbb62331d

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