all repos — mgba @ 2390b9c9a0a9aab04d4e1052b72c5b7613253f83

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