all repos — mgba @ 40703d9734792e21096c120ddab2613465f71e7a

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	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	ColorPicker.cpp
 78	CoreManager.cpp
 79	CoreController.cpp
 80	Display.cpp
 81	DisplayGL.cpp
 82	DisplayQt.cpp
 83	GBAApp.cpp
 84	GBAKeyEditor.cpp
 85	GIFView.cpp
 86	GamepadAxisEvent.cpp
 87	GamepadButtonEvent.cpp
 88	GamepadHatEvent.cpp
 89	IOViewer.cpp
 90	InputController.cpp
 91	InputProfile.cpp
 92	KeyEditor.cpp
 93	LoadSaveState.cpp
 94	LogController.cpp
 95	LogView.cpp
 96	MapView.cpp
 97	MemoryModel.cpp
 98	MemorySearch.cpp
 99	MemoryView.cpp
100	MessagePainter.cpp
101	MultiplayerController.cpp
102	ObjView.cpp
103	OverrideView.cpp
104	PaletteView.cpp
105	PrinterView.cpp
106	RegisterView.cpp
107	ROMInfo.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	CheatsView.ui
127	DebuggerConsole.ui
128	GIFView.ui
129	IOViewer.ui
130	LoadSaveState.ui
131	LogView.ui
132	MapView.ui
133	MemorySearch.ui
134	MemoryView.ui
135	ObjView.ui
136	OverrideView.ui
137	PaletteView.ui
138	PrinterView.ui
139	ROMInfo.ui
140	SensorView.ui
141	SettingsView.ui
142	ShaderSelector.ui
143	ShortcutView.ui
144	TileView.ui
145	VideoView.ui)
146
147set(GBA_SRC
148	GBAOverride.cpp)
149
150set(GB_SRC
151	GBOverride.cpp)
152
153set(QT_LIBRARIES)
154set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5widgets5,libqt5opengl5")
155
156set(AUDIO_SRC)
157if(BUILD_SDL)
158	list(APPEND AUDIO_SRC AudioProcessorSDL.cpp)
159endif()
160
161if(M_CORE_GBA)
162	list(APPEND PLATFORM_SRC ${GBA_SRC})
163endif()
164
165if(M_CORE_GB)
166	list(APPEND PLATFORM_SRC ${GB_SRC})
167endif()
168
169set(QT_DEFINES)
170if(Qt5Multimedia_FOUND)
171	list(APPEND AUDIO_SRC
172		AudioProcessorQt.cpp
173		AudioDevice.cpp)
174	list(APPEND SOURCE_FILES
175		VideoDumper.cpp)
176	if (WIN32 AND QT_STATIC)
177		list(APPEND QT_LIBRARIES Qt5::QWindowsAudioPlugin Qt5::DSServicePlugin
178                                 strmiids mfuuid mfplat mf ksguid dxva2 evr d3d9)
179	endif()
180	list(APPEND QT_LIBRARIES Qt5::Multimedia)
181	list(APPEND QT_DEFINES BUILD_QT_MULTIMEDIA)
182	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libqt5multimedia5")
183endif()
184
185if(NOT AUDIO_SRC)
186	message(WARNING "No supported audio modules found")
187	set(BUILD_QT OFF PARENT_SCOPE)
188	return()
189endif()
190
191if(USE_DEBUGGERS)
192	list(APPEND SOURCE_FILES
193		DebuggerController.cpp
194		DebuggerConsole.cpp
195		DebuggerConsoleController.cpp)
196endif()
197
198if(USE_GDB_STUB)
199	list(APPEND SOURCE_FILES GDBController.cpp GDBWindow.cpp)
200endif()
201
202if(USE_SQLITE3)
203	list(APPEND SOURCE_FILES
204		ArchiveInspector.cpp
205		library/LibraryController.cpp
206		library/LibraryGrid.cpp
207		library/LibraryTree.cpp)
208endif()
209
210qt5_add_resources(RESOURCES resources.qrc)
211if(APPLE)
212	set(MACOSX_BUNDLE_ICON_FILE mgba.icns)
213	set(MACOSX_BUNDLE_BUNDLE_VERSION ${LIB_VERSION_STRING})
214	set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
215	set(MACOSX_BUNDLE_GUI_IDENTIFIER com.endrift.${BINARY_NAME}-qt)
216	set_source_files_properties(${CMAKE_SOURCE_DIR}/res/mgba.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
217endif()
218if(WIN32)
219	configure_file(${CMAKE_SOURCE_DIR}/res/mgba.rc.in ${CMAKE_BINARY_DIR}/res/mgba.rc)
220	list(APPEND RESOURCES ${CMAKE_BINARY_DIR}/res/mgba.rc)
221	set_source_files_properties(${CMAKE_BINARY_DIR}/res/mgba.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_SOURCE_DIR}/res/mgba.ico)
222endif()
223if(NOT DEFINED DATADIR)
224	if(APPLE)
225		set(DATADIR Applications/${PROJECT_NAME}.app/Contents/Resources)
226	elseif(WIN32 AND NOT WIN32_UNIX_PATHS)
227		set(DATADIR ".")
228	else()
229		set(DATADIR ${CMAKE_INSTALL_DATADIR}/${BINARY_NAME})
230	endif()
231endif()
232if(BUILD_GL OR BUILD_GLES2)
233	install(DIRECTORY ${CMAKE_SOURCE_DIR}/res/shaders DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
234endif()
235install(FILES ${CMAKE_SOURCE_DIR}/res/nointro.dat DESTINATION ${DATADIR} COMPONENT ${BINARY_NAME}-qt)
236if(NOT WIN32 AND NOT APPLE)
237	list(APPEND QT_DEFINES DATADIR="${CMAKE_INSTALL_PREFIX}/${DATADIR}")
238endif()
239
240find_package(Qt5LinguistTools)
241if(Qt5LinguistTools_FOUND)
242	set(TRANSLATION_FILES)
243	set(TRANSLATION_QRC "${CMAKE_CURRENT_BINARY_DIR}/ts.qrc")
244	file(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/ts/${BINARY_NAME}-*.ts")
245	if(UPDATE_TRANSLATIONS)
246		qt5_create_translation(TRANSLATION_FILES ${SOURCE_FILES} ${UI_FILES} ${TS_FILES} OPTIONS -locations absolute -no-obsolete)
247	else()
248		qt5_add_translation(TRANSLATION_FILES ${TS_FILES})
249	endif()
250	set(QT_QM_FILES)
251	if(QT_STATIC)
252		get_target_property(QT_CORE_LOCATION Qt5::Core LOCATION)
253		get_filename_component(QT_CORE_LOCATION ${QT_CORE_LOCATION} DIRECTORY)
254		get_filename_component(QT_QM_LOCATION "${QT_CORE_LOCATION}/../translations" ABSOLUTE)
255		foreach(TS ${TS_FILES})
256			get_filename_component(TS ${TS} NAME)
257			string(REGEX REPLACE "${BINARY_NAME}-(.*).ts$" "qtbase_\\1.qm" QT_QM "${TS}")
258			list(APPEND QT_QM_FILES "${QT_QM_LOCATION}/${QT_QM}")
259		endforeach()
260		list(APPEND TRANSLATION_FILES ${QT_QM_FILES})
261	endif()
262	add_custom_command(OUTPUT ${TRANSLATION_QRC}
263		               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"
264		               DEPENDS ${TRANSLATION_FILES})
265	qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC})
266	list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
267endif()
268
269qt5_wrap_ui(UI_SRC ${UI_FILES})
270
271add_executable(${BINARY_NAME}-qt WIN32 MACOSX_BUNDLE main.cpp ${CMAKE_SOURCE_DIR}/res/mgba.icns ${SOURCE_FILES} ${PLATFORM_SRC} ${UI_SRC} ${AUDIO_SRC} ${RESOURCES})
272set_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}")
273
274list(APPEND QT_LIBRARIES Qt5::Widgets)
275if(BUILD_GL OR BUILD_GLES2)
276	list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
277endif()
278if(WIN32 AND QT_STATIC)
279	list(APPEND QT_LIBRARIES qwindows dwmapi imm32 uxtheme Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport)
280	set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "qtpcre2;version;winmm;ws2_32")
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		get_target_property(QTAVFSERVICE Qt5::AVFServicePlugin LOCATION)
305		set(BUNDLE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.app)
306		target_sources(${BINARY_NAME}-qt PRIVATE "${PLUGINS}")
307		set_source_files_properties("${QTCOCOA}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
308		set_source_files_properties("${COREAUDIO}" PROPERTIES MACOSX_PACKAGE_LOCATION Contents/PlugIns)
309		set_source_files_properties("${QTAVFSERVICE}" 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,mediaservice/libqavfcamera.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()