CMakeLists.txt 11.6 KB
Newer Older
1
# CMake build script for the libgit2 project
2
#
3
# Building (out of source build):
4
# > mkdir build && cd build
5 6
# > cmake .. [-DSETTINGS=VALUE]
# > cmake --build .
7
#
8 9 10 11
# Testing:
# > ctest -V
#
# Install:
12
# > cmake --build . --target install
13

14
PROJECT(libgit2 C)
15
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)
16
CMAKE_POLICY(SET CMP0015 NEW)
17
IF(POLICY CMP0051)
18 19
	CMAKE_POLICY(SET CMP0051 NEW)
ENDIF()
20
IF(POLICY CMP0042)
21 22
	CMAKE_POLICY(SET CMP0042 NEW)
ENDIF()
23 24 25
IF(POLICY CMP0054)
	CMAKE_POLICY(SET CMP0054 NEW)
ENDIF()
26

27
# Add find modules to the path
28
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${libgit2_SOURCE_DIR}/cmake/Modules/")
Brad Morgan committed
29

30
INCLUDE(CheckLibraryExists)
31
INCLUDE(CheckFunctionExists)
32
INCLUDE(CheckSymbolExists)
33
INCLUDE(CheckStructHasMember)
34
INCLUDE(CheckPrototypeDefinition) # Added in CMake 3.0
35
INCLUDE(AddCFlagIfSupported)
36
INCLUDE(FindPkgLibraries)
37
INCLUDE(FindThreads)
38
INCLUDE(FindStatNsec)
39
INCLUDE(IdeSplitSources)
40
INCLUDE(FeatureSummary)
41
INCLUDE(EnableWarnings)
42

43 44
# Build options
#
45 46 47 48 49 50 51 52 53 54
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)
55
OPTION(USE_SSH				"Link with libssh2 to enable SSH support"		 ON)
56
OPTION(USE_HTTPS			"Enable HTTPS support. Can be set to a specific backend" ON)
57
OPTION(USE_SHA1				"Enable SHA1. Can be set to CollisionDetection(ON)/HTTPS/Generic" ON)
58 59 60 61 62 63
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(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)
64
   SET(USE_HTTP_PARSER			"" CACHE STRING "Specifies the HTTP Parser implementation; either system or builtin.")
65
OPTION(DEPRECATE_HARD			"Do not include deprecated functions in the library"	OFF)
66
   SET(REGEX_BACKEND			"" CACHE STRING "Regular expression implementation. One of regcomp_l, pcre2, pcre, regcomp, or builtin.")
67

68
IF (UNIX)
69 70 71 72 73
	IF (NOT USE_HTTPS)
	    OPTION(USE_NTLMCLIENT		"Enable NTLM support on Unix."				OFF )
	ELSE()
	    OPTION(USE_NTLMCLIENT		"Enable NTLM support on Unix."				ON )
	ENDIF()
74 75
ENDIF()

76
IF (UNIX AND NOT APPLE)
77
	OPTION(ENABLE_REPRODUCIBLE_BUILDS "Enable reproducible builds"				OFF)
78
ENDIF()
79 80

IF (APPLE)
81
	OPTION(USE_ICONV		"Link with and use iconv library"			 ON)
82
ENDIF()
83

84
IF(MSVC)
85 86
	# This option must match the settings used in your program, in particular if you
	# are linking statically
87
	OPTION(STATIC_CRT		"Link the static CRT libraries"		 		 ON)
88

89 90
	# If you want to embed a copy of libssh2 into libgit2, pass a
	# path to libssh2
91
	OPTION(EMBED_SSH_PATH		"Path to libssh2 to embed (Windows)"			OFF)
92 93
ENDIF()

94

95 96 97
IF(WIN32)
	# By default, libgit2 is built with WinHTTP.  To use the built-in
	# HTTP transport, invoke CMake with the "-DWINHTTP=OFF" argument.
98
	OPTION(WINHTTP			"Use Win32 WinHTTP routines"				 ON)
99 100
ENDIF()

101 102
IF(MSVC)
	# Enable MSVC CRTDBG memory leak reporting when in debug mode.
103
	OPTION(MSVC_CRTDBG 		"Enable CRTDBG memory leak reporting"			OFF)
104 105
ENDIF()

106
FILE(STRINGS "${libgit2_SOURCE_DIR}/include/git2/version.h" GIT2_HEADER REGEX "^#define LIBGIT2_VERSION \"[^\"]*\"$")
107 108 109 110 111 112

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}")

113
FILE(STRINGS "${libgit2_SOURCE_DIR}/include/git2/version.h" GIT2_HEADER_SOVERSION REGEX "^#define LIBGIT2_SOVERSION [0-9]+$")
114 115
STRING(REGEX REPLACE "^.*LIBGIT2_SOVERSION ([0-9]+)$" "\\1" LIBGIT2_SOVERSION "${GIT2_HEADER_SOVERSION}")

116 117 118 119
IF (DEPRECATE_HARD)
	ADD_DEFINITIONS(-DGIT_DEPRECATE_HARD)
ENDIF()

120 121
# Platform specific compilation flags
IF (MSVC)
122 123 124 125
	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()

126 127 128 129 130 131 132 133 134 135
	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}")

136 137
	# /Gd - explicitly set cdecl calling convention
	SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
138 139 140 141 142 143 144 145 146 147 148 149

	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}")
150
		SET(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} Dbghelp.lib")
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
	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}")

176 177 178
	# /IGNORE:4221 - Ignore empty compilation units
	SET(CMAKE_STATIC_LINKER_FLAGS "/IGNORE:4221")

179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
	# /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 ()
202 203 204 205 206 207
	IF (ENABLE_REPRODUCIBLE_BUILDS)
		SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Dqc <TARGET> <LINK_FLAGS> <OBJECTS>")
		SET(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> Dq  <TARGET> <LINK_FLAGS> <OBJECTS>")
		SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
	ENDIF()

208 209
	SET(CMAKE_C_FLAGS "-D_GNU_SOURCE ${CMAKE_C_FLAGS}")

210 211
	ENABLE_WARNINGS(all)
	ENABLE_WARNINGS(extra)
212 213

	IF (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)")
214
		SET(CMAKE_C_FLAGS "-D_POSIX_C_SOURCE=200112L -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS ${CMAKE_C_FLAGS}")
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
	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 ()

234 235
	ENABLE_WARNINGS(documentation)
	DISABLE_WARNINGS(missing-field-initializers)
236
	ENABLE_WARNINGS(strict-aliasing)
237 238
	ENABLE_WARNINGS(strict-prototypes)
	ENABLE_WARNINGS(declaration-after-statement)
239
	ENABLE_WARNINGS(shift-count-overflow)
240
	ENABLE_WARNINGS(unused-const-variable)
241
	ENABLE_WARNINGS(unused-function)
242
	ENABLE_WARNINGS(int-conversion)
243 244 245 246 247 248 249 250 251 252 253

	# MinGW uses gcc, which expects POSIX formatting for printf, but
	# uses the Windows C library, which uses its own format specifiers.
	# Disable format specifier warnings.
	IF(MINGW)
		DISABLE_WARNINGS(format)
		DISABLE_WARNINGS(format-security)
	ELSE()
		ENABLE_WARNINGS(format)
		ENABLE_WARNINGS(format-security)
	ENDIF()
254

255 256 257 258
	IF("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
		DISABLE_WARNINGS(documentation-deprecated-sync)
	ENDIF()

259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
	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()

275 276 277
IF(BUILD_FUZZERS AND NOT USE_STANDALONE_FUZZERS)
	# The actual sanitizer link target will be added when linking the fuzz
	# targets.
278 279 280
	SET(CMAKE_REQUIRED_FLAGS "-fsanitize=fuzzer-no-link")
	ADD_C_FLAG(-fsanitize=fuzzer-no-link)
	UNSET(CMAKE_REQUIRED_FLAGS)
281 282
ENDIF ()

283
ADD_SUBDIRECTORY(src)
284 285

# Tests
286 287 288 289 290 291
IF (NOT MSVC)
   IF (NOT BUILD_SHARED_LIBS)
       SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
   ENDIF()
ENDIF ()

292
IF (BUILD_CLAR)
Vicent Marti committed
293
	ENABLE_TESTING()
294
	ADD_SUBDIRECTORY(tests)
Vicent Marti committed
295
ENDIF ()
Clemens Buchacher committed
296 297 298 299

IF (TAGS)
	FIND_PROGRAM(CTAGS ctags)
	IF (NOT CTAGS)
300
		MESSAGE(FATAL_ERROR "Could not find ctags command")
Clemens Buchacher committed
301 302 303 304 305 306 307 308 309 310 311 312 313 314
	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 ()
315 316

IF (BUILD_EXAMPLES)
317
	ADD_SUBDIRECTORY(examples)
318
ENDIF ()
319

320 321 322 323 324 325 326 327 328
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()
329
	ADD_SUBDIRECTORY(fuzzers)
330 331
ENDIF()

332
IF(CMAKE_VERSION VERSION_GREATER 3)
333 334
	FEATURE_SUMMARY(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:")
	FEATURE_SUMMARY(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:")
335 336 337 338
ELSE()
	PRINT_ENABLED_FEATURES()
	PRINT_DISABLED_FEATURES()
ENDIF()