all repos — mgba @ 1f156921732db400cfbb4a0ff3f8efc0faf5dd1e

mGBA Game Boy Advance Emulator

CMakeLists.txt (view raw)

   1cmake_minimum_required(VERSION 3.1)
   2list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/src/platform/cmake/")
   3
   4if(POLICY CMP0025)
   5	cmake_policy(SET CMP0025 NEW)
   6endif()
   7if(POLICY CMP0072)
   8	cmake_policy(SET CMP0072 NEW)
   9endif()
  10project(medusa)
  11set(BINARY_NAME medusa-emu CACHE INTERNAL "Name of output binaries")
  12if(NOT MSVC)
  13	set(GCC_STD "c99")
  14	if(SWITCH)
  15		set(GCC_STD "gnu11")
  16	elseif(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_COMPILER_VERSION VERSION_LESS "4.3")
  17		set(GCC_STD "gnu99")
  18	endif()
  19	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-missing-field-initializers -std=${GCC_STD}")
  20else()
  21	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS /wd4003 /wd4244 /wd4146")
  22endif()
  23
  24if(NOT DEFINED LIBMGBA_ONLY)
  25	get_directory_property(LIBMGBA_ONLY EXCLUDE_FROM_ALL)
  26endif()
  27
  28if(NOT LIBMGBA_ONLY)
  29	set(USE_DEBUGGERS ON CACHE BOOL "Whether or not to enable the debugging infrastructure")
  30	if (NOT WIN32)
  31		set(USE_EDITLINE ON CACHE BOOL "Whether or not to enable the CLI-mode debugger")
  32	endif()
  33	set(USE_GDB_STUB ON CACHE BOOL "Whether or not to enable the GDB stub ARM debugger")
  34	set(USE_FFMPEG ON CACHE BOOL "Whether or not to enable FFmpeg support")
  35	set(USE_ZLIB ON CACHE BOOL "Whether or not to enable zlib support")
  36	set(USE_MINIZIP ON CACHE BOOL "Whether or not to enable external minizip support")
  37	set(USE_PNG ON CACHE BOOL "Whether or not to enable PNG support")
  38	set(USE_LIBZIP ON CACHE BOOL "Whether or not to enable LIBZIP support")
  39	set(USE_MAGICK ON CACHE BOOL "Whether or not to enable ImageMagick support")
  40	set(USE_SQLITE3 ON CACHE BOOL "Whether or not to enable SQLite3 support")
  41	set(USE_ELF ON CACHE BOOL "Whether or not to enable ELF support")
  42	set(M_CORE_GBA ON CACHE BOOL "Build Game Boy Advance core")
  43	set(M_CORE_GB ON CACHE BOOL "Build Game Boy core")
  44	set(M_CORE_DS ON CACHE BOOL "Build DS core")
  45	set(USE_LZMA ON CACHE BOOL "Whether or not to enable 7-Zip support")
  46	set(USE_DISCORD_RPC ON CACHE BOOL "Whether or not to enable Discord RPC support")
  47	set(ENABLE_SCRIPTING ON CACHE BOOL "Whether or not to enable scripting support")
  48	set(BUILD_QT ON CACHE BOOL "Build Qt frontend")
  49	set(BUILD_SDL ON CACHE BOOL "Build SDL frontend")
  50	set(BUILD_LIBRETRO OFF CACHE BOOL "Build libretro core")
  51	if(APPLE)
  52		set(BUILD_OPENEMU OFF CACHE BOOL "Build OpenEmu core")
  53	endif()
  54	set(BUILD_PERF OFF CACHE BOOL "Build performance profiling tool")
  55	set(BUILD_TEST OFF CACHE BOOL "Build testing harness")
  56	set(BUILD_SUITE OFF CACHE BOOL "Build test suite")
  57	set(BUILD_EXAMPLE OFF CACHE BOOL "Build example frontends")
  58	set(BUILD_PYTHON OFF CACHE BOOL "Build Python bindings")
  59	set(BUILD_STATIC OFF CACHE BOOL "Build a static library")
  60	set(BUILD_SHARED ON CACHE BOOL "Build a shared library")
  61	set(SKIP_LIBRARY OFF CACHE BOOL "Skip building the library (useful for only building libretro or OpenEmu cores)")
  62	set(BUILD_GL ON CACHE BOOL "Build with OpenGL")
  63	set(BUILD_GLES2 ON CACHE BOOL "Build with OpenGL|ES 2")
  64	set(BUILD_GLES3 OFF CACHE BOOL "Build with OpenGL|ES 3")
  65	set(USE_EPOXY ON CACHE STRING "Build with libepoxy")
  66	set(DISABLE_DEPS OFF CACHE BOOL "Build without dependencies")
  67	set(DISTBUILD OFF CACHE BOOL "Build distribution packages")
  68	if(WIN32)
  69		set(WIN32_UNIX_PATHS OFF CACHE BOOL "Use Unix-like paths")
  70		mark_as_advanced(WIN32_UNIX_PATHS)
  71	endif()
  72else()
  73	set(DISABLE_FRONTENDS ON)
  74	set(DISABLE_DEPS ON)
  75	set(BUILD_STATIC ON)
  76	set(BUILD_SHARED OFF)
  77	if(NOT DEFINED M_CORE_GBA)
  78		set(M_CORE_GBA ON)
  79	endif()
  80	if(NOT DEFINED M_CORE_GB)
  81		set(M_CORE_GB ON)
  82	endif()
  83endif()
  84
  85file(GLOB DS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/ds/*.c)
  86file(GLOB DS_RENDERER_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/ds/renderers/*.c ${CMAKE_CURRENT_SOURCE_DIR}/src/ds/gx/*.c)
  87file(GLOB THIRD_PARTY_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/inih/*.c)
  88set(CORE_VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-mem.c ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-fifo.c)
  89set(VFS_SRC)
  90source_group("DS board" FILES ${DS_SRC})
  91include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/include)
  92
  93if(NOT CMAKE_BUILD_TYPE)
  94	set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type (e.g. Release, RelWithDebInfo, or Debug)" FORCE)
  95endif()
  96
  97if(UNIX OR WIN32_UNIX_PATHS)
  98	include(GNUInstallDirs)
  99	string(REPLACE "${PROJECT_NAME}" "${BINARY_NAME}" CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DOCDIR}")
 100else()
 101	set(CMAKE_INSTALL_LIBDIR ".")
 102	set(CMAKE_INSTALL_BINDIR ".")
 103	set(CMAKE_INSTALL_DATADIR ".")
 104	set(CMAKE_INSTALL_DOCDIR ".")
 105	set(CMAKE_INSTALL_INCLUDEDIR "include")
 106endif()
 107
 108set(LIBDIR "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "Installed library directory")
 109mark_as_advanced(LIBDIR)
 110
 111if (BUILD_LIBRETRO)
 112	set(LIBRETRO_LIBDIR "${LIBDIR}" CACHE PATH "Installed library directory (Libretro)")
 113	mark_as_advanced(LIBRETRO_LIBDIR)
 114endif()
 115
 116if (BUILD_OPENEMU)
 117	set(OE_LIBDIR "${LIBDIR}" CACHE PATH "Installed library directory (OpenEmu)")
 118	mark_as_advanced(OE_LIBDIR)
 119endif()
 120
 121if (DISTBUILD)
 122       set(EXTRA_LICENSES "" CACHE FILEPATH "Extra licenses to include in distribution packaages")
 123       mark_as_advanced(EXTRA_LICENSES)
 124endif()
 125mark_as_advanced(DISTBUILD)
 126
 127set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIBDIR}")
 128
 129if (NOT DEFINED MANDIR)
 130	set(MANDIR ${CMAKE_INSTALL_MANDIR})
 131endif()
 132
 133include(FindFeature)
 134
 135# Version information
 136add_custom_target(version-info ALL
 137	COMMAND ${CMAKE_COMMAND}
 138	-DBINARY_NAME=${BINARY_NAME}
 139	-DCONFIG_FILE=${CMAKE_CURRENT_SOURCE_DIR}/src/core/version.c.in
 140	-DOUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/version.c
 141	-P ${CMAKE_CURRENT_SOURCE_DIR}/version.cmake
 142	WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
 143
 144include(${CMAKE_CURRENT_SOURCE_DIR}/version.cmake)
 145configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/core/version.c.in ${CMAKE_CURRENT_BINARY_DIR}/version.c)
 146
 147source_group("Generated sources" FILES ${CMAKE_CURRENT_BINARY_DIR}/version.c)
 148
 149# Advanced settings
 150if(NOT (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_COMPILER_VERSION VERSION_LESS "4.5"))
 151	set(DEFAULT_LTO ON)
 152else()
 153	set(DEFAULT_LTO OFF)
 154endif()
 155
 156set(BUILD_LTO ${DEFAULT_LTO} CACHE BOOL "Build with link-time optimization")
 157set(BUILD_PGO OFF CACHE BOOL "Build with profiling-guided optimization")
 158set(PGO_STAGE_2 CACHE BOOL "Rebuild for profiling-guided optimization after profiles have been generated")
 159set(PGO_DIR "/tmp/gba-pgo/" CACHE PATH "Profiling-guided optimization profiles path")
 160mark_as_advanced(BUILD_LTO BUILD_PGO PGO_STAGE_2 PGO_DIR)
 161set(PGO_PRE_FLAGS "-fprofile-generate=${PGO_DIR} -fprofile-arcs")
 162set(PGO_POST_FLAGS "-fprofile-use=${PGO_DIR} -fbranch-probabilities")
 163
 164if(BUILD_PGO AND NOT PGO_STAGE_2)
 165	set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${PGO_PRE_FLAGS}")
 166	set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PGO_PRE_FLAGS}")
 167	set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${PGO_PRE_FLAGS}")
 168elseif(BUILD_PGO AND PGO_STAGE_2)
 169	set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${PGO_POST_FLAGS}")
 170	set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PGO_POST_FLAGS}")
 171	set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${PGO_POST_FLAGS}")
 172endif()
 173
 174# Platform support
 175if(WIN32)
 176	set(WIN32_VERSION "${LIB_VERSION_MAJOR},${LIB_VERSION_MINOR},${LIB_VERSION_PATCH}")
 177	add_definitions(-D_WIN32_WINNT=0x0600)
 178	if(MSVC)
 179		add_definitions(-DNOMINMAX -DWIN32_LEAN_AND_MEAN)
 180		set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
 181		add_definitions(-D_UNICODE -DUNICODE)
 182	else()
 183		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -municode")
 184		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -municode")
 185	endif()
 186	list(APPEND OS_LIB ws2_32 shlwapi)
 187	list(APPEND CORE_VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/windows/vfs-w32.c)
 188	file(GLOB OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/windows/*.c)
 189	source_group("Windows-specific code" FILES ${OS_SRC})
 190elseif(UNIX)
 191	set(USE_PTHREADS ON)
 192
 193	if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
 194		add_definitions(-D_GNU_SOURCE)
 195	endif()
 196
 197	list(APPEND CORE_VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-dirent.c)
 198	file(GLOB OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/posix/*.c)
 199	source_group("POSIX-specific code" FILES ${OS_SRC})
 200endif()
 201
 202if(APPLE)
 203	add_definitions(-D_DARWIN_C_SOURCE)
 204	if(CMAKE_SYSTEM_VERSION VERSION_GREATER "10.5.8")
 205		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=10.6")
 206	endif()
 207endif()
 208
 209if(NOT HAIKU AND NOT MSVC AND NOT PSP2)
 210	set(M_LIBRARY m)
 211endif()
 212list(APPEND OS_LIB ${M_LIBRARY})
 213
 214if(APPLE OR CMAKE_C_COMPILER_ID STREQUAL "GNU" AND BUILD_LTO)
 215	set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto")
 216	set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto")
 217endif()
 218
 219if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
 220	find_program(OBJCOPY ${cross_prefix}objcopy)
 221	find_program(STRIP ${cross_prefix}strip)
 222
 223	set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -gdwarf")
 224	set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -gdwarf")
 225endif()
 226
 227if(BUILD_BBB OR BUILD_RASPI OR BUILD_PANDORA)
 228	if(NOT BUILD_EGL)
 229		add_definitions(-DCOLOR_16_BIT -DCOLOR_5_6_5)
 230	endif()
 231endif()
 232
 233if(BUILD_RASPI)
 234	set(BUILD_GL OFF CACHE BOOL "OpenGL not supported" FORCE)
 235endif()
 236
 237if(BUILD_PANDORA)
 238	add_definitions(-DBUILD_PANDORA)
 239endif()
 240
 241if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm.*")
 242	enable_language(ASM)
 243endif()
 244
 245if(PSP2 OR WII)
 246	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
 247endif()
 248
 249if(DEFINED 3DS OR DEFINED PSP2 OR DEFINED WII OR DEFINED SWITCH)
 250	set(IS_EMBEDDED ON)
 251	set(USE_DEBUGGERS OFF)
 252	set(USE_SQLITE3 OFF)
 253	set(USE_DISCORD_RPC OFF)
 254endif()
 255
 256if(DEFINED 3DS)
 257	add_definitions(-DFIXED_ROM_BUFFER)
 258endif()
 259
 260if(DEFINED SWITCH)
 261	set(BUILD_GLES3 ON CACHE BOOL "Build with OpenGL|ES 3" FORCE)
 262endif()
 263
 264if(NOT M_CORE_GBA)
 265	set(USE_GDB_STUB OFF)
 266endif()
 267
 268if(NOT USE_DEBUGGERS)
 269	set(USE_EDITLINE OFF)
 270	set(USE_GDB_STUB OFF)
 271endif()
 272
 273if(WII)
 274	add_definitions(-U__STRICT_ANSI__)
 275endif()
 276
 277if(3DS OR WII)
 278	add_definitions(-D_GNU_SOURCE)
 279endif()
 280
 281include(CheckCCompilerFlag)
 282include(CheckFunctionExists)
 283include(CheckIncludeFiles)
 284check_function_exists(strdup HAVE_STRDUP)
 285check_function_exists(strndup HAVE_STRNDUP)
 286if(NOT DEFINED PSP2)
 287	check_function_exists(localtime_r HAVE_LOCALTIME_R)
 288endif()
 289check_include_files("xlocale.h" HAVE_XLOCALE)
 290if(NOT CMAKE_SYSTEM_NAME STREQUAL "Generic")
 291	check_function_exists(snprintf_l HAVE_SNPRINTF_L)
 292	if(ANDROID AND ANDROID_NDK_MAJOR GREATER 13)
 293		set(HAVE_STRTOF_L ON)
 294	elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
 295		# The strtof_l on Linux not actually exposed nor actually strtof_l
 296		set(HAVE_STRTOF_L OFF)
 297	else()
 298		check_function_exists(strtof_l HAVE_STRTOF_L)
 299	endif()
 300	check_function_exists(newlocale HAVE_NEWLOCALE)
 301	check_function_exists(freelocale HAVE_FREELOCALE)
 302	check_function_exists(uselocale HAVE_USELOCALE)
 303	check_function_exists(setlocale HAVE_SETLOCALE)
 304else()
 305	if(DEFINED 3DS OR DEFINED WII OR DEFINED SWITCH)
 306		set(CMAKE_REQUIRED_FLAGS -Wl,--require-defined,snprintf_l)
 307		check_function_exists(snprintf_l HAVE_SNPRINTF_L)
 308		set(CMAKE_REQUIRED_FLAGS -Wl,--require-defined,strtof_l)
 309		check_function_exists(strtof_l HAVE_STRTOF_L)
 310		set(CMAKE_REQUIRED_FLAGS -Wl,--require-defined,newlocale)
 311		check_function_exists(newlocale HAVE_NEWLOCALE)
 312		set(CMAKE_REQUIRED_FLAGS -Wl,--require-defined,freelocale)
 313		check_function_exists(freelocale HAVE_FREELOCALE)
 314		set(CMAKE_REQUIRED_FLAGS -Wl,--require-defined,uselocale)
 315		check_function_exists(uselocale HAVE_USELOCALE)
 316		set(CMAKE_REQUIRED_FLAGS -Wl,--require-defined,setlocale)
 317		check_function_exists(setlocale HAVE_SETLOCALE)
 318		unset(CMAKE_REQUIRED_FLAGS)
 319	endif()
 320	if(NOT IS_EMBEDDED)
 321		set(DISABLE_DEPS ON CACHE BOOL "This platform cannot build with dependencies" FORCE)
 322	endif()
 323	set(BUILD_STATIC ON CACHE BOOL "" FORCE)
 324	set(BUILD_SHARED OFF CACHE BOOL "" FORCE)
 325	set(DISABLE_FRONTENDS ON)
 326	set(MINIMAL_CORE ON)
 327	set(ENABLE_EXTRA ON)
 328endif()
 329
 330check_function_exists(chmod HAVE_CHMOD)
 331check_function_exists(umask HAVE_UMASK)
 332
 333if(USE_PTHREADS)
 334	check_include_files("pthread.h" HAVE_PTHREAD_H)
 335	if(HAVE_PTHREAD_H)
 336		check_c_compiler_flag(-pthread HAVE_PTHREAD)
 337		if(HAVE_PTHREAD AND NOT APPLE AND NOT HAIKU)
 338			set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread")
 339			set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
 340		endif()
 341
 342		check_function_exists(pthread_create HAVE_PTHREAD_CREATE)
 343		if(HAVE_PTHREAD_CREATE)
 344			add_definitions(-DUSE_PTHREADS)
 345
 346			check_include_files("pthread_np.h" HAVE_PTHREAD_NP_H)
 347
 348			check_function_exists(pthread_setname_np HAVE_PTHREAD_SETNAME_NP)
 349			check_function_exists(pthread_set_name_np HAVE_PTHREAD_SET_NAME_NP)
 350		endif()
 351	endif()
 352endif()
 353
 354set(FUNCTION_DEFINES)
 355
 356if(HAVE_STRDUP)
 357	list(APPEND FUNCTION_DEFINES HAVE_STRDUP)
 358endif()
 359
 360if(HAVE_STRNDUP)
 361	list(APPEND FUNCTION_DEFINES HAVE_STRNDUP)
 362endif()
 363
 364if(HAVE_LOCALTIME_R)
 365	list(APPEND FUNCTION_DEFINES HAVE_LOCALTIME_R)
 366endif()
 367
 368if(HAVE_NEWLOCALE AND HAVE_FREELOCALE AND HAVE_USELOCALE OR APPLE)
 369	list(APPEND FUNCTION_DEFINES HAVE_LOCALE)
 370	if (HAVE_SNPRINTF_L)
 371		list(APPEND FUNCTION_DEFINES HAVE_SNPRINTF_L)
 372	endif()
 373endif()
 374
 375if(HAVE_SETLOCALE)
 376	list(APPEND FUNCTION_DEFINES HAVE_SETLOCALE)
 377endif()
 378
 379if (HAVE_STRTOF_L)
 380	list(APPEND FUNCTION_DEFINES HAVE_STRTOF_L)
 381endif()
 382
 383if(HAVE_XLOCALE)
 384	list(APPEND FUNCTION_DEFINES HAVE_XLOCALE)
 385endif()
 386
 387if(HAVE_CHMOD)
 388	list(APPEND FUNCTION_DEFINES HAVE_CHMOD)
 389endif()
 390
 391if(HAVE_UMASK)
 392	list(APPEND FUNCTION_DEFINES HAVE_UMASK)
 393endif()
 394
 395if(HAVE_PTHREAD_NP_H)
 396	list(APPEND FUNCTION_DEFINES HAVE_PTHREAD_NP_H)
 397endif()
 398
 399if(HAVE_PTHREAD_SETNAME_NP)
 400	list(APPEND FUNCTION_DEFINES HAVE_PTHREAD_SETNAME_NP)
 401endif()
 402
 403if(HAVE_PTHREAD_SET_NAME_NP)
 404	list(APPEND FUNCTION_DEFINES HAVE_PTHREAD_SET_NAME_NP)
 405endif()
 406
 407# Feature dependencies
 408set(FEATURE_DEFINES)
 409set(FEATURE_FLAGS)
 410set(FEATURES)
 411set(ENABLES)
 412if(CMAKE_SYSTEM_NAME MATCHES ".*BSD|DragonFly")
 413	set(LIBEDIT_LIBRARIES -ledit)
 414	if (CMAKE_SYSTEM_NAME STREQUAL OpenBSD)
 415		list(APPEND LIBEDIT_LIBRARIES -ltermcap)
 416	endif()
 417else()
 418	find_feature(USE_EDITLINE "libedit")
 419endif()
 420if(BUILD_GL)
 421	find_package(OpenGL QUIET)
 422	if(NOT OPENGL_FOUND)
 423		set(BUILD_GL OFF CACHE BOOL "OpenGL not found" FORCE)
 424	endif()
 425endif()
 426if(NOT BUILD_GL)
 427	set(OPENGL_LIBRARY "" CACHE PATH "" FORCE)
 428endif()
 429if(BUILD_GLES2 AND NOT BUILD_RASPI AND NOT CMAKE_SYSTEM_NAME MATCHES "^(Windows|Darwin|Linux|.*BSD|DragonFly|Haiku)$")
 430	find_path(OPENGLES2_INCLUDE_DIR NAMES GLES2/gl2.h)
 431	find_library(OPENGLES2_LIBRARY NAMES GLESv2 GLESv2_CM)
 432	if(NOT OPENGLES2_INCLUDE_DIR OR NOT OPENGLES2_LIBRARY)
 433		set(BUILD_GLES2 OFF CACHE BOOL "OpenGL|ES 2 not found" FORCE)
 434	endif()
 435endif()
 436if(NOT BUILD_GLES2)
 437	set(OPENGLES2_LIBRARY "" CACHE PATH "" FORCE)
 438endif()
 439if(BUILD_GL)
 440	list(APPEND OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/opengl/gl.c)
 441	list(APPEND DEPENDENCY_LIB ${OPENGL_LIBRARY})
 442	include_directories(${OPENGL_INCLUDE_DIR})
 443endif()
 444if(BUILD_GLES2)
 445	list(APPEND OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/opengl/gles2.c)
 446	list(APPEND DEPENDENCY_LIB ${OPENGLES2_LIBRARY})
 447	include_directories(${OPENGLES2_INCLUDE_DIR})
 448endif()
 449if(BUILD_GLES3)
 450	find_path(OPENGLES3_INCLUDE_DIR NAMES GLES3/gl3.h)
 451	find_library(OPENGLES3_LIBRARY NAMES GLESv3 GLESv2)
 452	if(NOT OPENGLES3_INCLUDE_DIR OR NOT OPENGLES3_LIBRARY)
 453		set(BUILD_GLES3 OFF CACHE BOOL "OpenGL|ES 3 not found" FORCE)
 454	endif()
 455endif()
 456
 457if(DISABLE_DEPS)
 458	set(USE_GDB_STUB OFF)
 459	set(USE_DISCORD_RPC OFF)
 460	set(USE_SQLITE3 OFF)
 461	set(USE_PNG OFF)
 462	set(USE_ZLIB OFF)
 463endif()
 464
 465set(WANT_ZLIB ${USE_ZLIB})
 466set(WANT_PNG ${USE_PNG})
 467set(WANT_SQLITE3 ${USE_SQLITE3})
 468set(USE_CMOCKA ${BUILD_SUITE})
 469
 470find_feature(USE_FFMPEG "libavcodec;libavformat;libavutil;libswscale")
 471find_feature(USE_ZLIB "ZLIB")
 472find_feature(USE_MINIZIP "minizip")
 473find_feature(USE_PNG "PNG")
 474find_feature(USE_LIBZIP "libzip")
 475find_feature(USE_MAGICK "MagickWand")
 476find_feature(USE_EPOXY "epoxy")
 477find_feature(USE_CMOCKA "cmocka")
 478find_feature(USE_SQLITE3 "sqlite3")
 479find_feature(USE_ELF "libelf")
 480find_feature(ENABLE_PYTHON "PythonLibs")
 481
 482if(USE_FFMPEG)
 483	set(USE_LIBAVRESAMPLE ON)
 484	set(USE_LIBSWRESAMPLE ON)
 485	find_feature(USE_LIBAVRESAMPLE "libavresample")
 486	find_feature(USE_LIBSWRESAMPLE "libswresample")
 487endif()
 488
 489# Features
 490add_subdirectory(src/debugger)
 491add_subdirectory(src/feature)
 492
 493set(FEATURE_SRC)
 494set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6")
 495
 496if(USE_EDITLINE)
 497	list(APPEND FEATURES EDITLINE)
 498	list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/debugger/cli-debugger.c)
 499	list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/debugger/parser.c)
 500	if(M_CORE_GBA)
 501		list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/arm/debugger/cli-debugger.c)
 502		list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/gba/debugger/cli.c)
 503	endif()
 504	if(M_CORE_GB)
 505		list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/lr35902/debugger/cli-debugger.c)
 506	endif()
 507	if(M_CORE_DS)
 508		list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/arm/debugger/cli-debugger.c)
 509		list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/ds/extra/cli.c)
 510	endif()
 511	include_directories(AFTER ${LIBEDIT_INCLUDE_DIRS})
 512	link_directories(${LIBEDIT_LIBRARY_DIRS})
 513	set(DEBUGGER_LIB ${LIBEDIT_LIBRARIES})
 514	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libedit2")
 515	list(APPEND FEATURE_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/feature/editline/cli-el-backend.c")
 516else()
 517	set(DEBUGGER_LIB "")
 518endif()
 519
 520if(USE_GDB_STUB)
 521	list(APPEND FEATURES GDB_STUB)
 522	list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/debugger/gdb-stub.c)
 523endif()
 524source_group("Debugger" FILES ${DEBUGGER_SRC})
 525
 526if(USE_FFMPEG)
 527	list(APPEND FEATURES FFMPEG)
 528	if(USE_LIBSWRESAMPLE)
 529		list(APPEND FEATURES LIBSWRESAMPLE)
 530	else()
 531		list(APPEND FEATURES LIBAVRESAMPLE)
 532		list(APPEND FEATURES LIBAV)
 533	endif()
 534	include_directories(AFTER ${LIBAVCODEC_INCLUDE_DIRS} ${LIBAVFORMAT_INCLUDE_DIRS} ${LIBAVRESAMPLE_INCLUDE_DIRS} ${LIBAVUTIL_INCLUDE_DIRS} ${LIBSWRESAMPLE_INCLUDE_DIRS} ${LIBSWSCALE_INCLUDE_DIRS})
 535	link_directories(${LIBAVCODEC_LIBRARY_DIRS} ${LIBAVFORMAT_LIBRARY_DIRS} ${LIBAVRESAMPLE_LIBRARY_DIRS} ${LIBAVUTIL_LIBRARY_DIRS} ${LIBSWRESAMPLE_LIBRARY_DIRS} ${LIBSWSCALE_LIBRARY_DIRS})
 536	list(APPEND FEATURE_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/feature/ffmpeg/ffmpeg-encoder.c")
 537	string(REGEX MATCH "^[0-9]+" LIBAVCODEC_VERSION_MAJOR ${libavcodec_VERSION})
 538	string(REGEX MATCH "^[0-9]+" LIBAVFORMAT_VERSION_MAJOR ${libavformat_VERSION})
 539	string(REGEX MATCH "^[0-9]+" LIBAVUTIL_VERSION_MAJOR ${libavutil_VERSION})
 540	string(REGEX MATCH "^[0-9]+" LIBSWSCALE_VERSION_MAJOR ${libswscale_VERSION})
 541	list(APPEND DEPENDENCY_LIB ${LIBAVCODEC_LIBRARIES} ${LIBAVFORMAT_LIBRARIES} ${LIBAVRESAMPLE_LIBRARIES} ${LIBAVUTIL_LIBRARIES} ${LIBSWSCALE_LIBRARIES} ${LIBSWRESAMPLE_LIBRARIES})
 542	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libavcodec${LIBAVCODEC_VERSION_MAJOR}|libavcodec-extra-${LIBAVCODEC_VERSION_MAJOR}|libavcodec-ffmpeg${LIBAVCODEC_VERSION_MAJOR}|libavcodec-ffmpeg-extra${LIBAVCODEC_VERSION_MAJOR}")
 543	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libavformat${LIBAVFORMAT_VERSION_MAJOR}|libavformat-ffmpeg${LIBAVFORMAT_VERSION_MAJOR}")
 544	if(USE_LIBSWRESAMPLE)
 545		string(REGEX MATCH "^[0-9]+" LIBSWRESAMPLE_VERSION_MAJOR ${libswresample_VERSION})
 546		set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libswresample${LIBSWRESAMPLE_VERSION_MAJOR}|libswresample-ffmpeg${LIBSWRESAMPLE_VERSION_MAJOR}")
 547	else()
 548		string(REGEX MATCH "^[0-9]+" LIBAVRESAMPLE_VERSION_MAJOR ${libavresample_VERSION})
 549		set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libavresample${LIBAVRESAMPLE_VERSION_MAJOR}|libavresample-ffmpeg${LIBAVRESAMPLE_VERSION_MAJOR}")
 550	endif()
 551	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libavutil${LIBAVUTIL_VERSION_MAJOR}|libavutil-ffmpeg${LIBAVUTIL_VERSION_MAJOR}")
 552	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libswscale${LIBSWSCALE_VERSION_MAJOR}|libswscale-ffmpeg${LIBSWSCALE_VERSION_MAJOR}")
 553	set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "libavcodec-extra|libavcodec-ffmpeg-extra${LIBAVCODEC_VERSION_MAJOR}")
 554	if(APPLE)
 555		set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -framework VideoDecodeAcceleration -framework CoreVideo")
 556		set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework VideoDecodeAcceleration -framework CoreVideo")
 557	endif()
 558endif()
 559
 560list(APPEND THIRD_PARTY_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/blip_buf/blip_buf.c")
 561
 562if(USE_MAGICK)
 563	list(APPEND FEATURES MAGICK)
 564	include_directories(AFTER ${MAGICKWAND_INCLUDE_DIRS})
 565	link_directories(${MAGICKWAND_LIBRARY_DIRS})
 566	list(APPEND FEATURE_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/feature/imagemagick/imagemagick-gif-encoder.c")
 567	list(APPEND DEPENDENCY_LIB ${MAGICKWAND_LIBRARIES})
 568	string(REGEX MATCH "^[0-9]+\\.[0-9]+" MAGICKWAND_VERSION_PARTIAL ${MagickWand_VERSION})
 569	string(REGEX MATCH "^[0-9]+" MAGICKWAND_VERSION_MAJOR ${MagickWand_VERSION})
 570	if(${MAGICKWAND_VERSION_PARTIAL} STREQUAL "6.7")
 571		set(MAGICKWAND_DEB_VERSION "5")
 572	elseif(${MagickWand_VERSION} STREQUAL "6.9.10")
 573		set(MAGICKWAND_DEB_VERSION "-6.q16-6")
 574	elseif(${MagickWand_VERSION} STREQUAL "6.9.7")
 575		set(MAGICKWAND_DEB_VERSION "-6.q16-3")
 576	else()
 577		set(MAGICKWAND_DEB_VERSION "-6.q16-2")
 578	endif()
 579	list(APPEND FEATURE_DEFINES MAGICKWAND_VERSION_MAJOR=${MAGICKWAND_VERSION_MAJOR})
 580	list(APPEND FEATURE_FLAGS ${MAGICKWAND_CFLAGS_OTHER})
 581
 582	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libmagickwand${MAGICKWAND_DEB_VERSION}")
 583endif()
 584
 585if(WANT_ZLIB AND NOT USE_ZLIB)
 586	set(SKIP_INSTALL_ALL ON)
 587	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/zlib zlib EXCLUDE_FROM_ALL)
 588	set_target_properties(zlibstatic PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/zlib;${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/zlib" POSITION_INDEPENDENT_CODE ON)
 589	set(ZLIB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/zlib ${CMAKE_CURRENT_BINARY_DIR}/zlib)
 590	set(ZLIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/zlib ${CMAKE_CURRENT_BINARY_DIR}/zlib)
 591	set(ZLIB_LIBRARY zlibstatic)
 592	list(APPEND DEPENDENCY_LIB zlibstatic)
 593	set(USE_ZLIB ON)
 594endif()
 595
 596if(USE_ZLIB)
 597	list(APPEND FEATURES ZLIB)
 598	include_directories(AFTER ${ZLIB_INCLUDE_DIRS})
 599	list(APPEND DEPENDENCY_LIB ${ZLIB_LIBRARIES})
 600	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},zlib1g")
 601	set(HAVE_CRC32 ON)
 602	list(APPEND OS_LIB ${ZLIB_LIBRARIES})
 603else()
 604	# zlib pulls in crc32
 605	check_function_exists(crc32 HAVE_CRC32)
 606endif()
 607
 608if(HAVE_CRC32)
 609	list(APPEND FUNCTION_DEFINES HAVE_CRC32)
 610endif()
 611
 612if(WANT_PNG AND USE_ZLIB AND NOT USE_PNG)
 613	set(PNG_STATIC ON CACHE BOOL "" FORCE)
 614	set(PNG_SHARED OFF CACHE BOOL "" FORCE)
 615	set(PNG_TESTS OFF CACHE BOOL "" FORCE)
 616	set(SKIP_INSTALL_ALL ON)
 617	if (SWITCH)
 618		set(PNG_ARM_NEON "off" CACHE STRING "" FORCE)
 619	endif()
 620	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/libpng libpng EXCLUDE_FROM_ALL)
 621	set_target_properties(png_static PROPERTIES INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/libpng;${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/libpng;${ZLIB_INCLUDE_DIRS}" POSITION_INDEPENDENT_CODE ON)
 622	set(PNG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/libpng ${CMAKE_CURRENT_BINARY_DIR}/libpng)
 623	list(APPEND DEPENDENCY_LIB png_static)
 624	set(USE_PNG ON)
 625endif()
 626
 627if(USE_PNG)
 628	list(APPEND FEATURES PNG)
 629	include_directories(AFTER ${PNG_INCLUDE_DIRS})
 630	list(APPEND DEPENDENCY_LIB ${PNG_LIBRARIES} ${ZLIB_LIBRARIES})
 631	if(PNG_VERSION_STRING)
 632		string(REGEX MATCH "^[0-9]+\\.[0-9]+" PNG_VERSION_PARTIAL ${PNG_VERSION_STRING})
 633		if(${PNG_VERSION_PARTIAL} STREQUAL "1.6")
 634			set(PNG_DEB_VERSION "16-16")
 635		else()
 636			set(PNG_DEB_VERSION "12-0")
 637		endif()
 638		set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libpng${PNG_DEB_VERSION}")
 639	endif()
 640endif()
 641
 642if(WANT_SQLITE3 AND NOT USE_SQLITE3)
 643	list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/sqlite3/sqlite3.c)
 644	include_directories(AFTER ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/sqlite3/)
 645	set(USE_SQLITE3 ON)
 646endif()
 647
 648if(USE_LIBZIP)
 649	include_directories(AFTER ${LIBZIP_INCLUDE_DIRS})
 650	link_directories(${LIBZIP_LIBRARY_DIRS})
 651	list(APPEND DEPENDENCY_LIB ${LIBZIP_LIBRARIES})
 652	list(APPEND FEATURES LIBZIP)
 653	list(APPEND VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-zip.c)
 654	string(REGEX MATCH "^[0-9]+" LIBZIP_VERSION_MAJOR ${libzip_VERSION})
 655	if (LIBZIP_VERSION_MAJOR LESS 1)
 656		set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libzip2")
 657	elseif(LIBZIP_VERSION_MAJOR EQUAL 1)
 658		set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libzip4")
 659	else()
 660		message(AUTHOR_WARNING Unknown version of libzip detected: ${libzip_VERSION})
 661	endif()
 662elseif(USE_MINIZIP)
 663	include_directories(AFTER ${MINIZIP_INCLUDE_DIRS})
 664	link_directories(${MINIZIP_LIBRARY_DIRS})
 665	list(APPEND DEPENDENCY_LIB ${MINIZIP_LIBRARIES})
 666	list(APPEND FEATURES MINIZIP)
 667	list(APPEND VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-zip.c)
 668	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libminizip1")
 669elseif(USE_ZLIB)
 670	list(APPEND VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-zip.c
 671		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/zlib/contrib/minizip/ioapi.c
 672		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/zlib/contrib/minizip/unzip.c)
 673	if(NOT MSVC)
 674		set_source_files_properties(
 675			${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/zlib/contrib/minizip/ioapi.c
 676			${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/zlib/contrib/minizip/unzip.c
 677			PROPERTIES COMPILE_FLAGS "-Wno-unused-parameter -Wno-implicit-function-declaration")
 678	endif()
 679endif()
 680
 681if (USE_LZMA)
 682	include_directories(AFTER ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma)
 683	add_definitions(-D_7ZIP_PPMD_SUPPPORT)
 684	list(APPEND VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-lzma.c)
 685	set(LZMA_SRC
 686		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zAlloc.c
 687		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zArcIn.c
 688		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zBuf.c
 689		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zBuf2.c
 690		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zCrc.c
 691		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zCrcOpt.c
 692		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zDec.c
 693		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/CpuArch.c
 694		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/Delta.c
 695		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/LzmaDec.c
 696		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/Lzma2Dec.c
 697		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/Bra.c
 698		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/Bra86.c
 699		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/BraIA64.c
 700		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/Bcj2.c
 701		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/Ppmd7.c
 702		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/Ppmd7Dec.c
 703		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zFile.c
 704		${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/lzma/7zStream.c)
 705	list(APPEND VFS_SRC ${LZMA_SRC})
 706	list(APPEND FEATURES LZMA)
 707endif()
 708
 709if(USE_EPOXY)
 710	list(APPEND OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/opengl/gl.c ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/opengl/gles2.c)
 711	add_definitions(-DBUILD_GL -DBUILD_GLES2)
 712	list(APPEND FEATURES EPOXY)
 713	include_directories(AFTER ${EPOXY_INCLUDE_DIRS})
 714	link_directories(${EPOXY_LIBRARY_DIRS})
 715	set(OPENGLES2_LIBRARY ${EPOXY_LIBRARIES})
 716	list(APPEND DEPENDENCY_LIB ${EPOXY_LIBRARIES})
 717	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libepoxy0")
 718elseif(BUILD_GL)
 719	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libgl1|libgles2")
 720elseif(BUILD_GLES2)
 721	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libgles2")
 722endif()
 723
 724if(WIN32 AND NOT SKIP_LIBRARY AND NOT USE_EPOXY)
 725    message(FATAL_ERROR "Windows requires epoxy module!")
 726endif()
 727
 728if(USE_SQLITE3)
 729	list(APPEND FEATURES SQLITE3)
 730	include_directories(AFTER ${SQLITE3_INCLUDE_DIRS})
 731	link_directories(${SQLITE3_LIBRARY_DIRS})
 732	list(APPEND DEPENDENCY_LIB ${SQLITE3_LIBRARIES})
 733	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libsqlite3-0")
 734	list(APPEND FEATURE_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/feature/sqlite3/no-intro.c")
 735endif()
 736
 737if(USE_ELF)
 738	list(APPEND FEATURES ELF)
 739	include_directories(AFTER ${LIBELF_INCLUDE_DIRS})
 740	link_directories(${LIBELF_LIBRARY_DIRS})
 741	list(APPEND DEPENDENCY_LIB ${LIBELF_LIBRARIES})
 742	set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS},libelf1")
 743endif()
 744
 745if (USE_DISCORD_RPC)
 746	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/discord-rpc discord-rpc EXCLUDE_FROM_ALL)
 747	list(APPEND FEATURES DISCORD_RPC)
 748	include_directories(AFTER ${CMAKE_CURRENT_SOURCE_DIR}/src/third-party/discord-rpc/include)
 749endif()
 750
 751if(ENABLE_SCRIPTING)
 752	list(APPEND ENABLES SCRIPTING)
 753
 754	if(BUILD_PYTHON)
 755		find_package(PythonLibs ${USE_PYTHON_VERSION})
 756		list(APPEND DEPENDENCY_LIB ${PYTHON_LIBRARIES})
 757		include_directories(AFTER ${PYTHON_INCLUDE_DIRS})
 758		list(APPEND ENABLES PYTHON)
 759	endif()
 760endif()
 761
 762add_subdirectory(src/arm)
 763add_subdirectory(src/core)
 764add_subdirectory(src/gb)
 765add_subdirectory(src/gba)
 766add_subdirectory(src/lr35902)
 767add_subdirectory(src/util)
 768
 769list(APPEND GUI_SRC ${EXTRA_GUI_SRC})
 770list(APPEND UTIL_SRC ${CMAKE_CURRENT_BINARY_DIR}/version.c)
 771
 772set(TEST_SRC ${CORE_TEST_SRC})
 773if(M_CORE_GB)
 774	add_definitions(-DM_CORE_GB)
 775	list(APPEND CORE_SRC ${LR35902_SRC} ${GB_SRC})
 776	list(APPEND DEBUGGER_SRC ${LR35902_DEBUGGER_SRC} ${GB_DEBUGGER_SRC})
 777	list(APPEND TEST_SRC ${LR35902_TEST_SRC} ${GB_TEST_SRC})
 778endif()
 779
 780if(M_CORE_GBA)
 781	add_definitions(-DM_CORE_GBA)
 782	list(APPEND CORE_SRC ${ARM_SRC} ${GBA_SRC})
 783	list(APPEND DEBUGGER_SRC ${ARM_DEBUGGER_SRC} ${GBA_DEBUGGER_SRC})
 784	list(APPEND TEST_SRC ${ARM_TEST_SRC} ${GBA_TEST_SRC})
 785endif()
 786
 787if(M_CORE_DS)
 788	add_definitions(-DM_CORE_DS)
 789	list(APPEND CORE_SRC ${ARM_SRC} ${DS_SRC} ${DS_RENDERER_SRC})
 790	list(APPEND DEBUGGER_SRC
 791		${CMAKE_CURRENT_SOURCE_DIR}/src/arm/debugger/cli-debugger.c
 792		${CMAKE_CURRENT_SOURCE_DIR}/src/arm/debugger/debugger.c
 793		${CMAKE_CURRENT_SOURCE_DIR}/src/arm/debugger/memory-debugger.c
 794		${CMAKE_CURRENT_SOURCE_DIR}/src/ds/extra/cli.c)
 795endif()
 796
 797if(USE_DEBUGGERS)
 798	list(APPEND FEATURE_SRC ${DEBUGGER_SRC})
 799	list(APPEND TEST_SRC ${DEBUGGER_TEST_SRC})
 800	list(APPEND FEATURES DEBUGGERS)
 801endif()
 802
 803foreach(FEATURE IN LISTS FEATURES)
 804	list(APPEND FEATURE_DEFINES "USE_${FEATURE}")
 805endforeach()
 806
 807foreach(ENABLE IN LISTS ENABLES)
 808	list(APPEND FEATURE_DEFINES "ENABLE_${ENABLE}")
 809endforeach()
 810
 811source_group("Virtual files" FILES ${CORE_VFS_SRC} ${VFS_SRC})
 812source_group("Extra features" FILES ${FEATURE_SRC})
 813source_group("Third-party code" FILES ${THIRD_PARTY_SRC})
 814
 815# Platform binaries
 816set(OS_DEFINES)
 817if(DEFINED 3DS)
 818	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/3ds ${CMAKE_CURRENT_BINARY_DIR}/3ds)
 819endif()
 820
 821if(DEFINED WII)
 822	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/wii ${CMAKE_CURRENT_BINARY_DIR}/wii)
 823endif()
 824
 825if(DEFINED PSP2)
 826	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/psp2 ${CMAKE_CURRENT_BINARY_DIR}/psp2)
 827endif()
 828
 829if(DEFINED SWITCH)
 830	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/switch ${CMAKE_CURRENT_BINARY_DIR}/switch)
 831endif()
 832
 833# Binaries
 834list(APPEND CORE_SRC
 835	${UTIL_SRC}
 836	${CORE_VFS_SRC}
 837	${OS_SRC}
 838	${THIRD_PARTY_SRC})
 839list(APPEND TEST_SRC ${UTIL_TEST_SRC})
 840
 841set(SRC ${CORE_SRC} ${VFS_SRC})
 842if(NOT MINIMAL_CORE)
 843	set(ENABLE_EXTRA ON)
 844	if(M_CORE_GBA)
 845		list(APPEND SRC ${GBA_SIO_SRC})
 846	endif()
 847	if(M_CORE_GB)
 848		list(APPEND SRC ${GB_SIO_SRC})
 849	endif()
 850	list(APPEND SRC ${FEATURE_SRC})
 851endif()
 852
 853if(ENABLE_EXTRA)
 854	if(M_CORE_GBA)
 855		list(APPEND SRC ${GBA_EXTRA_SRC})
 856	endif()
 857	if(M_CORE_GB)
 858		list(APPEND SRC ${GB_EXTRA_SRC})
 859	endif()
 860	list(APPEND SRC ${EXTRA_SRC})
 861endif()
 862
 863if(NOT SKIP_LIBRARY)
 864	if(NOT BUILD_STATIC AND NOT BUILD_SHARED)
 865		set(BUILD_SHARED ON)
 866	endif()
 867
 868	if(BUILD_SHARED)
 869		add_library(${BINARY_NAME} SHARED ${SRC} ${VFS_SRC})
 870		if(BUILD_STATIC)
 871			add_library(${BINARY_NAME}-static STATIC ${SRC})
 872			target_include_directories(${BINARY_NAME}-static BEFORE PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR}/include)
 873			set_target_properties(${BINARY_NAME}-static PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES};BUILD_STATIC" COMPILE_OPTIONS "${FEATURE_FLAGS}")
 874			install(TARGETS ${BINARY_NAME}-static DESTINATION ${LIBDIR} COMPONENT lib${BINARY_NAME})
 875			add_dependencies(${BINARY_NAME}-static version-info)
 876		endif()
 877	else()
 878		add_library(${BINARY_NAME} STATIC ${SRC})
 879		list(APPEND OS_DEFINES BUILD_STATIC)
 880	endif()
 881
 882	target_include_directories(${BINARY_NAME} BEFORE PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR}/include)
 883	set_target_properties(${BINARY_NAME} PROPERTIES VERSION ${LIB_VERSION_STRING} SOVERSION ${LIB_VERSION_ABI} COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}" COMPILE_OPTIONS "${FEATURE_FLAGS}")
 884	add_dependencies(${BINARY_NAME} version-info)
 885
 886	include(GenerateExportHeader)
 887	file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/mgba-util)
 888	generate_export_header(${BINARY_NAME} BASE_NAME MGBA STATIC_DEFINE BUILD_STATIC EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/include/mgba-util/dllexports.h)
 889
 890	target_link_libraries(${BINARY_NAME} ${DEBUGGER_LIB} ${DEPENDENCY_LIB} ${OS_LIB})
 891	install(TARGETS ${BINARY_NAME} LIBRARY DESTINATION ${LIBDIR} COMPONENT lib${BINARY_NAME} NAMELINK_SKIP ARCHIVE DESTINATION ${LIBDIR} RUNTIME DESTINATION ${LIBDIR} COMPONENT lib${BINARY_NAME})
 892	if(UNIX AND NOT APPLE AND NOT HAIKU)
 893		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-16.png DESTINATION share/icons/hicolor/16x16/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 894		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-24.png DESTINATION share/icons/hicolor/24x24/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 895		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-32.png DESTINATION share/icons/hicolor/32x32/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 896		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-48.png DESTINATION share/icons/hicolor/48x48/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 897		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-64.png DESTINATION share/icons/hicolor/64x64/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 898		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-96.png DESTINATION share/icons/hicolor/96x96/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 899		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-128.png DESTINATION share/icons/hicolor/128x128/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 900		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-256.png DESTINATION share/icons/hicolor/256x256/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 901		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-512.png DESTINATION share/icons/hicolor/512x512/apps RENAME mgba.png COMPONENT lib${BINARY_NAME})
 902	endif()
 903else()
 904	set(BUILD_SHARED OFF)
 905	set(BUILD_STATIC OFF)
 906	find_library(${BINARY_NAME} ${BINARY_NAME})
 907	if(NOT ${BINARY_NAME}_FOUND)
 908		set(DISABLE_FRONTENDS ON)
 909		set(BUILD_PERF OFF)
 910		set(BUILD_TEST OFF)
 911		set(BUILD_SUITE OFF)
 912	endif()
 913endif()
 914
 915if(BUILD_GL)
 916	add_definitions(-DBUILD_GL)
 917endif()
 918
 919if(BUILD_GLES2)
 920	add_definitions(-DBUILD_GLES2)
 921endif()
 922
 923if(BUILD_GLES3)
 924	add_definitions(-DBUILD_GLES3)
 925endif()
 926
 927if(DISABLE_FRONTENDS)
 928	set(BUILD_SDL OFF)
 929	set(BUILD_QT OFF)
 930endif()
 931
 932if(BUILD_PYTHON)
 933	enable_testing()
 934	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/python ${CMAKE_CURRENT_BINARY_DIR}/python)
 935endif()
 936
 937if(BUILD_LIBRETRO)
 938	file(GLOB RETRO_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/libretro/*.c)
 939	add_library(${BINARY_NAME}_libretro SHARED ${CORE_SRC} ${RETRO_SRC})
 940	add_dependencies(${BINARY_NAME}_libretro version-info)
 941	set_target_properties(${BINARY_NAME}_libretro PROPERTIES PREFIX "" COMPILE_DEFINITIONS "__LIBRETRO__;COLOR_16_BIT;COLOR_5_6_5;DISABLE_THREADING;MGBA_STANDALONE;${OS_DEFINES};${FUNCTION_DEFINES};MINIMAL_CORE=2")
 942	target_link_libraries(${BINARY_NAME}_libretro ${OS_LIB})
 943	if(MSVC)
 944		install(TARGETS ${BINARY_NAME}_libretro RUNTIME DESTINATION ${LIBRETRO_LIBDIR} COMPONENT ${BINARY_NAME}_libretro)
 945	else()
 946		install(TARGETS ${BINARY_NAME}_libretro LIBRARY DESTINATION ${LIBRETRO_LIBDIR} COMPONENT ${BINARY_NAME}_libretro NAMELINK_SKIP)
 947	endif()
 948endif()
 949
 950if(BUILD_OPENEMU)
 951	find_library(FOUNDATION Foundation)
 952	find_library(OPENEMUBASE OpenEmuBase)
 953	file(GLOB OE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/openemu/*.m)
 954	add_library(${BINARY_NAME}-openemu MODULE ${CORE_SRC} ${OS_SRC})
 955	set_target_properties(${BINARY_NAME}-openemu PROPERTIES
 956		MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/openemu/Info.plist.in
 957		BUNDLE TRUE
 958		BUNDLE_EXTENSION oecoreplugin
 959		OUTPUT_NAME ${PROJECT_NAME}
 960		COMPILE_DEFINITIONS "DISABLE_THREADING;MGBA_STANDALONE;${OS_DEFINES};${FUNCTION_DEFINES};MINIMAL_CORE=1")
 961	target_link_libraries(${BINARY_NAME}-openemu ${OS_LIB} ${FOUNDATION} ${OPENEMUBASE})
 962	install(TARGETS ${BINARY_NAME}-openemu LIBRARY DESTINATION ${OE_LIBDIR} COMPONENT ${BINARY_NAME}.oecoreplugin NAMELINK_SKIP)
 963endif()
 964
 965if(BUILD_SDL)
 966	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/sdl ${CMAKE_CURRENT_BINARY_DIR}/sdl)
 967endif()
 968
 969if(BUILD_QT)
 970	add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/qt ${CMAKE_CURRENT_BINARY_DIR}/qt)
 971endif()
 972
 973if(BUILD_PERF)
 974	set(PERF_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/test/perf-main.c)
 975	if(UNIX AND NOT APPLE)
 976		list(APPEND PERF_LIB rt)
 977	endif()
 978
 979	add_executable(${BINARY_NAME}-perf ${PERF_SRC})
 980	target_link_libraries(${BINARY_NAME}-perf ${BINARY_NAME} ${PERF_LIB} ${OS_LIB})
 981	set_target_properties(${BINARY_NAME}-perf PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}")
 982	install(TARGETS ${BINARY_NAME}-perf DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-perf)
 983	install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tools/perf.py DESTINATION "${LIBDIR}/${BINARY_NAME}" COMPONENT ${BINARY_NAME}-perf)
 984endif()
 985
 986if(BUILD_TEST)
 987	add_executable(${BINARY_NAME}-fuzz ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/test/fuzz-main.c)
 988	target_link_libraries(${BINARY_NAME}-fuzz ${BINARY_NAME})
 989	set_target_properties(${BINARY_NAME}-fuzz PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}")
 990	add_executable(tbl-fuzz ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/test/tbl-fuzz-main.c)
 991	target_link_libraries(tbl-fuzz ${BINARY_NAME})
 992	set_target_properties(tbl-fuzz PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}")
 993	install(TARGETS ${BINARY_NAME}-fuzz tbl-fuzz DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-test)
 994endif()
 995
 996if(NOT USE_CMOCKA)
 997	set(BUILD_SUITE OFF)
 998endif()
 999if(BUILD_SUITE)
1000	enable_testing()
1001	include_directories(AFTER ${CMOCKA_INCLUDE_DIRS})
1002	link_directories(${CMOCKA_LIBRARY_DIRS})
1003
1004	foreach(TEST IN LISTS TEST_SRC)
1005		string(REPLACE "${CMAKE_SOURCE_DIR}/src/" "" TEST_NAME "${TEST}")
1006		string(REPLACE "/" "-" TEST_NAME "${TEST_NAME}")
1007		string(REPLACE "-test" "" TEST_NAME "${TEST_NAME}")
1008		string(REPLACE ".c" "" TEST_NAME "${TEST_NAME}")
1009		add_executable(test-${TEST_NAME} ${TEST})
1010		target_link_libraries(test-${TEST_NAME} ${BINARY_NAME} ${PLATFORM_LIBRARY} cmocka)
1011		set_target_properties(test-${TEST_NAME} PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}")
1012		add_test(${TEST_NAME} test-${TEST_NAME})
1013	endforeach()
1014endif()
1015
1016if(BUILD_EXAMPLE)
1017	add_executable(${BINARY_NAME}-example-server ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/example/client-server/server.c)
1018	target_link_libraries(${BINARY_NAME}-example-server ${BINARY_NAME})
1019	set_target_properties(${BINARY_NAME}-example-server PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}")
1020
1021	if(SDL_FOUND)
1022		add_executable(${BINARY_NAME}-example-client ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/example/client-server/client.c)
1023		target_link_libraries(${BINARY_NAME}-example-client ${BINARY_NAME} ${SDL_LIBRARY} ${SDLMAIN_LIBRARY} ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY})
1024		set_target_properties(${BINARY_NAME}-example-client PROPERTIES
1025		                      COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}"
1026		                      INCLUDE_DIRECTORIES "${SDL_INCLUDE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/src;${CMAKE_CURRENT_SOURCE_DIR}/include")
1027	endif()
1028endif()
1029
1030file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/mgba)
1031configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/core/flags.h.in ${CMAKE_CURRENT_BINARY_DIR}/include/mgba/flags.h)
1032install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/mgba DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT ${BINARY_NAME}-dev FILES_MATCHING PATTERN "*.h")
1033install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/mgba-util DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT ${BINARY_NAME}-dev FILES_MATCHING PATTERN "*.h")
1034install(FILES ${CMAKE_CURRENT_BINARY_DIR}/include/mgba/flags.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mgba COMPONENT ${BINARY_NAME}-dev)
1035
1036if(WIN32)
1037	set(BIN_DIR ".\\")
1038	string(REGEX REPLACE "[^-A-Za-z0-9_.]" "-" CLEAN_VERSION_STRING "${VERSION_STRING}")
1039	file(RELATIVE_PATH SETUP_DIR_SLASH "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/src/platform/windows/setup")
1040	file(RELATIVE_PATH RES_DIR_SLASH "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/res")
1041	string(REPLACE "/" "\\" SETUP_DIR "${SETUP_DIR_SLASH}")
1042	string(REPLACE "/" "\\" RES_DIR "${RES_DIR_SLASH}")
1043	if(CMAKE_SYSTEM_PROCESSOR MATCHES ".*64$")
1044		set(WIN_BITS 64)
1045	else()
1046		set(WIN_BITS 32)
1047	endif()
1048	if(GIT_TAG)
1049		set(IS_RELEASE 1)
1050	else()
1051		set(IS_RELEASE 0)
1052	endif()
1053	configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/platform/windows/setup/setup.iss.in" ${CMAKE_CURRENT_BINARY_DIR}/setup.iss)
1054endif()
1055
1056# Packaging
1057install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/licenses/blip_buf.txt DESTINATION ${CMAKE_INSTALL_DOCDIR}/licenses COMPONENT ${BINARY_NAME})
1058install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/licenses/inih.txt DESTINATION ${CMAKE_INSTALL_DOCDIR}/licenses COMPONENT ${BINARY_NAME})
1059if(USE_DISCORD_RPC)
1060	install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/licenses/discord-rpc.txt DESTINATION ${CMAKE_INSTALL_DOCDIR}/licenses COMPONENT ${BINARY_NAME})
1061	install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/licenses/rapidjson.txt DESTINATION ${CMAKE_INSTALL_DOCDIR}/licenses COMPONENT ${BINARY_NAME})
1062	if(WIN32)
1063		install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/licenses/mingw-std-threads.txt DESTINATION ${CMAKE_INSTALL_DOCDIR}/licenses COMPONENT ${BINARY_NAME})
1064	endif()
1065endif()
1066if(EXTRA_LICENSES)
1067	install(FILES ${EXTRA_LICENSES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/licenses COMPONENT ${BINARY_NAME})
1068endif()
1069
1070file(GLOB READMES ${CMAKE_CURRENT_SOURCE_DIR}/README*.md)
1071
1072find_program(UNIX2DOS NAMES unix2dos)
1073find_program(MARKDOWN NAMES markdown kramdown pandoc)
1074
1075if(UNIX OR NOT UNIX2DOS)
1076	if(UNIX OR NOT MARKDOWN)
1077		install(FILES ${READMES} DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME})
1078	endif()
1079	install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/CHANGES" "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME})
1080else()
1081	add_custom_command(OUTPUT CHANGES.txt COMMAND ${UNIX2DOS} -n "${CMAKE_CURRENT_SOURCE_DIR}/CHANGES" "${CMAKE_CURRENT_BINARY_DIR}/CHANGES.txt" MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/CHANGES")
1082	add_custom_command(OUTPUT LICENSE.txt COMMAND ${UNIX2DOS} -n "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt" MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
1083	add_custom_target(CHANGES ALL DEPENDS CHANGES.txt)
1084	add_custom_target(LICENSE ALL DEPENDS LICENSE.txt)
1085	install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CHANGES.txt ${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME})
1086	if(DISTBUILD AND WIN32)
1087		if(INSTALLER_NAME)
1088			set(INSTALLER_TARGET "${INSTALLER_NAME}.exe")
1089			set(ISCC_FLAGS "/F${INSTALLER_NAME}")
1090		else()
1091			set(INSTALLER_TARGET "${PROJECT_NAME}-setup-${CLEAN_VERSION_STRING}-win${WIN_BITS}.exe")
1092		endif()
1093		if(CMAKE_CROSSCOMPILING)
1094			find_program(WINE NAMES wine wine-stable wine-development)
1095			find_file(ISCC ISCC.exe HINTS "$ENV{HOME}/.wine/drive_c/Program Files/" PATH_SUFFIXES "Inno Setup 5")
1096			message(STATUS "${WINE}" "${ISCC}" setup.iss /Q ${ISCC_FLAGS})
1097			add_custom_command(OUTPUT ${INSTALLER_TARGET}
1098			                   COMMAND "${WINE}" "${ISCC}" setup.iss /Q ${ISCC_FLAGS}
1099			                   DEPENDS ${BINARY_NAME}-qt ${BINARY_NAME}-sdl CHANGES LICENSE)
1100		else()
1101			find_program(ISCC NAMES ISCC ISCC.exe PATH_SUFFIXES "Inno Setup 5")
1102			add_custom_command(OUTPUT ${INSTALLER_TARGET}
1103			                   COMMAND "${ISCC}" setup.iss /Q ${ISCC_FLAGS}
1104			                   DEPENDS ${BINARY_NAME}-qt ${BINARY_NAME}-sdl CHANGES LICENSE)
1105		endif()
1106		if(ISCC)
1107			add_custom_target(installer ALL DEPENDS ${INSTALLER_TARGET})
1108			install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${INSTALLER_TARGET}" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT installer)
1109		endif()
1110	endif()
1111endif()
1112
1113if(MARKDOWN)
1114	foreach(README ${READMES})
1115		get_filename_component(README_BASE "${README}" NAME_WE)
1116		add_custom_command(OUTPUT ${README_BASE}.html COMMAND ${MARKDOWN} "${README}" > ${README_BASE}.html MAIN_DEPENDENCY "${README}")
1117		add_custom_target(${README_BASE} ALL DEPENDS ${README_BASE}.html)
1118		install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${README_BASE}.html DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME})
1119	endforeach()
1120endif()
1121
1122set(CPACK_PACKAGE_VERSION ${VERSION_STRING})
1123set(CPACK_PACKAGE_VERSION_MAJOR ${LIB_VERSION_MAJOR})
1124set(CPACK_PACKAGE_VERSION_MINOR ${LIB_VERSION_MINOR})
1125set(CPACK_PACKAGE_VERSION_PATCH ${LIB_VERSION_PATCH})
1126set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE)
1127set(CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_SOURCE_DIR}/README.md)
1128
1129set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "mGBA Game Boy Advance Emulator")
1130set(CPACK_PACKAGE_VENDOR "Jeffrey Pfau")
1131set(CPACK_PACKAGE_CONTACT "Jeffrey Pfau <jeffrey@endrift.com>")
1132set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
1133set(CPACK_DEBIAN_PACKAGE_SECTION "games")
1134
1135set(CPACK_DEB_COMPONENT_INSTALL ON)
1136
1137if(CMAKE_BUILD_TYPE STREQUAL "Release")
1138	set(CPACK_STRIP_FILES ON)
1139endif()
1140
1141if(DISTBUILD)
1142	set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
1143	if(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" AND BUILD_SHARED)
1144		if(NOT APPLE)
1145			add_custom_command(TARGET ${BINARY_NAME} POST_BUILD COMMAND "${OBJCOPY}" --only-keep-debug "$<TARGET_FILE:${BINARY_NAME}>" "$<TARGET_FILE:${BINARY_NAME}>.dSYM")
1146			add_custom_command(TARGET ${BINARY_NAME} POST_BUILD COMMAND "${STRIP}" -S "$<TARGET_FILE:${BINARY_NAME}>")
1147			install(FILES "$<TARGET_FILE:${BINARY_NAME}>.dSYM" DESTINATION ${LIBDIR} COMPONENT lib${BINARY_NAME}-dbg)
1148		endif()
1149	endif()
1150	if(APPLE)
1151		set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-qt ${BINARY_NAME}-sdl ${BINARY_NAME}-qt-dbg ${BINARY_NAME}-sdl-dbg ${BINARY_NAME}-perf)
1152		set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)
1153	elseif(WIN32)
1154		set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-qt ${BINARY_NAME}-sdl ${BINARY_NAME}-qt-dbg ${BINARY_NAME}-sdl-dbg ${BINARY_NAME}-perf installer)
1155	elseif(3DS)
1156		set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-dbg ${BINARY_NAME}-3ds ${BINARY_NAME}-perf)
1157	elseif(WII)
1158		set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-dbg ${BINARY_NAME}-wii)
1159	elseif(PSP2)
1160		set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-dbg ${BINARY_NAME}-psp2)
1161	elseif(SWITCH)
1162		set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-dbg ${BINARY_NAME}-switch)
1163	endif()
1164endif()
1165
1166include(CPack)
1167
1168cpack_add_component_group(base)
1169cpack_add_component(${BINARY_NAME} GROUP base)
1170
1171cpack_add_component_group(dev PARENT_GROUP base)
1172if(BUILD_SHARED)
1173	cpack_add_component(lib${BINARY_NAME} GROUP base)
1174	if(BUILD_STATIC)
1175		cpack_add_component(lib${BINARY_NAME}-static GROUP dev)
1176	endif()
1177elseif(BUILD_STATIC)
1178	cpack_add_component(lib${BINARY_NAME} GROUP dev)
1179endif()
1180cpack_add_component(${BINARY_NAME}-dev GROUP dev)
1181
1182if(3DS)
1183	cpack_add_component(${BINARY_NAME}-3ds GROUP base)
1184elseif(PSP2)
1185	cpack_add_component(${BINARY_NAME}-psp2 GROUP base)
1186elseif(WII)
1187	cpack_add_component(${BINARY_NAME}-wii GROUP base)
1188elseif(SWITCH)
1189	cpack_add_component(${BINARY_NAME}-switch GROUP base)
1190endif()
1191
1192if(BUILD_QT)
1193	cpack_add_component_group(qt PARENT_GROUP base)
1194	cpack_add_component(${BINARY_NAME}-qt GROUP qt)
1195endif()
1196
1197if(SDL_FOUND)
1198	cpack_add_component_group(sdl PARENT_GROUP base)
1199	cpack_add_component(${BINARY_NAME}-sdl GROUP sdl)
1200endif()
1201
1202if(DISTBUILD)
1203	cpack_add_component_group(debug PARENT_GROUP dev)
1204	if(BUILD_SHARED AND NOT IS_EMBEDDED)
1205		cpack_add_component(lib${BINARY_NAME}-dbg GROUP debug)
1206	endif()
1207	if(IS_EMBEDDED)
1208		cpack_add_component(${BINARY_NAME}-dbg GROUP debug)
1209	endif()
1210	if(BUILD_QT)
1211		cpack_add_component(${BINARY_NAME}-qt-dbg GROUP debug)
1212	endif()
1213	if(SDL_FOUND)
1214		cpack_add_component(${BINARY_NAME}-sdl-dbg GROUP debug)
1215	endif()
1216	if(WIN32)
1217		cpack_add_component_group(installer PARENT_GROUP base)
1218	endif()
1219endif()
1220
1221cpack_add_component_group(test PARENT_GROUP dev)
1222cpack_add_component(${BINARY_NAME}-perf GROUP test)
1223cpack_add_component(${BINARY_NAME}-fuzz GROUP test)
1224cpack_add_component(tbl-fuzz GROUP test)
1225
1226# Summaries
1227set(SUMMARY_GL_LIST)
1228if(USE_EPOXY)
1229	set(SUMMARY_GL_LIST "libepoxy")
1230else()
1231	if(BUILD_GL)
1232		list(APPEND SUMMARY_GL_LIST "OpenGL")
1233	endif()
1234	if(BUILD_GLES2)
1235		list(APPEND SUMMARY_GL_LIST "OpenGL|ES 2")
1236	endif()
1237	if(BUILD_GLES3)
1238		list(APPEND SUMMARY_GL_LIST "OpenGL|ES 3")
1239	endif()
1240endif()
1241if(NOT SUMMARY_GL_LIST)
1242	set(SUMMARY_GL OFF)
1243else()
1244	string(REPLACE ";" ", " SUMMARY_GL "${SUMMARY_GL_LIST}")
1245endif()
1246if(USE_LIBZIP)
1247	set(SUMMARY_ZIP libzip)
1248elseif(USE_MINIZIP)
1249	set(SUMMARY_ZIP "minizip (external)")
1250elseif(USE_ZLIB)
1251	set(SUMMARY_ZIP "minizip (included)")
1252else()
1253	set(SUMMARY_ZIP OFF)
1254endif()
1255
1256if(NOT QUIET AND NOT LIBMGBA_ONLY)
1257	message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
1258	message(STATUS "Platforms:")
1259	message(STATUS "	Game Boy Advance: ${M_CORE_GBA}")
1260	message(STATUS "	Game Boy: ${M_CORE_GB}")
1261	message(STATUS "	DS: ${M_CORE_DS}")
1262	message(STATUS "Features:")
1263	message(STATUS "	Debuggers: ${USE_DEBUGGERS}")
1264	if(NOT WIN32)
1265		message(STATUS "	CLI debugger: ${USE_EDITLINE}")
1266	endif()
1267	message(STATUS "	GDB stub: ${USE_GDB_STUB}")
1268	message(STATUS "	Video recording: ${USE_FFMPEG}")
1269	message(STATUS "	GIF recording: ${USE_MAGICK}")
1270	message(STATUS "	Screenshot/advanced savestate support: ${USE_PNG}")
1271	message(STATUS "	ZIP support: ${SUMMARY_ZIP}")
1272	message(STATUS "	7-Zip support: ${USE_LZMA}")
1273	message(STATUS "	SQLite3 game database: ${USE_SQLITE3}")
1274	message(STATUS "	ELF loading support: ${USE_ELF}")
1275	message(STATUS "	Discord Rich Presence support: ${USE_DISCORD_RPC}")
1276	message(STATUS "	OpenGL support: ${SUMMARY_GL}")
1277	message(STATUS "Frontends:")
1278	message(STATUS "	Qt: ${BUILD_QT}")
1279	message(STATUS "	SDL (${SDL_VERSION}): ${BUILD_SDL}")
1280	message(STATUS "	Profiling: ${BUILD_PERF}")
1281	message(STATUS "	Test harness: ${BUILD_TEST}")
1282	message(STATUS "	Test suite: ${BUILD_SUITE}")
1283	message(STATUS "	Python bindings: ${BUILD_PYTHON}")
1284	message(STATUS "	Examples: ${BUILD_EXAMPLE}")
1285	message(STATUS "Cores:")
1286	message(STATUS "	Libretro core: ${BUILD_LIBRETRO}")
1287	if(APPLE)
1288		message(STATUS "	OpenEmu core: ${BUILD_OPENEMU}")
1289	endif()
1290	message(STATUS "Libraries:")
1291	message(STATUS "	Static: ${BUILD_STATIC}")
1292	message(STATUS "	Shared: ${BUILD_SHARED}")
1293endif()