all repos — mgba @ 53f98db24635b672300148bfc643b624e6998522

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