4 ADD_FEATURE_INFO(debugpool GIT_DEBUG_POOL "debug pool allocator")
6 INCLUDE(PkgBuildConfig)
8 # This variable will contain the libraries we need to put into
9 # libgit2.pc's Requires.private. That is, what we're linking to or
10 # what someone who's statically linking us needs to link to.
11 SET(LIBGIT2_PC_REQUIRES "")
12 # This will be set later if we use the system's http-parser library or
13 # use iconv (OSX) and will be written to the Libs.private field in the
15 SET(LIBGIT2_PC_LIBS "")
18 "${CMAKE_CURRENT_BINARY_DIR}"
19 "${libgit2_SOURCE_DIR}/src"
20 "${libgit2_SOURCE_DIR}/include")
21 SET(LIBGIT2_SYSTEM_INCLUDES "")
26 SET(BIN_INSTALL_DIR bin CACHE PATH "Where to install binaries to.")
27 SET(LIB_INSTALL_DIR lib CACHE PATH "Where to install libraries to.")
28 SET(INCLUDE_INSTALL_DIR include CACHE PATH "Where to install headers to.")
31 IF (ENABLE_TRACE STREQUAL "ON")
34 ADD_FEATURE_INFO(tracing GIT_TRACE "tracing support")
36 CHECK_FUNCTION_EXISTS(futimens HAVE_FUTIMENS)
38 SET(GIT_USE_FUTIMENS 1)
41 CHECK_PROTOTYPE_DEFINITION(qsort_r
42 "void qsort_r(void *base, size_t nmemb, size_t size, void *thunk, int (*compar)(void *, const void *, const void *))"
43 "" "stdlib.h" HAVE_QSORT_R_BSD)
45 ADD_DEFINITIONS(-DHAVE_QSORT_R_BSD)
48 CHECK_PROTOTYPE_DEFINITION(qsort_r
49 "void qsort_r(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, void *), void *arg)"
50 "" "stdlib.h" HAVE_QSORT_R_GNU)
52 ADD_DEFINITIONS(-DHAVE_QSORT_R_GNU)
55 CHECK_FUNCTION_EXISTS(qsort_s HAVE_QSORT_S)
57 ADD_DEFINITIONS(-DHAVE_QSORT_S)
60 # Find required dependencies
63 LIST(APPEND LIBGIT2_LIBS ws2_32)
64 ELSEIF(CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)")
65 LIST(APPEND LIBGIT2_LIBS socket nsl)
66 LIST(APPEND LIBGIT2_PC_LIBS "-lsocket" "-lnsl")
67 ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Haiku")
68 LIST(APPEND LIBGIT2_LIBS network)
69 LIST(APPEND LIBGIT2_PC_LIBS "-lnetwork")
72 CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" NEED_LIBRT)
74 LIST(APPEND LIBGIT2_LIBS rt)
75 LIST(APPEND LIBGIT2_PC_LIBS "-lrt")
79 LIST(APPEND LIBGIT2_LIBS ${CMAKE_THREAD_LIBS_INIT})
80 LIST(APPEND LIBGIT2_PC_LIBS ${CMAKE_THREAD_LIBS_INIT})
82 ADD_FEATURE_INFO(threadsafe THREADSAFE "threadsafe support")
85 IF (WIN32 AND EMBED_SSH_PATH)
86 FILE(GLOB SRC_SSH "${EMBED_SSH_PATH}/src/*.c")
87 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES "${EMBED_SSH_PATH}/include")
88 FILE(WRITE "${EMBED_SSH_PATH}/src/libssh2_config.h" "#define HAVE_WINCNG\n#define LIBSSH2_WINCNG\n#include \"../win32/libssh2_config.h\"")
92 IF (WIN32 AND WINHTTP)
95 # Since MinGW does not come with headers or an import library for winhttp,
96 # we have to include a private header and generate our own import library
98 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/winhttp" "${libgit2_BINARY_DIR}/deps/winhttp")
99 LIST(APPEND LIBGIT2_LIBS winhttp)
100 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/winhttp")
102 LIST(APPEND LIBGIT2_LIBS "winhttp")
103 LIST(APPEND LIBGIT2_PC_LIBS "-lwinhttp")
106 LIST(APPEND LIBGIT2_LIBS "rpcrt4" "crypt32" "ole32")
107 LIST(APPEND LIBGIT2_PC_LIBS "-lrpcrt4" "-lcrypt32" "-lole32")
110 Include(SelectHTTPSBackend)
111 Include(SelectHashes)
113 # Specify regular expression implementation
116 IF(REGEX_BACKEND STREQUAL "")
117 CHECK_SYMBOL_EXISTS(regcomp_l "regex.h;xlocale.h" HAVE_REGCOMP_L)
120 SET(REGEX_BACKEND "regcomp_l")
122 SET(REGEX_BACKEND "pcre")
124 SET(REGEX_BACKEND "builtin")
128 IF(REGEX_BACKEND STREQUAL "regcomp_l")
129 ADD_FEATURE_INFO(regex ON "using system regcomp_l")
130 SET(GIT_REGEX_REGCOMP_L 1)
131 ELSEIF(REGEX_BACKEND STREQUAL "pcre2")
135 MESSAGE(FATAL_ERROR "PCRE2 support was requested but not found")
138 ADD_FEATURE_INFO(regex ON "using system PCRE2")
139 SET(GIT_REGEX_PCRE2 1)
141 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${PCRE2_INCLUDE_DIRS})
142 LIST(APPEND LIBGIT2_LIBS ${PCRE2_LIBRARIES})
143 LIST(APPEND LIBGIT2_PC_REQUIRES "libpcre2")
144 ELSEIF(REGEX_BACKEND STREQUAL "pcre")
145 ADD_FEATURE_INFO(regex ON "using system PCRE")
146 SET(GIT_REGEX_PCRE 1)
148 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${PCRE_INCLUDE_DIRS})
149 LIST(APPEND LIBGIT2_LIBS ${PCRE_LIBRARIES})
150 LIST(APPEND LIBGIT2_PC_REQUIRES "libpcre")
151 ELSEIF(REGEX_BACKEND STREQUAL "regcomp")
152 ADD_FEATURE_INFO(regex ON "using system regcomp")
153 SET(GIT_REGEX_REGCOMP 1)
154 ELSEIF(REGEX_BACKEND STREQUAL "builtin")
155 ADD_FEATURE_INFO(regex ON "using bundled PCRE")
156 SET(GIT_REGEX_BUILTIN 1)
158 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/pcre" "${libgit2_BINARY_DIR}/deps/pcre")
159 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/pcre")
160 LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:pcre>)
162 MESSAGE(FATAL_ERROR "The REGEX_BACKEND option provided is not supported")
165 # Optional external dependency: http-parser
166 IF(USE_HTTP_PARSER STREQUAL "system")
167 FIND_PACKAGE(HTTP_Parser)
169 IF (HTTP_PARSER_FOUND AND HTTP_PARSER_VERSION_MAJOR EQUAL 2)
170 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${HTTP_PARSER_INCLUDE_DIRS})
171 LIST(APPEND LIBGIT2_LIBS ${HTTP_PARSER_LIBRARIES})
172 LIST(APPEND LIBGIT2_PC_LIBS "-lhttp_parser")
173 ADD_FEATURE_INFO(http-parser ON "http-parser support (system)")
175 MESSAGE(FATAL_ERROR "http-parser support was requested but not found")
178 MESSAGE(STATUS "http-parser version 2 was not found or disabled; using bundled 3rd-party sources.")
179 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/http-parser" "${libgit2_BINARY_DIR}/deps/http-parser")
180 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/http-parser")
181 LIST(APPEND LIBGIT2_OBJECTS "$<TARGET_OBJECTS:http-parser>")
182 ADD_FEATURE_INFO(http-parser ON "http-parser support (bundled)")
185 # Optional external dependency: zlib
186 IF(NOT USE_BUNDLED_ZLIB)
189 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${ZLIB_INCLUDE_DIRS})
190 LIST(APPEND LIBGIT2_LIBS ${ZLIB_LIBRARIES})
191 IF(APPLE OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
192 LIST(APPEND LIBGIT2_PC_LIBS "-lz")
194 LIST(APPEND LIBGIT2_PC_REQUIRES "zlib")
196 ADD_FEATURE_INFO(zlib ON "using system zlib")
198 MESSAGE(STATUS "zlib was not found; using bundled 3rd-party sources." )
201 IF(USE_BUNDLED_ZLIB OR NOT ZLIB_FOUND)
202 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/zlib" "${libgit2_BINARY_DIR}/deps/zlib")
203 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/zlib")
204 LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:zlib>)
205 ADD_FEATURE_INFO(zlib ON "using bundled zlib")
208 # Optional external dependency: libssh2
210 FIND_PKGLIBRARIES(LIBSSH2 libssh2)
214 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${LIBSSH2_INCLUDE_DIRS})
215 LIST(APPEND LIBGIT2_LIBS ${LIBSSH2_LIBRARIES})
216 LIST(APPEND LIBGIT2_PC_LIBS ${LIBSSH2_LDFLAGS})
218 CHECK_LIBRARY_EXISTS("${LIBSSH2_LIBRARIES}" libssh2_userauth_publickey_frommemory "${LIBSSH2_LIBRARY_DIRS}" HAVE_LIBSSH2_MEMORY_CREDENTIALS)
219 IF (HAVE_LIBSSH2_MEMORY_CREDENTIALS)
220 SET(GIT_SSH_MEMORY_CREDENTIALS 1)
223 MESSAGE(STATUS "LIBSSH2 not found. Set CMAKE_PREFIX_PATH if it is installed outside of the default search path.")
225 ADD_FEATURE_INFO(SSH GIT_SSH "SSH transport support")
227 # Optional external dependency: ntlmclient
230 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/ntlmclient" "${libgit2_BINARY_DIR}/deps/ntlmclient")
231 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/ntlmclient")
232 LIST(APPEND LIBGIT2_OBJECTS "$<TARGET_OBJECTS:ntlmclient>")
234 ADD_FEATURE_INFO(ntlmclient GIT_NTLM "NTLM authentication support for Unix")
236 # Optional external dependency: GSSAPI
238 INCLUDE(SelectGSSAPI)
240 # Optional external dependency: iconv
246 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${ICONV_INCLUDE_DIR})
247 LIST(APPEND LIBGIT2_LIBS ${ICONV_LIBRARIES})
248 LIST(APPEND LIBGIT2_PC_LIBS ${ICONV_LIBRARIES})
250 ADD_FEATURE_INFO(iconv GIT_USE_ICONV "iconv encoding conversion support")
255 FIND_PACKAGE(Threads REQUIRED)
265 IF (HAVE_STRUCT_STAT_ST_MTIM)
266 SET(GIT_USE_STAT_MTIM 1)
267 ELSEIF (HAVE_STRUCT_STAT_ST_MTIMESPEC)
268 SET(GIT_USE_STAT_MTIMESPEC 1)
269 ELSEIF (HAVE_STRUCT_STAT_ST_MTIME_NSEC)
270 SET(GIT_USE_STAT_MTIME_NSEC 1)
273 ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64)
275 # Collect sourcefiles
277 "${libgit2_SOURCE_DIR}/include/git2.h"
278 "${libgit2_SOURCE_DIR}/include/git2/*.h"
279 "${libgit2_SOURCE_DIR}/include/git2/sys/*.h")
281 # On Windows use specific platform sources
282 IF (WIN32 AND NOT CYGWIN)
284 SET(WIN_RC "win32/git2.rc")
287 FILE(GLOB SRC_OS win32/*.c win32/*.h)
289 ADD_DEFINITIONS(-DNO_ADDRINFO -DNO_READDIR_R -DNO_MMAP)
291 FILE(GLOB SRC_OS unix/*.c unix/*.h)
294 IF (USE_LEAK_CHECKER STREQUAL "valgrind")
295 ADD_DEFINITIONS(-DVALGRIND)
298 FILE(GLOB SRC_GIT2 *.c *.h
299 allocators/*.c allocators/*.h
300 streams/*.c streams/*.h
301 transports/*.c transports/*.h
304 # the xdiff dependency is not (yet) warning-free, disable warnings as
305 # errors for the xdiff sources until we've sorted them out
307 SET_SOURCE_FILES_PROPERTIES(xdiff/xdiffi.c PROPERTIES COMPILE_FLAGS -WX-)
308 SET_SOURCE_FILES_PROPERTIES(xdiff/xutils.c PROPERTIES COMPILE_FLAGS -WX-)
311 # Determine architecture of the machine
312 IF (CMAKE_SIZEOF_VOID_P EQUAL 8)
314 ELSEIF (CMAKE_SIZEOF_VOID_P EQUAL 4)
316 ELSEIF (CMAKE_SIZEOF_VOID_P)
317 MESSAGE(FATAL_ERROR "Unsupported architecture (pointer size is ${CMAKE_SIZEOF_VOID_P} bytes)")
319 MESSAGE(FATAL_ERROR "Unsupported architecture (CMAKE_SIZEOF_VOID_P is unset)")
322 CONFIGURE_FILE(features.h.in git2/sys/features.h)
324 SET(LIBGIT2_SOURCES ${SRC_H} ${SRC_GIT2} ${SRC_OS} ${SRC_SSH} ${SRC_SHA1})
326 ADD_LIBRARY(git2internal OBJECT ${LIBGIT2_SOURCES})
327 SET_TARGET_PROPERTIES(git2internal PROPERTIES C_STANDARD 90)
328 IDE_SPLIT_SOURCES(git2internal)
329 LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:git2internal>)
331 TARGET_INCLUDE_DIRECTORIES(git2internal PRIVATE ${LIBGIT2_INCLUDES} PUBLIC ${libgit2_SOURCE_DIR}/include)
332 TARGET_INCLUDE_DIRECTORIES(git2internal SYSTEM PRIVATE ${LIBGIT2_SYSTEM_INCLUDES})
334 SET(LIBGIT2_OBJECTS ${LIBGIT2_OBJECTS} PARENT_SCOPE)
335 SET(LIBGIT2_INCLUDES ${LIBGIT2_INCLUDES} PARENT_SCOPE)
336 SET(LIBGIT2_SYSTEM_INCLUDES ${LIBGIT2_SYSTEM_INCLUDES} PARENT_SCOPE)
337 SET(LIBGIT2_LIBS ${LIBGIT2_LIBS} PARENT_SCOPE)
340 # This is required for Xcode to actually link the libgit2 library
341 # when using only object libraries.
342 FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.c "")
343 LIST(APPEND LIBGIT2_OBJECTS ${CMAKE_CURRENT_BINARY_DIR}/dummy.c)
346 # Compile and link libgit2
347 ADD_LIBRARY(git2 ${WIN_RC} ${LIBGIT2_OBJECTS})
348 TARGET_LINK_LIBRARIES(git2 ${LIBGIT2_LIBS})
350 SET_TARGET_PROPERTIES(git2 PROPERTIES C_STANDARD 90)
351 SET_TARGET_PROPERTIES(git2 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
352 SET_TARGET_PROPERTIES(git2 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
353 SET_TARGET_PROPERTIES(git2 PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
355 # Workaround for Cmake bug #0011240 (see http://public.kitware.com/Bug/view.php?id=11240)
356 # Win64+MSVC+static libs = linker error
357 IF(MSVC AND GIT_ARCH_64 AND NOT BUILD_SHARED_LIBS)
358 SET_TARGET_PROPERTIES(git2 PROPERTIES STATIC_LIBRARY_FLAGS "/MACHINE:x64")
361 IDE_SPLIT_SOURCES(git2)
364 SET_TARGET_PROPERTIES(git2 PROPERTIES VERSION ${LIBGIT2_VERSION_STRING})
365 SET_TARGET_PROPERTIES(git2 PROPERTIES SOVERSION ${LIBGIT2_SOVERSION})
366 IF (LIBGIT2_FILENAME)
367 ADD_DEFINITIONS(-DLIBGIT2_FILENAME=\"${LIBGIT2_FILENAME}\")
368 SET_TARGET_PROPERTIES(git2 PROPERTIES OUTPUT_NAME ${LIBGIT2_FILENAME})
369 ELSEIF (DEFINED LIBGIT2_PREFIX)
370 SET_TARGET_PROPERTIES(git2 PROPERTIES PREFIX "${LIBGIT2_PREFIX}")
374 PKG_BUILD_CONFIG(NAME libgit2
375 VERSION ${LIBGIT2_VERSION_STRING}
376 DESCRIPTION "The git library, take 2"
378 PRIVATE_LIBS ${LIBGIT2_PC_LIBS}
379 REQUIRES ${LIBGIT2_PC_REQUIRES}
383 # Precompiled headers
384 SET_TARGET_PROPERTIES(git2 PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h /FIprecompiled.h")
385 SET_SOURCE_FILES_PROPERTIES(win32/precompiled.c COMPILE_FLAGS "/Ycprecompiled.h")
390 RUNTIME DESTINATION ${BIN_INSTALL_DIR}
391 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
392 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
394 INSTALL(DIRECTORY ${libgit2_SOURCE_DIR}/include/git2 DESTINATION ${INCLUDE_INSTALL_DIR} )
395 INSTALL(FILES ${libgit2_SOURCE_DIR}/include/git2.h DESTINATION ${INCLUDE_INSTALL_DIR} )