# CMake build script for the libgit2 project # # Building (out of source build): # > mkdir build && cd build # > cmake .. [-DSETTINGS=VALUE] # > cmake --build . # # Testing: # > ctest -V # # Install: # > cmake --build . --target install PROJECT(libgit2 C) CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11) CMAKE_POLICY(SET CMP0015 NEW) IF(POLICY CMP0051) CMAKE_POLICY(SET CMP0051 NEW) ENDIF() IF(POLICY CMP0042) CMAKE_POLICY(SET CMP0042 NEW) ENDIF() IF(POLICY CMP0054) CMAKE_POLICY(SET CMP0054 NEW) ENDIF() # Add find modules to the path SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${libgit2_SOURCE_DIR}/cmake/Modules/") INCLUDE(CheckLibraryExists) INCLUDE(CheckFunctionExists) INCLUDE(CheckSymbolExists) INCLUDE(CheckStructHasMember) INCLUDE(CheckPrototypeDefinition) # Added in CMake 3.0 INCLUDE(AddCFlagIfSupported) INCLUDE(FindPkgLibraries) INCLUDE(FindThreads) INCLUDE(FindStatNsec) INCLUDE(IdeSplitSources) INCLUDE(FeatureSummary) INCLUDE(EnableWarnings) # Build options # OPTION(SONAME "Set the (SO)VERSION of the target" ON) OPTION(BUILD_SHARED_LIBS "Build Shared Library (OFF for Static)" ON) OPTION(THREADSAFE "Build libgit2 as threadsafe" ON) OPTION(BUILD_CLAR "Build Tests using the Clar suite" ON) OPTION(BUILD_EXAMPLES "Build library usage example apps" OFF) OPTION(BUILD_FUZZERS "Build the fuzz targets" OFF) OPTION(TAGS "Generate tags" OFF) OPTION(PROFILE "Generate profiling information" OFF) OPTION(ENABLE_TRACE "Enables tracing support" OFF) OPTION(LIBGIT2_FILENAME "Name of the produced binary" OFF) SET(SHA1_BACKEND "CollisionDetection" CACHE STRING "Backend to use for SHA1. One of Generic, OpenSSL, Win32, CommonCrypto, mbedTLS, CollisionDetection.") OPTION(USE_SSH "Link with libssh2 to enable SSH support" ON) OPTION(USE_HTTPS "Enable HTTPS support. Can be set to a specific backend" ON) OPTION(USE_GSSAPI "Link with libgssapi for SPNEGO auth" OFF) OPTION(USE_STANDALONE_FUZZERS "Enable standalone fuzzers (compatible with gcc)" OFF) OPTION(VALGRIND "Configure build for valgrind" OFF) OPTION(USE_EXT_HTTP_PARSER "Use system HTTP_Parser if available" ON) OPTION(DEBUG_POOL "Enable debug pool allocator" OFF) OPTION(ENABLE_WERROR "Enable compilation with -Werror" OFF) OPTION(USE_BUNDLED_ZLIB "Use the bundled version of zlib" OFF) IF (UNIX AND NOT APPLE) OPTION(ENABLE_REPRODUCIBLE_BUILDS "Enable reproducible builds" OFF) ENDIF() IF (APPLE) OPTION(USE_ICONV "Link with and use iconv library" ON) ENDIF() IF(MSVC) # This option must match the settings used in your program, in particular if you # are linking statically OPTION(STATIC_CRT "Link the static CRT libraries" ON) # If you want to embed a copy of libssh2 into libgit2, pass a # path to libssh2 OPTION(EMBED_SSH_PATH "Path to libssh2 to embed (Windows)" OFF) ENDIF() IF(WIN32) # By default, libgit2 is built with WinHTTP. To use the built-in # HTTP transport, invoke CMake with the "-DWINHTTP=OFF" argument. OPTION(WINHTTP "Use Win32 WinHTTP routines" ON) ENDIF() IF(MSVC) # Enable MSVC CRTDBG memory leak reporting when in debug mode. OPTION(MSVC_CRTDBG "Enable CRTDBG memory leak reporting" OFF) ENDIF() FILE(STRINGS "${libgit2_SOURCE_DIR}/include/git2/version.h" GIT2_HEADER REGEX "^#define LIBGIT2_VERSION \"[^\"]*\"$") STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"([0-9]+).*$" "\\1" LIBGIT2_VERSION_MAJOR "${GIT2_HEADER}") STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_VERSION_MINOR "${GIT2_HEADER}") STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_VERSION_REV "${GIT2_HEADER}") SET(LIBGIT2_VERSION_STRING "${LIBGIT2_VERSION_MAJOR}.${LIBGIT2_VERSION_MINOR}.${LIBGIT2_VERSION_REV}") FILE(STRINGS "${libgit2_SOURCE_DIR}/include/git2/version.h" GIT2_HEADER_SOVERSION REGEX "^#define LIBGIT2_SOVERSION [0-9]+$") STRING(REGEX REPLACE "^.*LIBGIT2_SOVERSION ([0-9]+)$" "\\1" LIBGIT2_SOVERSION "${GIT2_HEADER_SOVERSION}") # Ensure that we do not use deprecated functions internally ADD_DEFINITIONS(-DGIT_DEPRECATE_HARD) # Platform specific compilation flags IF (MSVC) IF (STDCALL) MESSAGE(FATAL_ERROR "The STDCALL option is no longer supported; libgit2 is now always built as a cdecl library. If you're using PInvoke, please add the CallingConventions.Cdecl attribute for support.") ENDIF() ADD_DEFINITIONS(-D_SCL_SECURE_NO_WARNINGS) ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE) STRING(REPLACE "/Zm1000" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") # /GF - String pooling # /MP - Parallel build SET(CMAKE_C_FLAGS "/GF /MP /nologo ${CMAKE_C_FLAGS}") # /Gd - explicitly set cdecl calling convention SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd") IF (STATIC_CRT) SET(CRT_FLAG_DEBUG "/MTd") SET(CRT_FLAG_RELEASE "/MT") ELSE() SET(CRT_FLAG_DEBUG "/MDd") SET(CRT_FLAG_RELEASE "/MD") ENDIF() IF (MSVC_CRTDBG) SET(GIT_MSVC_CRTDBG 1) SET(CRT_FLAG_DEBUG "${CRT_FLAG_DEBUG}") SET(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} Dbghelp.lib") ENDIF() # /Zi - Create debugging information # /Od - Disable optimization # /D_DEBUG - #define _DEBUG # /MTd - Statically link the multithreaded debug version of the CRT # /MDd - Dynamically link the multithreaded debug version of the CRT # /RTC1 - Run time checks SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Zi /Od /D_DEBUG /RTC1 ${CRT_FLAG_DEBUG}") # /DNDEBUG - Disables asserts # /MT - Statically link the multithreaded release version of the CRT # /MD - Dynamically link the multithreaded release version of the CRT # /O2 - Optimize for speed # /Oy - Enable frame pointer omission (FPO) (otherwise CMake will automatically turn it off) # /GL - Link time code generation (whole program optimization) # /Gy - Function-level linking SET(CMAKE_C_FLAGS_RELEASE "/DNDEBUG /O2 /Oy /GL /Gy ${CRT_FLAG_RELEASE}") # /Oy- - Disable frame pointer omission (FPO) SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/DNDEBUG /Zi /O2 /Oy- /GL /Gy ${CRT_FLAG_RELEASE}") # /O1 - Optimize for size SET(CMAKE_C_FLAGS_MINSIZEREL "/DNDEBUG /O1 /Oy /GL /Gy ${CRT_FLAG_RELEASE}") # /IGNORE:4221 - Ignore empty compilation units SET(CMAKE_STATIC_LINKER_FLAGS "/IGNORE:4221") # /DYNAMICBASE - Address space load randomization (ASLR) # /NXCOMPAT - Data execution prevention (DEP) # /LARGEADDRESSAWARE - >2GB user address space on x86 # /VERSION - Embed version information in PE header SET(CMAKE_EXE_LINKER_FLAGS "/DYNAMICBASE /NXCOMPAT /LARGEADDRESSAWARE /VERSION:${LIBGIT2_VERSION_MAJOR}.${LIBGIT2_VERSION_MINOR}") # /DEBUG - Create a PDB # /LTCG - Link time code generation (whole program optimization) # /OPT:REF /OPT:ICF - Fold out duplicate code at link step # /INCREMENTAL:NO - Required to use /LTCG # /DEBUGTYPE:cv,fixup - Additional data embedded in the PDB (requires /INCREMENTAL:NO, so not on for Debug) SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG") SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "/RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO") SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/DEBUG /RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO /DEBUGTYPE:cv,fixup") SET(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "/RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO") # Same linker settings for DLL as EXE SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}") SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") SET(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}") SET(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL}") ELSE () IF (ENABLE_REPRODUCIBLE_BUILDS) SET(CMAKE_C_ARCHIVE_CREATE " Dqc ") SET(CMAKE_C_ARCHIVE_APPEND " Dq ") SET(CMAKE_C_ARCHIVE_FINISH " -D ") ENDIF() SET(CMAKE_C_FLAGS "-D_GNU_SOURCE ${CMAKE_C_FLAGS}") ENABLE_WARNINGS(all) ENABLE_WARNINGS(extra) IF (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") SET(CMAKE_C_FLAGS "-D_POSIX_C_SOURCE=200112L -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS ${CMAKE_C_FLAGS}") ENDIF() SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -O0") IF (MINGW OR MSYS) # MinGW and MSYS always do PIC and complain if we tell them to STRING(REGEX REPLACE "-fPIC" "" CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS}") ELSEIF (BUILD_SHARED_LIBS) ADD_C_FLAG_IF_SUPPORTED(-fvisibility=hidden) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") ENDIF () IF (MINGW) # MinGW >= 3.14 uses the C99-style stdio functions # automatically, but forks like mingw-w64 still want # us to define this in order to use them ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO=1) ENDIF () ENABLE_WARNINGS(documentation) DISABLE_WARNINGS(missing-field-initializers) ENABLE_WARNINGS(strict-aliasing) ENABLE_WARNINGS(strict-prototypes) ENABLE_WARNINGS(declaration-after-statement) ENABLE_WARNINGS(shift-count-overflow) ENABLE_WARNINGS(unused-const-variable) ENABLE_WARNINGS(unused-function) ENABLE_WARNINGS(format) ENABLE_WARNINGS(format-security) ENABLE_WARNINGS(int-conversion) DISABLE_WARNINGS(documentation-deprecated-sync) IF (PROFILE) SET(CMAKE_C_FLAGS "-pg ${CMAKE_C_FLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-pg ${CMAKE_EXE_LINKER_FLAGS}") ENDIF () ENDIF() IF( NOT CMAKE_CONFIGURATION_TYPES ) # Build Debug by default IF (NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) ENDIF () ELSE() # Using a multi-configuration generator eg MSVC or Xcode # that uses CMAKE_CONFIGURATION_TYPES and not CMAKE_BUILD_TYPE ENDIF() IF(BUILD_FUZZERS AND NOT USE_STANDALONE_FUZZERS) # The actual sanitizer link target will be added when linking the fuzz # targets. SET(CMAKE_REQUIRED_FLAGS "-fsanitize=fuzzer-no-link") ADD_C_FLAG(-fsanitize=fuzzer-no-link) UNSET(CMAKE_REQUIRED_FLAGS) ENDIF () ADD_SUBDIRECTORY(src) # Tests IF (NOT MSVC) IF (NOT BUILD_SHARED_LIBS) SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") ENDIF() ENDIF () IF (BUILD_CLAR) ENABLE_TESTING() ADD_SUBDIRECTORY(tests) ENDIF () IF (TAGS) FIND_PROGRAM(CTAGS ctags) IF (NOT CTAGS) MESSAGE(FATAL_ERROR "Could not find ctags command") ENDIF () FILE(GLOB_RECURSE SRC_ALL *.[ch]) ADD_CUSTOM_COMMAND( OUTPUT tags COMMAND ${CTAGS} -a ${SRC_ALL} DEPENDS ${SRC_ALL} ) ADD_CUSTOM_TARGET( do_tags ALL DEPENDS tags ) ENDIF () IF (BUILD_EXAMPLES) ADD_SUBDIRECTORY(examples) ENDIF () IF(BUILD_FUZZERS) IF(NOT USE_STANDALONE_FUZZERS) IF(BUILD_EXAMPLES) MESSAGE(FATAL_ERROR "Cannot build the fuzzer targets and the examples together") ENDIF() IF(BUILD_CLAR) MESSAGE(FATAL_ERROR "Cannot build the fuzzer targets and the tests together") ENDIF() ENDIF() ADD_SUBDIRECTORY(fuzzers) ENDIF() IF(CMAKE_VERSION VERSION_GREATER 3) FEATURE_SUMMARY(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:") FEATURE_SUMMARY(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:") ELSE() PRINT_ENABLED_FEATURES() PRINT_DISABLED_FEATURES() ENDIF()