]> git.proxmox.com Git - libgit2.git/blame - CMakeLists.txt
Prep for unstable release
[libgit2.git] / CMakeLists.txt
CommitLineData
583cf169 1# CMake build script for the libgit2 project
73c46d53 2#
bfe0658e 3# Building (out of source build):
73c46d53 4# > mkdir build && cd build
bfe0658e
PD
5# > cmake .. [-DSETTINGS=VALUE]
6# > cmake --build .
932d1baf 7#
73c46d53
PD
8# Testing:
9# > ctest -V
10#
11# Install:
bfe0658e 12# > cmake --build . --target install
73c46d53 13
583cf169 14PROJECT(libgit2 C)
0c9c969a 15CMAKE_MINIMUM_REQUIRED(VERSION 3.5.1)
8f426d7d 16CMAKE_POLICY(SET CMP0015 NEW)
ac3d33df 17IF(POLICY CMP0051)
eae0bfdc
PP
18 CMAKE_POLICY(SET CMP0051 NEW)
19ENDIF()
ac3d33df 20IF(POLICY CMP0042)
eae0bfdc
PP
21 CMAKE_POLICY(SET CMP0042 NEW)
22ENDIF()
ac3d33df
JK
23IF(POLICY CMP0054)
24 CMAKE_POLICY(SET CMP0054 NEW)
25ENDIF()
583cf169 26
7a6e0281 27# Add find modules to the path
eae0bfdc 28SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${libgit2_SOURCE_DIR}/cmake/Modules/")
7369b3c3 29
5bda607c 30INCLUDE(CheckLibraryExists)
8649dfd8 31INCLUDE(CheckFunctionExists)
ab96ca55 32INCLUDE(CheckSymbolExists)
e9e6df2c 33INCLUDE(CheckStructHasMember)
6c7cee42 34INCLUDE(CheckPrototypeDefinition) # Added in CMake 3.0
5c8d5eac 35INCLUDE(AddCFlagIfSupported)
4b3ec53c 36INCLUDE(FindPkgLibraries)
eae0bfdc
PP
37INCLUDE(FindThreads)
38INCLUDE(FindStatNsec)
39INCLUDE(IdeSplitSources)
40INCLUDE(FeatureSummary)
41INCLUDE(EnableWarnings)
5bda607c 42
19a766a2
SC
43# Build options
44#
ac3d33df
JK
45OPTION(SONAME "Set the (SO)VERSION of the target" ON)
46OPTION(BUILD_SHARED_LIBS "Build Shared Library (OFF for Static)" ON)
47OPTION(THREADSAFE "Build libgit2 as threadsafe" ON)
48OPTION(BUILD_CLAR "Build Tests using the Clar suite" ON)
49OPTION(BUILD_EXAMPLES "Build library usage example apps" OFF)
50OPTION(BUILD_FUZZERS "Build the fuzz targets" OFF)
51OPTION(TAGS "Generate tags" OFF)
52OPTION(PROFILE "Generate profiling information" OFF)
0c9c969a 53OPTION(ENABLE_TRACE "Enables tracing support" ON)
ac3d33df 54OPTION(LIBGIT2_FILENAME "Name of the produced binary" OFF)
ac3d33df
JK
55OPTION(USE_SSH "Link with libssh2 to enable SSH support" ON)
56OPTION(USE_HTTPS "Enable HTTPS support. Can be set to a specific backend" ON)
0c9c969a 57OPTION(USE_SHA1 "Enable SHA1. Can be set to CollisionDetection(ON)/HTTPS/Generic" ON)
ac3d33df
JK
58OPTION(USE_GSSAPI "Link with libgssapi for SPNEGO auth" OFF)
59OPTION(USE_STANDALONE_FUZZERS "Enable standalone fuzzers (compatible with gcc)" OFF)
0c9c969a 60OPTION(USE_LEAK_CHECKER "Run tests with leak checker" OFF)
ac3d33df
JK
61OPTION(DEBUG_POOL "Enable debug pool allocator" OFF)
62OPTION(ENABLE_WERROR "Enable compilation with -Werror" OFF)
63OPTION(USE_BUNDLED_ZLIB "Use the bundled version of zlib" OFF)
0c9c969a 64 SET(USE_HTTP_PARSER "" CACHE STRING "Specifies the HTTP Parser implementation; either system or builtin.")
ac3d33df 65OPTION(DEPRECATE_HARD "Do not include deprecated functions in the library" OFF)
0c9c969a
UG
66 SET(REGEX_BACKEND "" CACHE STRING "Regular expression implementation. One of regcomp_l, pcre2, pcre, regcomp, or builtin.")
67
68IF (UNIX)
69 IF (NOT USE_HTTPS)
70 OPTION(USE_NTLMCLIENT "Enable NTLM support on Unix." OFF )
71 ELSE()
72 OPTION(USE_NTLMCLIENT "Enable NTLM support on Unix." ON )
73 ENDIF()
74ENDIF()
ed0571f8 75
eae0bfdc 76IF (UNIX AND NOT APPLE)
ac3d33df 77 OPTION(ENABLE_REPRODUCIBLE_BUILDS "Enable reproducible builds" OFF)
ed0571f8 78ENDIF()
73291aff 79
eae0bfdc 80IF (APPLE)
ac3d33df 81 OPTION(USE_ICONV "Link with and use iconv library" ON)
92dac975 82ENDIF()
82b2fc2c 83
19a766a2 84IF(MSVC)
08f32085
Q
85 # This option must match the settings used in your program, in particular if you
86 # are linking statically
ac3d33df 87 OPTION(STATIC_CRT "Link the static CRT libraries" ON)
1bfe7133 88
01fe8374
CMN
89 # If you want to embed a copy of libssh2 into libgit2, pass a
90 # path to libssh2
ac3d33df 91 OPTION(EMBED_SSH_PATH "Path to libssh2 to embed (Windows)" OFF)
19a766a2
SC
92ENDIF()
93
6bb54cbf 94
8f426d7d
PK
95IF(WIN32)
96 # By default, libgit2 is built with WinHTTP. To use the built-in
97 # HTTP transport, invoke CMake with the "-DWINHTTP=OFF" argument.
ac3d33df 98 OPTION(WINHTTP "Use Win32 WinHTTP routines" ON)
8f426d7d
PK
99ENDIF()
100
d06c589f
JH
101IF(MSVC)
102 # Enable MSVC CRTDBG memory leak reporting when in debug mode.
ac3d33df 103 OPTION(MSVC_CRTDBG "Enable CRTDBG memory leak reporting" OFF)
d06c589f
JH
104ENDIF()
105
eae0bfdc 106FILE(STRINGS "${libgit2_SOURCE_DIR}/include/git2/version.h" GIT2_HEADER REGEX "^#define LIBGIT2_VERSION \"[^\"]*\"$")
9d1dcca2
VM
107
108STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"([0-9]+).*$" "\\1" LIBGIT2_VERSION_MAJOR "${GIT2_HEADER}")
109STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_VERSION_MINOR "${GIT2_HEADER}")
110STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_VERSION_REV "${GIT2_HEADER}")
111SET(LIBGIT2_VERSION_STRING "${LIBGIT2_VERSION_MAJOR}.${LIBGIT2_VERSION_MINOR}.${LIBGIT2_VERSION_REV}")
112
0c9c969a
UG
113FILE(STRINGS "${libgit2_SOURCE_DIR}/include/git2/version.h" GIT2_HEADER_SOVERSION REGEX "^#define LIBGIT2_SOVERSION \"([0-9.]+)\"$")
114STRING(REGEX REPLACE "^.*LIBGIT2_SOVERSION \"([0-9.]+)\"$" "\\1" LIBGIT2_SOVERSION "${GIT2_HEADER_SOVERSION}")
99807672 115
ac3d33df
JK
116IF (DEPRECATE_HARD)
117 ADD_DEFINITIONS(-DGIT_DEPRECATE_HARD)
118ENDIF()
119
502dd2da 120# Platform specific compilation flags
dcd62cb2 121IF (MSVC)
ac3d33df
JK
122 IF (STDCALL)
123 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.")
124 ENDIF()
125
eae0bfdc
PP
126 ADD_DEFINITIONS(-D_SCL_SECURE_NO_WARNINGS)
127 ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE)
128 ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
dcd62cb2 129
ccf1a2ba 130 STRING(REPLACE "/Zm1000" " " CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
94155e2f 131
19be3f9e
PK
132 # /GF - String pooling
133 # /MP - Parallel build
134 SET(CMAKE_C_FLAGS "/GF /MP /nologo ${CMAKE_C_FLAGS}")
135
ac3d33df
JK
136 # /Gd - explicitly set cdecl calling convention
137 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Gd")
19be3f9e 138
08f32085
Q
139 IF (STATIC_CRT)
140 SET(CRT_FLAG_DEBUG "/MTd")
141 SET(CRT_FLAG_RELEASE "/MT")
142 ELSE()
ccf1a2ba 143 SET(CRT_FLAG_DEBUG "/MDd")
08f32085
Q
144 SET(CRT_FLAG_RELEASE "/MD")
145 ENDIF()
146
d06c589f 147 IF (MSVC_CRTDBG)
eae0bfdc
PP
148 SET(GIT_MSVC_CRTDBG 1)
149 SET(CRT_FLAG_DEBUG "${CRT_FLAG_DEBUG}")
150 SET(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} Dbghelp.lib")
d06c589f
JH
151 ENDIF()
152
19be3f9e
PK
153 # /Zi - Create debugging information
154 # /Od - Disable optimization
155 # /D_DEBUG - #define _DEBUG
156 # /MTd - Statically link the multithreaded debug version of the CRT
08f32085 157 # /MDd - Dynamically link the multithreaded debug version of the CRT
19be3f9e 158 # /RTC1 - Run time checks
08f030ce 159 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Zi /Od /D_DEBUG /RTC1 ${CRT_FLAG_DEBUG}")
19be3f9e 160
69c28b75 161 # /DNDEBUG - Disables asserts
19be3f9e 162 # /MT - Statically link the multithreaded release version of the CRT
08f32085 163 # /MD - Dynamically link the multithreaded release version of the CRT
19be3f9e
PK
164 # /O2 - Optimize for speed
165 # /Oy - Enable frame pointer omission (FPO) (otherwise CMake will automatically turn it off)
166 # /GL - Link time code generation (whole program optimization)
167 # /Gy - Function-level linking
08f32085 168 SET(CMAKE_C_FLAGS_RELEASE "/DNDEBUG /O2 /Oy /GL /Gy ${CRT_FLAG_RELEASE}")
19be3f9e
PK
169
170 # /Oy- - Disable frame pointer omission (FPO)
08f32085 171 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/DNDEBUG /Zi /O2 /Oy- /GL /Gy ${CRT_FLAG_RELEASE}")
19be3f9e
PK
172
173 # /O1 - Optimize for size
08f32085 174 SET(CMAKE_C_FLAGS_MINSIZEREL "/DNDEBUG /O1 /Oy /GL /Gy ${CRT_FLAG_RELEASE}")
19be3f9e 175
ac3d33df
JK
176 # /IGNORE:4221 - Ignore empty compilation units
177 SET(CMAKE_STATIC_LINKER_FLAGS "/IGNORE:4221")
178
19be3f9e
PK
179 # /DYNAMICBASE - Address space load randomization (ASLR)
180 # /NXCOMPAT - Data execution prevention (DEP)
181 # /LARGEADDRESSAWARE - >2GB user address space on x86
182 # /VERSION - Embed version information in PE header
183 SET(CMAKE_EXE_LINKER_FLAGS "/DYNAMICBASE /NXCOMPAT /LARGEADDRESSAWARE /VERSION:${LIBGIT2_VERSION_MAJOR}.${LIBGIT2_VERSION_MINOR}")
184
185 # /DEBUG - Create a PDB
186 # /LTCG - Link time code generation (whole program optimization)
187 # /OPT:REF /OPT:ICF - Fold out duplicate code at link step
188 # /INCREMENTAL:NO - Required to use /LTCG
189 # /DEBUGTYPE:cv,fixup - Additional data embedded in the PDB (requires /INCREMENTAL:NO, so not on for Debug)
190 SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG")
191 SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "/RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO")
192 SET(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/DEBUG /RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO /DEBUGTYPE:cv,fixup")
193 SET(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "/RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO")
194
195 # Same linker settings for DLL as EXE
196 SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
197 SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
198 SET(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
199 SET(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}")
200 SET(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL}")
e233fa6f 201ELSE ()
eae0bfdc
PP
202 IF (ENABLE_REPRODUCIBLE_BUILDS)
203 SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Dqc <TARGET> <LINK_FLAGS> <OBJECTS>")
204 SET(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> Dq <TARGET> <LINK_FLAGS> <OBJECTS>")
205 SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")
206 ENDIF()
207
a02e8a38
PS
208 SET(CMAKE_C_FLAGS "-D_GNU_SOURCE ${CMAKE_C_FLAGS}")
209
eae0bfdc
PP
210 ENABLE_WARNINGS(all)
211 ENABLE_WARNINGS(extra)
19be3f9e 212
98b8fcff 213 IF (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)")
ac3d33df 214 SET(CMAKE_C_FLAGS "-D_POSIX_C_SOURCE=200112L -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS ${CMAKE_C_FLAGS}")
98b8fcff
JG
215 ENDIF()
216
a64532e1 217 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG -O0")
19be3f9e 218
b6a2fd0e 219 IF (MINGW OR MSYS) # MinGW and MSYS always do PIC and complain if we tell them to
2eb18449 220 STRING(REGEX REPLACE "-fPIC" "" CMAKE_SHARED_LIBRARY_C_FLAGS "${CMAKE_SHARED_LIBRARY_C_FLAGS}")
b41e24a6 221 ELSEIF (BUILD_SHARED_LIBS)
5c8d5eac 222 ADD_C_FLAG_IF_SUPPORTED(-fvisibility=hidden)
c6cd3f8b
JG
223
224 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
39cdf272 225 ENDIF ()
c6cd3f8b 226
b6a2fd0e
PS
227 IF (MINGW)
228 # MinGW >= 3.14 uses the C99-style stdio functions
229 # automatically, but forks like mingw-w64 still want
230 # us to define this in order to use them
231 ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO=1)
232 ENDIF ()
233
eae0bfdc
PP
234 ENABLE_WARNINGS(documentation)
235 DISABLE_WARNINGS(missing-field-initializers)
236 ENABLE_WARNINGS(strict-aliasing)
237 ENABLE_WARNINGS(strict-prototypes)
238 ENABLE_WARNINGS(declaration-after-statement)
239 ENABLE_WARNINGS(shift-count-overflow)
ac3d33df
JK
240 ENABLE_WARNINGS(unused-const-variable)
241 ENABLE_WARNINGS(unused-function)
6c7cee42 242 ENABLE_WARNINGS(int-conversion)
0c9c969a
UG
243
244 # MinGW uses gcc, which expects POSIX formatting for printf, but
245 # uses the Windows C library, which uses its own format specifiers.
246 # Disable format specifier warnings.
247 IF(MINGW)
248 DISABLE_WARNINGS(format)
249 DISABLE_WARNINGS(format-security)
250 ELSE()
251 ENABLE_WARNINGS(format)
252 ENABLE_WARNINGS(format-security)
253 ENDIF()
254
255 IF("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
256 DISABLE_WARNINGS(documentation-deprecated-sync)
257 ENDIF()
823c0e9c 258
706a9974
RB
259 IF (PROFILE)
260 SET(CMAKE_C_FLAGS "-pg ${CMAKE_C_FLAGS}")
261 SET(CMAKE_EXE_LINKER_FLAGS "-pg ${CMAKE_EXE_LINKER_FLAGS}")
262 ENDIF ()
90412507 263ENDIF()
5b8bb8e7 264
0c9c969a
UG
265# Ensure that MinGW provides the correct header files.
266IF (WIN32 AND NOT CYGWIN)
267 ADD_DEFINITIONS(-DWIN32 -D_WIN32_WINNT=0x0600)
268ENDIF()
269
88149fae
PT
270IF( NOT CMAKE_CONFIGURATION_TYPES )
271 # Build Debug by default
272 IF (NOT CMAKE_BUILD_TYPE)
273 SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
274 ENDIF ()
275ELSE()
276 # Using a multi-configuration generator eg MSVC or Xcode
277 # that uses CMAKE_CONFIGURATION_TYPES and not CMAKE_BUILD_TYPE
278ENDIF()
583cf169 279
ac3d33df
JK
280IF(BUILD_FUZZERS AND NOT USE_STANDALONE_FUZZERS)
281 # The actual sanitizer link target will be added when linking the fuzz
282 # targets.
283 SET(CMAKE_REQUIRED_FLAGS "-fsanitize=fuzzer-no-link")
284 ADD_C_FLAG(-fsanitize=fuzzer-no-link)
285 UNSET(CMAKE_REQUIRED_FLAGS)
286ENDIF ()
287
eae0bfdc 288ADD_SUBDIRECTORY(src)
678e9e04 289
eae0bfdc
PP
290# Tests
291IF (NOT MSVC)
292 IF (NOT BUILD_SHARED_LIBS)
293 SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
294 ENDIF()
73aaf674
BS
295ENDIF ()
296
3fd1520c 297IF (BUILD_CLAR)
f1558d9b 298 ENABLE_TESTING()
eae0bfdc 299 ADD_SUBDIRECTORY(tests)
f1558d9b 300ENDIF ()
e632f687
CB
301
302IF (TAGS)
303 FIND_PROGRAM(CTAGS ctags)
304 IF (NOT CTAGS)
48ce93e0 305 MESSAGE(FATAL_ERROR "Could not find ctags command")
e632f687
CB
306 ENDIF ()
307
308 FILE(GLOB_RECURSE SRC_ALL *.[ch])
309
310 ADD_CUSTOM_COMMAND(
311 OUTPUT tags
312 COMMAND ${CTAGS} -a ${SRC_ALL}
313 DEPENDS ${SRC_ALL}
314 )
315 ADD_CUSTOM_TARGET(
316 do_tags ALL
317 DEPENDS tags
318 )
319ENDIF ()
62986ff6
SG
320
321IF (BUILD_EXAMPLES)
60ee53df 322 ADD_SUBDIRECTORY(examples)
583cf169 323ENDIF ()
eae0bfdc 324
ac3d33df
JK
325IF(BUILD_FUZZERS)
326 IF(NOT USE_STANDALONE_FUZZERS)
327 IF(BUILD_EXAMPLES)
328 MESSAGE(FATAL_ERROR "Cannot build the fuzzer targets and the examples together")
329 ENDIF()
330 IF(BUILD_CLAR)
331 MESSAGE(FATAL_ERROR "Cannot build the fuzzer targets and the tests together")
332 ENDIF()
333 ENDIF()
334 ADD_SUBDIRECTORY(fuzzers)
335ENDIF()
336
0c9c969a
UG
337FEATURE_SUMMARY(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:")
338FEATURE_SUMMARY(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:")