cmake_minimum_required(VERSION 3.19) cmake_policy(VERSION 3.19...3.28.3) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) if(WIN32) include(RemoveStrawberryPerlFromPATH) endif() if(UPDATE_APPCAST) include(UpdateAppcast) endif() if(TAG_RELEASE) include(MakeReleaseCommitAndTag) endif() set(VCPKG_DEPS pkgconf zlib pthreads "sdl2[samplerate]" gettext wxwidgets) set(VCPKG_DEPS_OPTIONAL sfml ENABLE_LINK ffmpeg ENABLE_FFMPEG ) if(WIN32) find_program(POWERSHELL NAMES powershell.exe pwsh.exe HINTS "/Windows/System32/WindowsPowerShell/v1.0" REQUIRED) else() find_program(POWERSHELL pwsh) endif() include(Set-Toolchain-vcpkg) # Use ccache if available and not already enabled on the command line. # This has to be done before the project() call. if(NOT CMAKE_CXX_COMPILER_LAUNCHER) find_program(CCACHE_EXECUTABLE ccache) if(CCACHE_EXECUTABLE) message(STATUS "Enabling ccache") set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE} CACHE STRING "C compiler launcher" FORCE) set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE} CACHE STRING "C++ compiler launcher" FORCE) set(CMAKE_ASM_NASM_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE} CACHE STRING "nasm assembler launcher" FORCE) endif() endif() find_package(Git) # Make sure we pull in the submodules on windows and mingw. if(GIT_FOUND AND (WIN32 OR MINGW)) # Win32 deps submodule set(SUBMODULE_MANUAL_UPDATE FALSE) if(EXISTS "${CMAKE_SOURCE_DIR}/.git" AND NOT EXISTS "${CMAKE_SOURCE_DIR}/dependencies/mingw-xaudio/include") set(SUBMODULE_MANUAL_UPDATE TRUE) execute_process( COMMAND "${GIT_EXECUTABLE}" submodule update --init --remote --recursive RESULT_VARIABLE SUBMODULE_UPDATE_STATUS WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" ) endif() if(NOT EXISTS "${CMAKE_SOURCE_DIR}/dependencies/mingw-xaudio/include") if(NOT (SUBMODULE_MANUAL_UPDATE AND SUBMODULE_UPDATE_STATUS EQUAL 0)) message(FATAL_ERROR "Please pull in git submodules, e.g.\nrun: git submodule update --init --remote --recursive") endif() endif() endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED True) project(VBA-M C CXX) find_package(PkgConfig) if(NOT CMAKE_PREFIX_PATH AND (NOT ("$ENV{CMAKE_PREFIX_PATH}" STREQUAL ""))) set(CMAKE_PREFIX_PATH "$ENV{CMAKE_PREFIX_PATH}") endif() if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build Type" FORCE) elseif(NOT CMAKE_BUILD_TYPE MATCHES "^(Release|Debug|RelWithDebInfo|MinSizeRel)$") message(FATAL_ERROR "Invalid CMAKE_BUILD_TYPE: '${CMAKE_BUILD_TYPE}', must be one of: 'Release', 'Debug', 'RelWithDebInfo' or 'MinSizeRel'") endif() # Link debug libs for RelWithDebInfo if(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO "Debug") endif() include(CTest) if(BUILD_TESTING) enable_testing() endif() include(GNUInstallDirs) include(Options) include(Architecture) include(Toolchain) #Output all binaries at top level set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}) if(NOT HTTPS) add_compile_definitions(NO_HTTPS) endif() if(ENABLE_GBA_LOGGING) add_compile_definitions(GBA_LOGGING ) endif() if(ENABLE_MMX) add_compile_definitions(MMX) endif() # The SDL port can't be built without debugging support if(NOT ENABLE_DEBUGGER AND ENABLE_SDL) message(SEND_ERROR "The SDL port can't be built without debugging support") endif() if(EXISTS "${CMAKE_SOURCE_DIR}/.git") include(GitTagVersion) git_version(VBAM_VERSION VBAM_REVISION VBAM_VERSION_RELEASE) # only use the plugin to tie the configure state to the sha to force rebuilds # of files that depend on version.h include(GetGitRevisionDescription) get_git_head_revision(REFSPEC COMMITHASH) # Make sure old tags are gone from all clones. execute_process( COMMAND ${GIT_EXECUTABLE} tag -l OUTPUT_VARIABLE git_tags OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) string(REGEX REPLACE ";" "\\\\;" git_tags_lines "${git_tags}") string(REGEX REPLACE "\r?\n" ";" git_tags_lines "${git_tags_lines}") set(found_old_tags FALSE) foreach(tag ${git_tags_lines}) if(NOT tag MATCHES "^v[0-9]") set(found_old_tags TRUE) break() endif() endforeach() if(found_old_tags) # Delete all tags and fetch them from the origin. foreach(tag ${git_tags_lines}) execute_process( COMMAND ${GIT_EXECUTABLE} tag -d ${tag} OUTPUT_QUIET ERROR_QUIET WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) endforeach() execute_process( COMMAND ${GIT_EXECUTABLE} fetch --tags origin OUTPUT_QUIET ERROR_QUIET WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) endif() endif() # no git or no tags, use ChangeLog if(NOT VBAM_VERSION) include(ChangeLogVersion) changelog_version(VBAM_VERSION VBAM_REVISION VBAM_VERSION_RELEASE) endif() # We do not support amd64 asm yet if(X86_64 AND (ENABLE_ASM_CORE OR ENABLE_ASM_SCALERS OR ENABLE_MMX)) message(FATAL_ERROR "The options ASM_CORE, ASM_SCALERS and MMX are not supported on X86_64 yet.") endif() # Look for some dependencies using CMake scripts find_package(ZLIB REQUIRED) set(OpenGL_GL_PREFERENCE GLVND) if(CMAKE_SYSTEM_NAME STREQUAL FreeBSD) set(OpenGL_GL_PREFERENCE LEGACY) endif() find_package(OpenGL REQUIRED) find_package(SDL2 REQUIRED) # Add libsamplerate to SDL2 with vcpkg unset(SDL2_LIBRARY_TEMP) if(CMAKE_TOOLCHAIN_FILE MATCHES "vcpkg") if(WIN32) unset(arch_suffix) unset(path_prefix) if(VCPKG_TARGET_TRIPLET MATCHES -static) set(arch_suffix -static) endif() if(CMAKE_BUILD_TYPE MATCHES "^(Debug|RelWithDebInfo)$") set(path_prefix debug) endif() set(installed_prefix ${_VCPKG_INSTALLED_DIR}/${WINARCH}-windows${arch_suffix}/${path_prefix}) SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${installed_prefix}/lib/samplerate.lib) else() SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} -lsamplerate) endif() endif() set(VBAM_SDL2_LIBS SDL2::SDL2 ${SDL2_LIBRARY_TEMP}) set(VBAM_GENERATED_DIR ${CMAKE_BINARY_DIR}/generated) # Set up "src" and generated directory as a global include directory. include_directories( ${CMAKE_SOURCE_DIR}/src ${VBAM_GENERATED_DIR} ) if(ENABLE_FFMPEG) if(NOT FFMPEG_LIBRARIES) message(FATAL_ERROR "ENABLE_FFMPEG was specified, but required versions of ffmpeg libraries cannot be found!") endif() if(APPLE) list(APPEND FFMPEG_LDFLAGS "SHELL:-framework CoreText" "SHELL:-framework ApplicationServices") if(UPSTREAM_RELEASE) list(APPEND FFMPEG_LDFLAGS -lbz2 -ltiff "SHELL:-framework DiskArbitration" -lfreetype -lfontconfig -llzma -lxml2 -lharfbuzz) endif() elseif(WIN32) set(WIN32_MEDIA_FOUNDATION_LIBS dxva2 evr mf mfplat mfplay mfreadwrite mfuuid amstrmid) list(APPEND FFMPEG_LIBRARIES secur32 bcrypt ${WIN32_MEDIA_FOUNDATION_LIBS}) if(MSYS AND VBAM_STATIC) foreach(lib tiff jbig lzma) cygpath(lib "$ENV{MSYSTEM_PREFIX}/lib/lib${lib}.a") list(APPEND FFMPEG_LIBRARIES "${lib}") endforeach() endif() endif() else() add_compile_definitions(NO_FFMPEG) endif() if(NOT ENABLE_ONLINEUPDATES) add_compile_definitions(NO_ONLINEUPDATES) endif() # C defines add_compile_definitions(HAVE_NETINET_IN_H HAVE_ARPA_INET_H HAVE_ZLIB_H FINAL_VERSION SDL USE_OPENGL SYSCONF_INSTALL_DIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}") add_compile_definitions(PKGDATADIR="${CMAKE_INSTALL_FULL_DATADIR}/vbam") add_compile_definitions(__STDC_FORMAT_MACROS) if(ENABLE_LINK) # IPC linking code needs sem_timedwait which can be either in librt or pthreads if(NOT WIN32) find_library(RT_LIB rt) if(RT_LIB) set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${RT_LIB}) set(VBAMCORE_LIBS ${VBAMCORE_LIBS} ${RT_LIB}) endif() endif() include(CheckFunctionExists) check_function_exists(sem_timedwait SEM_TIMEDWAIT) if(SEM_TIMEDWAIT) add_compile_definitions(HAVE_SEM_TIMEDWAIT) endif() else() add_compile_definitions(NO_LINK) endif() # The debugger is enabled by default if(ENABLE_DEBUGGER) add_compile_definitions(VBAM_ENABLE_DEBUGGER) endif() # The ASM core is disabled by default because we don't know on which platform we are if(NOT ENABLE_ASM_CORE) add_compile_definitions(C_CORE) endif() # Enable internationalization set(LOCALEDIR ${CMAKE_INSTALL_PREFIX}/share/locale) add_compile_definitions(LOCALEDIR="${LOCALEDIR}") # for now, only GBALink.cpp uses gettext() directly if(APPLE) # use Homebrew gettext if available if(EXISTS "/usr/local/opt/gettext") set(CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH};/usr/local/opt/gettext/include") set(CMAKE_LIBRARY_PATH "${CMAKE_LIBRARY_PATH};/usr/local/opt/gettext/lib") set(CMAKE_PROGRAM_PATH "${CMAKE_PROGRAM_PATH};/usr/local/opt/gettext/bin") endif() endif() if(ENABLE_LINK OR ENABLE_WX) find_path(LIBINTL_INC libintl.h) find_library(LIBINTL_LIB NAMES libintl intl) find_library(LIBICONV_LIB NAMES libiconv iconv) find_library(LIBCHARSET_LIB NAMES libcharset charset) if(LIBINTL_LIB) list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBINTL_LIB}) list(APPEND NLS_LIBS ${LIBINTL_LIB}) endif() if(LIBICONV_LIB) list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBICONV_LIB}) list(APPEND NLS_LIBS ${LIBICONV_LIB}) endif() if(LIBCHARSET_LIB) list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBCHARSET_LIB}) list(APPEND NLS_LIBS ${LIBCHARSET_LIB}) endif() include(CheckFunctionExists) check_function_exists(gettext GETTEXT_FN) if(NOT (LIBINTL_INC OR GETTEXT_FN)) message(FATAL_ERROR "NLS requires libintl/gettext") endif() endif() if(NOT TRANSLATIONS_ONLY) add_subdirectory(third_party/include/nonstd) add_subdirectory(third_party/include/stb) add_subdirectory(src/core) add_subdirectory(src/components) add_subdirectory(src/sdl) endif() add_subdirectory(src/wx) add_subdirectory(po/wxvbam) set(CPACK_GENERATOR "ZIP") set(CPACK_SOURCE_GENERATOR "TGZ") set(CPACK_PACKAGE_VERSION_MAJOR "2") set(CPACK_PACKAGE_VERSION_MINOR "0") set(CPACK_PACKAGE_VERSION_PATCH "0-Git-${COMMITHASH}") list(APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/dependencies") include(CPack)