all repos — mgba @ 04f3fdf21ea5bc446c461fc427eec2f0eb46417f

mGBA Game Boy Advance Emulator

src/platform/qt/CMakeLists.txt (view raw)

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