all repos — mgba @ 369bcc95117fb4ae2aad40fc78fa91d71637ccd3

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