4 ADD_FEATURE_INFO(debugpool GIT_DEBUG_POOL "debug pool allocator")
6 # This variable will contain the libraries we need to put into
7 # libgit2.pc's Requires.private. That is, what we're linking to or
8 # what someone who's statically linking us needs to link to.
9 SET(LIBGIT2_PC_REQUIRES "")
10 # This will be set later if we use the system's http-parser library or
11 # use iconv (OSX) and will be written to the Libs.private field in the
13 SET(LIBGIT2_PC_LIBS "")
16 "${CMAKE_CURRENT_BINARY_DIR}"
17 "${libgit2_SOURCE_DIR}/src"
18 "${libgit2_SOURCE_DIR}/include")
20 SET(LIBGIT2_LIBDIRS "")
24 SET(BIN_INSTALL_DIR bin CACHE PATH "Where to install binaries to.")
25 SET(LIB_INSTALL_DIR lib CACHE PATH "Where to install libraries to.")
26 SET(INCLUDE_INSTALL_DIR include CACHE PATH "Where to install headers to.")
28 # Set a couple variables to be substituted inside the .pc file.
29 # We can't just use LIB_INSTALL_DIR in the .pc file, as passing them as absolue
30 # or relative paths is both valid and supported by cmake.
31 SET (PKGCONFIG_PREFIX ${CMAKE_INSTALL_PREFIX})
33 IF(IS_ABSOLUTE ${LIB_INSTALL_DIR})
34 SET (PKGCONFIG_LIBDIR ${LIB_INSTALL_DIR})
35 ELSE(IS_ABSOLUTE ${LIB_INSTALL_DIR})
36 SET (PKGCONFIG_LIBDIR "\${prefix}/${LIB_INSTALL_DIR}")
37 ENDIF (IS_ABSOLUTE ${LIB_INSTALL_DIR})
39 IF(IS_ABSOLUTE ${INCLUDE_INSTALL_DIR})
40 SET (PKGCONFIG_INCLUDEDIR ${INCLUDE_INSTALL_DIR})
41 ELSE(IS_ABSOLUTE ${INCLUDE_INSTALL_DIR})
42 SET (PKGCONFIG_INCLUDEDIR "\${prefix}/${INCLUDE_INSTALL_DIR}")
43 ENDIF(IS_ABSOLUTE ${INCLUDE_INSTALL_DIR})
46 IF (ENABLE_TRACE STREQUAL "ON")
49 ADD_FEATURE_INFO(tracing GIT_TRACE "tracing support")
51 CHECK_SYMBOL_EXISTS(regcomp_l "regex.h;xlocale.h" HAVE_REGCOMP_L)
53 SET(GIT_USE_REGCOMP_L 1)
56 CHECK_FUNCTION_EXISTS(futimens HAVE_FUTIMENS)
58 SET(GIT_USE_FUTIMENS 1)
61 CHECK_FUNCTION_EXISTS(qsort_r HAVE_QSORT_R)
63 ADD_DEFINITIONS(-DHAVE_QSORT_R)
66 CHECK_FUNCTION_EXISTS(qsort_s HAVE_QSORT_S)
68 ADD_DEFINITIONS(-DHAVE_QSORT_S)
71 # Find required dependencies
74 LIST(APPEND LIBGIT2_LIBS ws2_32)
75 ELSEIF(CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)")
76 LIST(APPEND LIBGIT2_LIBS socket nsl)
77 LIST(APPEND LIBGIT2_PC_LIBS "-lsocket" "-lnsl")
78 ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Haiku")
79 LIST(APPEND LIBGIT2_LIBS network)
80 LIST(APPEND LIBGIT2_PC_LIBS "-lnetwork")
83 CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" NEED_LIBRT)
85 LIST(APPEND LIBGIT2_LIBS rt)
86 LIST(APPEND LIBGIT2_PC_LIBS "-lrt")
90 LIST(APPEND LIBGIT2_LIBS ${CMAKE_THREAD_LIBS_INIT})
91 LIST(APPEND LIBGIT2_PC_LIBS ${CMAKE_THREAD_LIBS_INIT})
93 ADD_FEATURE_INFO(threadsafe THREADSAFE "threadsafe support")
96 IF (WIN32 AND EMBED_SSH_PATH)
97 FILE(GLOB SRC_SSH "${EMBED_SSH_PATH}/src/*.c")
98 LIST(APPEND LIBGIT2_INCLUDES "${EMBED_SSH_PATH}/include")
99 FILE(WRITE "${EMBED_SSH_PATH}/src/libssh2_config.h" "#define HAVE_WINCNG\n#define LIBSSH2_WINCNG\n#include \"../win32/libssh2_config.h\"")
103 IF (WIN32 AND WINHTTP)
106 # Since MinGW does not come with headers or an import library for winhttp,
107 # we have to include a private header and generate our own import library
109 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/winhttp" "${libgit2_BINARY_DIR}/deps/winhttp")
110 LIST(APPEND LIBGIT2_LIBS winhttp)
111 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/winhttp")
112 LIST(APPEND LIBGIT2_LIBDIRS ${LIBWINHTTP_PATH})
114 LIST(APPEND LIBGIT2_LIBS "winhttp")
115 LIST(APPEND LIBGIT2_PC_LIBS "-lwinhttp")
118 LIST(APPEND LIBGIT2_LIBS "rpcrt4" "crypt32" "ole32")
119 LIST(APPEND LIBGIT2_PC_LIBS "-lrpcrt4" "-lcrypt32" "-lole32")
122 PKG_CHECK_MODULES(CURL libcurl)
127 LIST(APPEND LIBGIT2_INCLUDES ${CURL_INCLUDE_DIRS})
128 LIST(APPEND LIBGIT2_LIBDIRS ${CURL_LIBRARY_DIRS})
129 LIST(APPEND LIBGIT2_LIBS ${CURL_LIBRARIES})
130 LIST(APPEND LIBGIT2_PC_LIBS ${CURL_LDFLAGS})
132 ADD_FEATURE_INFO(cURL GIT_CURL "cURL for HTTP proxy support")
136 IF (CMAKE_SYSTEM_NAME MATCHES "Darwin")
137 FIND_PACKAGE(Security)
138 FIND_PACKAGE(CoreFoundation)
141 # Auto-select TLS backend
142 IF (USE_HTTPS STREQUAL ON)
144 IF (SECURITY_HAS_SSLCREATECONTEXT)
145 SET(HTTPS_BACKEND "SecureTransport")
147 MESSAGE("-- Security framework is too old, falling back to OpenSSL")
148 SET(HTTPS_BACKEND "OpenSSL")
151 SET(HTTPS_BACKEND "WinHTTP")
153 SET(HTTPS_BACKEND "OpenSSL")
156 # Backend was explicitly set
157 SET(HTTPS_BACKEND ${USE_HTTPS})
160 # Check that we can find what's required for the selected backend
161 IF (HTTPS_BACKEND STREQUAL "SecureTransport")
162 IF (NOT COREFOUNDATION_FOUND)
163 MESSAGE(FATAL_ERROR "Cannot use SecureTransport backend, CoreFoundation.framework not found")
165 IF (NOT SECURITY_FOUND)
166 MESSAGE(FATAL_ERROR "Cannot use SecureTransport backend, Security.framework not found")
168 IF (NOT SECURITY_HAS_SSLCREATECONTEXT)
169 MESSAGE(FATAL_ERROR "Cannot use SecureTransport backend, SSLCreateContext not supported")
172 SET(GIT_SECURE_TRANSPORT 1)
173 LIST(APPEND LIBGIT2_INCLUDES ${SECURITY_INCLUDE_DIR})
174 LIST(APPEND LIBGIT2_LIBS ${COREFOUNDATION_LIBRARIES} ${SECURITY_LIBRARIES})
175 LIST(APPEND LIBGIT2_PC_LIBS ${COREFOUNDATION_LDFLAGS} ${SECURITY_LDFLAGS})
176 ELSEIF (HTTPS_BACKEND STREQUAL "OpenSSL")
177 FIND_PACKAGE(OpenSSL)
179 IF (NOT OPENSSL_FOUND)
180 MESSAGE(FATAL_ERROR "Asked for OpenSSL TLS backend, but it wasn't found")
184 LIST(APPEND LIBGIT2_INCLUDES ${OPENSSL_INCLUDE_DIR})
185 LIST(APPEND LIBGIT2_LIBS ${OPENSSL_LIBRARIES})
186 LIST(APPEND LIBGIT2_PC_LIBS ${OPENSSL_LDFLAGS})
187 LIST(APPEND LIBGIT2_PC_REQUIRES "openssl")
188 ELSEIF (HTTPS_BACKEND STREQUAL "WinHTTP")
189 # WinHTTP setup was handled in the WinHTTP-specific block above
191 MESSAGE(FATAL_ERROR "Asked for backend ${HTTPS_BACKEND} but it wasn't found")
194 ADD_FEATURE_INFO(HTTPS ON "using ${HTTPS_BACKEND}")
197 ADD_FEATURE_INFO(HTTPS OFF "no support")
200 # Specify sha1 implementation
201 IF(SHA1_BACKEND STREQUAL "OpenSSL")
202 IF(NOT OPENSSL_FOUND)
203 FIND_PACKAGE(OpenSSL)
204 IF(NOT OPENSSL_FOUND)
205 MESSAGE(FATAL_ERROR "Requested OpenSSL SHA1 backend, but OpenSSL could not be found")
209 ADD_FEATURE_INFO(SHA ON "using OpenSSL")
210 SET(GIT_SHA1_OPENSSL 1)
211 IF(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
212 LIST(APPEND LIBGIT2_PC_LIBS "-lssl")
214 LIST(APPEND LIBGIT2_PC_REQUIRES "openssl")
216 ELSEIF(SHA1_BACKEND STREQUAL "CollisionDetection")
217 ADD_FEATURE_INFO(SHA ON "using CollisionDetection")
218 SET(GIT_SHA1_COLLISIONDETECT 1)
219 ADD_DEFINITIONS(-DSHA1DC_NO_STANDARD_INCLUDES=1)
220 ADD_DEFINITIONS(-DSHA1DC_CUSTOM_INCLUDE_SHA1_C=\"common.h\")
221 ADD_DEFINITIONS(-DSHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C=\"common.h\")
222 FILE(GLOB SRC_SHA1 hash/hash_collisiondetect.c hash/sha1dc/*)
223 ELSEIF(SHA1_BACKEND STREQUAL "Generic")
224 ADD_FEATURE_INFO(SHA ON "using Generic")
225 FILE(GLOB SRC_SHA1 hash/hash_generic.c)
226 ELSEIF(SHA1_BACKEND STREQUAL "Win32")
227 ADD_FEATURE_INFO(SHA ON "using Win32")
228 SET(GIT_SHA1_WIN32 1)
229 FILE(GLOB SRC_SHA1 hash/hash_win32.c)
230 ELSEIF(SHA1_BACKEND STREQUAL "CommonCrypto")
231 ADD_FEATURE_INFO(SHA ON "using CommonCrypto")
232 SET(GIT_SHA1_COMMON_CRYPTO 1)
234 MESSAGE(FATAL_ERROR "Asked for unknown SHA1 backend ${SHA1_BACKEND}")
237 # Include POSIX regex when it is required
238 IF(WIN32 OR AMIGA OR CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)")
239 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/regex" "${libgit2_BINARY_DIR}/deps/regex")
240 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/regex")
241 LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:regex>)
244 # Optional external dependency: http-parser
245 FIND_PACKAGE(HTTP_Parser)
246 IF (USE_EXT_HTTP_PARSER AND HTTP_PARSER_FOUND AND HTTP_PARSER_VERSION_MAJOR EQUAL 2)
247 LIST(APPEND LIBGIT2_INCLUDES ${HTTP_PARSER_INCLUDE_DIRS})
248 LIST(APPEND LIBGIT2_LIBS ${HTTP_PARSER_LIBRARIES})
249 LIST(APPEND LIBGIT2_PC_LIBS "-lhttp_parser")
250 ADD_FEATURE_INFO(http-parser ON "http-parser support")
252 MESSAGE(STATUS "http-parser version 2 was not found or disabled; using bundled 3rd-party sources.")
253 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/http-parser" "${libgit2_BINARY_DIR}/deps/http-parser")
254 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/http-parser")
255 LIST(APPEND LIBGIT2_OBJECTS "$<TARGET_OBJECTS:http-parser>")
256 ADD_FEATURE_INFO(http-parser ON "http-parser support (bundled)")
259 # Optional external dependency: zlib
260 IF(NOT USE_BUNDLED_ZLIB)
263 LIST(APPEND LIBGIT2_INCLUDES ${ZLIB_INCLUDE_DIRS})
264 LIST(APPEND LIBGIT2_LIBS ${ZLIB_LIBRARIES})
265 IF(APPLE OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
266 LIST(APPEND LIBGIT2_LIBS "z")
267 LIST(APPEND LIBGIT2_PC_LIBS "-lz")
269 LIST(APPEND LIBGIT2_PC_REQUIRES "zlib")
271 ADD_FEATURE_INFO(zlib ON "using system zlib")
273 MESSAGE(STATUS "zlib was not found; using bundled 3rd-party sources." )
276 IF(USE_BUNDLED_ZLIB OR NOT ZLIB_FOUND)
277 ADD_SUBDIRECTORY("${libgit2_SOURCE_DIR}/deps/zlib" "${libgit2_BINARY_DIR}/deps/zlib")
278 LIST(APPEND LIBGIT2_INCLUDES "${libgit2_SOURCE_DIR}/deps/zlib")
279 LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:zlib>)
280 ADD_FEATURE_INFO(zlib ON "using bundled zlib")
283 # Optional external dependency: libssh2
285 PKG_CHECK_MODULES(LIBSSH2 libssh2)
289 LIST(APPEND LIBGIT2_INCLUDES ${LIBSSH2_INCLUDE_DIRS})
290 LIST(APPEND LIBGIT2_LIBS ${LIBSSH2_LIBRARIES})
291 LIST(APPEND LIBGIT2_LIBDIRS ${LIBSSH2_LIBRARY_DIRS})
292 LIST(APPEND LIBGIT2_PC_LIBS ${LIBSSH2_LDFLAGS})
293 #SET(LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} ${LIBSSH2_LDFLAGS}")
295 CHECK_LIBRARY_EXISTS("${LIBSSH2_LIBRARIES}" libssh2_userauth_publickey_frommemory "${LIBSSH2_LIBRARY_DIRS}" HAVE_LIBSSH2_MEMORY_CREDENTIALS)
296 IF (HAVE_LIBSSH2_MEMORY_CREDENTIALS)
297 SET(GIT_SSH_MEMORY_CREDENTIALS 1)
300 MESSAGE(STATUS "LIBSSH2 not found. Set CMAKE_PREFIX_PATH if it is installed outside of the default search path.")
302 ADD_FEATURE_INFO(SSH GIT_SSH "SSH transport support")
304 # Optional external dependency: libgssapi
310 LIST(APPEND LIBGIT2_LIBS ${GSSAPI_LIBRARIES})
312 ADD_FEATURE_INFO(SPNEGO GIT_GSSAPI "SPNEGO authentication support")
314 # Optional external dependency: iconv
320 LIST(APPEND LIBGIT2_INCLUDES ${ICONV_INCLUDE_DIR})
321 LIST(APPEND LIBGIT2_LIBS ${ICONV_LIBRARIES})
322 LIST(APPEND LIBGIT2_PC_LIBS ${ICONV_LIBRARIES})
324 ADD_FEATURE_INFO(iconv GIT_USE_ICONV "iconv encoding conversion support")
329 FIND_PACKAGE(Threads REQUIRED)
339 IF (HAVE_STRUCT_STAT_ST_MTIM)
340 SET(GIT_USE_STAT_MTIM 1)
341 ELSEIF (HAVE_STRUCT_STAT_ST_MTIMESPEC)
342 SET(GIT_USE_STAT_MTIMESPEC 1)
343 ELSEIF (HAVE_STRUCT_STAT_ST_MTIME_NSEC)
344 SET(GIT_USE_STAT_MTIME_NSEC 1)
347 ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64)
349 # Collect sourcefiles
351 "${libgit2_SOURCE_DIR}/include/git2.h"
352 "${libgit2_SOURCE_DIR}/include/git2/*.h"
353 "${libgit2_SOURCE_DIR}/include/git2/sys/*.h")
355 # On Windows use specific platform sources
356 IF (WIN32 AND NOT CYGWIN)
357 ADD_DEFINITIONS(-DWIN32 -D_WIN32_WINNT=0x0501)
360 SET(WIN_RC "win32/git2.rc")
363 FILE(GLOB SRC_OS win32/*.c win32/*.h)
365 ADD_DEFINITIONS(-DNO_ADDRINFO -DNO_READDIR_R -DNO_MMAP)
368 ADD_DEFINITIONS(-DNO_MMAP)
370 FILE(GLOB SRC_OS unix/*.c unix/*.h)
372 FILE(GLOB SRC_GIT2 *.c *.h
373 streams/*.c streams/*.h
374 transports/*.c transports/*.h
377 # Determine architecture of the machine
378 IF (CMAKE_SIZEOF_VOID_P EQUAL 8)
380 ELSEIF (CMAKE_SIZEOF_VOID_P EQUAL 4)
382 ELSEIF (CMAKE_SIZEOF_VOID_P)
383 MESSAGE(FATAL_ERROR "Unsupported architecture (pointer size is ${CMAKE_SIZEOF_VOID_P} bytes)")
385 MESSAGE(FATAL_ERROR "Unsupported architecture (CMAKE_SIZEOF_VOID_P is unset)")
388 CONFIGURE_FILE(features.h.in git2/sys/features.h)
390 SET(LIBGIT2_SOURCES ${SRC_H} ${SRC_GIT2} ${SRC_OS} ${SRC_SSH} ${SRC_SHA1})
392 ADD_LIBRARY(git2internal OBJECT ${LIBGIT2_SOURCES})
393 IDE_SPLIT_SOURCES(git2internal)
394 LIST(APPEND LIBGIT2_OBJECTS $<TARGET_OBJECTS:git2internal>)
396 IF (${CMAKE_VERSION} VERSION_LESS 2.8.12)
397 INCLUDE_DIRECTORIES(${LIBGIT2_INCLUDES})
399 TARGET_INCLUDE_DIRECTORIES(git2internal
400 PRIVATE ${LIBGIT2_INCLUDES}
401 PUBLIC ${libgit2_SOURCE_DIR}/include)
404 SET(LIBGIT2_OBJECTS ${LIBGIT2_OBJECTS} PARENT_SCOPE)
405 SET(LIBGIT2_INCLUDES ${LIBGIT2_INCLUDES} PARENT_SCOPE)
406 SET(LIBGIT2_LIBS ${LIBGIT2_LIBS} PARENT_SCOPE)
407 SET(LIBGIT2_LIBDIRS ${LIBGIT2_LIBDIRS} PARENT_SCOPE)
410 # This is required for Xcode to actually link the libgit2 library
411 # when using only object libraries.
412 FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/dummy.c "")
413 LIST(APPEND LIBGIT2_OBJECTS ${CMAKE_CURRENT_BINARY_DIR}/dummy.c)
416 # Compile and link libgit2
417 LINK_DIRECTORIES(${LIBGIT2_LIBDIRS})
418 ADD_LIBRARY(git2 ${WIN_RC} ${LIBGIT2_OBJECTS})
419 TARGET_LINK_LIBRARIES(git2 ${LIBGIT2_LIBS})
421 SET_TARGET_PROPERTIES(git2 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
422 SET_TARGET_PROPERTIES(git2 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
423 SET_TARGET_PROPERTIES(git2 PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${libgit2_BINARY_DIR})
425 # Workaround for Cmake bug #0011240 (see http://public.kitware.com/Bug/view.php?id=11240)
426 # Win64+MSVC+static libs = linker error
427 IF(MSVC AND GIT_ARCH_64 AND NOT BUILD_SHARED_LIBS)
428 SET_TARGET_PROPERTIES(git2 PROPERTIES STATIC_LIBRARY_FLAGS "/MACHINE:x64")
431 IDE_SPLIT_SOURCES(git2)
434 SET_TARGET_PROPERTIES(git2 PROPERTIES VERSION ${LIBGIT2_VERSION_STRING})
435 SET_TARGET_PROPERTIES(git2 PROPERTIES SOVERSION ${LIBGIT2_SOVERSION})
436 IF (LIBGIT2_FILENAME)
437 ADD_DEFINITIONS(-DLIBGIT2_FILENAME=\"${LIBGIT2_FILENAME}\")
438 SET_TARGET_PROPERTIES(git2 PROPERTIES OUTPUT_NAME ${LIBGIT2_FILENAME})
439 ELSEIF (DEFINED LIBGIT2_PREFIX)
440 SET_TARGET_PROPERTIES(git2 PROPERTIES PREFIX "${LIBGIT2_PREFIX}")
444 LIST(REMOVE_DUPLICATES LIBGIT2_PC_REQUIRES)
445 STRING(REPLACE ";" " " LIBGIT2_PC_REQUIRES "${LIBGIT2_PC_REQUIRES}")
446 STRING(REPLACE ";" " " LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS}")
447 CONFIGURE_FILE(${libgit2_SOURCE_DIR}/libgit2.pc.in ${libgit2_BINARY_DIR}/libgit2.pc @ONLY)
450 # Precompiled headers
451 SET_TARGET_PROPERTIES(git2 PROPERTIES COMPILE_FLAGS "/Yuprecompiled.h /FIprecompiled.h")
452 SET_SOURCE_FILES_PROPERTIES(win32/precompiled.c COMPILE_FLAGS "/Ycprecompiled.h")
457 RUNTIME DESTINATION ${BIN_INSTALL_DIR}
458 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
459 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
461 INSTALL(FILES ${libgit2_BINARY_DIR}/libgit2.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig )
462 INSTALL(DIRECTORY ${libgit2_SOURCE_DIR}/include/git2 DESTINATION ${INCLUDE_INSTALL_DIR} )
463 INSTALL(FILES ${libgit2_SOURCE_DIR}/include/git2.h DESTINATION ${INCLUDE_INSTALL_DIR} )