]> git.proxmox.com Git - libgit2.git/blob - src/CMakeLists.txt
bcc6a0139f990cb15b191b22c890886e461645b2
[libgit2.git] / src / CMakeLists.txt
1 IF(DEBUG_POOL)
2 SET(GIT_DEBUG_POOL 1)
3 ENDIF()
4 ADD_FEATURE_INFO(debugpool GIT_DEBUG_POOL "debug pool allocator")
5
6 INCLUDE(PkgBuildConfig)
7
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
14 # pc file.
15 SET(LIBGIT2_PC_LIBS "")
16
17 SET(LIBGIT2_INCLUDES
18 "${CMAKE_CURRENT_BINARY_DIR}"
19 "${libgit2_SOURCE_DIR}/src"
20 "${libgit2_SOURCE_DIR}/include")
21 SET(LIBGIT2_SYSTEM_INCLUDES "")
22 SET(LIBGIT2_LIBS "")
23
24 # Installation paths
25 #
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.")
29
30 # Enable tracing
31 IF (ENABLE_TRACE STREQUAL "ON")
32 SET(GIT_TRACE 1)
33 ENDIF()
34 ADD_FEATURE_INFO(tracing GIT_TRACE "tracing support")
35
36 CHECK_FUNCTION_EXISTS(futimens HAVE_FUTIMENS)
37 IF (HAVE_FUTIMENS)
38 SET(GIT_USE_FUTIMENS 1)
39 ENDIF ()
40
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)
44 IF (HAVE_QSORT_R_BSD)
45 ADD_DEFINITIONS(-DHAVE_QSORT_R_BSD)
46 ENDIF()
47
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)
51 IF (HAVE_QSORT_R_GNU)
52 ADD_DEFINITIONS(-DHAVE_QSORT_R_GNU)
53 ENDIF()
54
55 CHECK_FUNCTION_EXISTS(qsort_s HAVE_QSORT_S)
56 IF (HAVE_QSORT_S)
57 ADD_DEFINITIONS(-DHAVE_QSORT_S)
58 ENDIF ()
59
60 # Find required dependencies
61
62 IF(WIN32)
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")
70 ENDIF()
71
72 CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" NEED_LIBRT)
73 IF(NEED_LIBRT)
74 LIST(APPEND LIBGIT2_LIBS rt)
75 LIST(APPEND LIBGIT2_PC_LIBS "-lrt")
76 ENDIF()
77
78 IF(THREADSAFE)
79 LIST(APPEND LIBGIT2_LIBS ${CMAKE_THREAD_LIBS_INIT})
80 LIST(APPEND LIBGIT2_PC_LIBS ${CMAKE_THREAD_LIBS_INIT})
81 ENDIF()
82 ADD_FEATURE_INFO(threadsafe THREADSAFE "threadsafe support")
83
84
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\"")
89 SET(GIT_SSH 1)
90 ENDIF()
91
92 IF (WIN32 AND WINHTTP)
93 SET(GIT_WINHTTP 1)
94
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
97 IF (MINGW)
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")
101 ELSE()
102 LIST(APPEND LIBGIT2_LIBS "winhttp")
103 LIST(APPEND LIBGIT2_PC_LIBS "-lwinhttp")
104 ENDIF ()
105
106 LIST(APPEND LIBGIT2_LIBS "rpcrt4" "crypt32" "ole32")
107 LIST(APPEND LIBGIT2_PC_LIBS "-lrpcrt4" "-lcrypt32" "-lole32")
108 ENDIF()
109
110 Include(SelectHTTPSBackend)
111 Include(SelectHashes)
112
113 # Specify regular expression implementation
114 FIND_PACKAGE(PCRE)
115
116 IF(REGEX_BACKEND STREQUAL "")
117 CHECK_SYMBOL_EXISTS(regcomp_l "regex.h;xlocale.h" HAVE_REGCOMP_L)
118
119 IF(HAVE_REGCOMP_L)
120 SET(REGEX_BACKEND "regcomp_l")
121 ELSEIF(PCRE_FOUND)
122 SET(REGEX_BACKEND "pcre")
123 ELSE()
124 SET(REGEX_BACKEND "builtin")
125 ENDIF()
126 ENDIF()
127
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")
132 FIND_PACKAGE(PCRE2)
133
134 IF(NOT PCRE2_FOUND)
135 MESSAGE(FATAL_ERROR "PCRE2 support was requested but not found")
136 ENDIF()
137
138 ADD_FEATURE_INFO(regex ON "using system PCRE2")
139 SET(GIT_REGEX_PCRE2 1)
140
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)
147
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)
157
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>)
161 ELSE()
162 MESSAGE(FATAL_ERROR "The REGEX_BACKEND option provided is not supported")
163 ENDIF()
164
165 # Optional external dependency: http-parser
166 IF(USE_HTTP_PARSER STREQUAL "system")
167 FIND_PACKAGE(HTTP_Parser)
168
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)")
174 ELSE()
175 MESSAGE(FATAL_ERROR "http-parser support was requested but not found")
176 ENDIF()
177 ELSE()
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)")
183 ENDIF()
184
185 # Optional external dependency: zlib
186 IF(NOT USE_BUNDLED_ZLIB)
187 FIND_PACKAGE(ZLIB)
188 IF(ZLIB_FOUND)
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")
193 ELSE()
194 LIST(APPEND LIBGIT2_PC_REQUIRES "zlib")
195 ENDIF()
196 ADD_FEATURE_INFO(zlib ON "using system zlib")
197 ELSE()
198 MESSAGE(STATUS "zlib was not found; using bundled 3rd-party sources." )
199 ENDIF()
200 ENDIF()
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")
206 ENDIF()
207
208 # Optional external dependency: libssh2
209 IF (USE_SSH)
210 FIND_PKGLIBRARIES(LIBSSH2 libssh2)
211 ENDIF()
212 IF (LIBSSH2_FOUND)
213 SET(GIT_SSH 1)
214 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${LIBSSH2_INCLUDE_DIRS})
215 LIST(APPEND LIBGIT2_LIBS ${LIBSSH2_LIBRARIES})
216 LIST(APPEND LIBGIT2_PC_LIBS ${LIBSSH2_LDFLAGS})
217
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)
221 ENDIF()
222 ELSE()
223 MESSAGE(STATUS "LIBSSH2 not found. Set CMAKE_PREFIX_PATH if it is installed outside of the default search path.")
224 ENDIF()
225 ADD_FEATURE_INFO(SSH GIT_SSH "SSH transport support")
226
227 # Optional external dependency: ntlmclient
228 IF (USE_NTLMCLIENT)
229 SET(GIT_NTLM 1)
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>")
233 ENDIF()
234 ADD_FEATURE_INFO(ntlmclient GIT_NTLM "NTLM authentication support for Unix")
235
236 # Optional external dependency: GSSAPI
237
238 INCLUDE(SelectGSSAPI)
239
240 # Optional external dependency: iconv
241 IF (USE_ICONV)
242 FIND_PACKAGE(Iconv)
243 ENDIF()
244 IF (ICONV_FOUND)
245 SET(GIT_USE_ICONV 1)
246 LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${ICONV_INCLUDE_DIR})
247 LIST(APPEND LIBGIT2_LIBS ${ICONV_LIBRARIES})
248 LIST(APPEND LIBGIT2_PC_LIBS ${ICONV_LIBRARIES})
249 ENDIF()
250 ADD_FEATURE_INFO(iconv GIT_USE_ICONV "iconv encoding conversion support")
251
252
253 IF (THREADSAFE)
254 IF (NOT WIN32)
255 FIND_PACKAGE(Threads REQUIRED)
256 ENDIF()
257
258 SET(GIT_THREADS 1)
259 ENDIF()
260
261 IF (USE_NSEC)
262 SET(GIT_USE_NSEC 1)
263 ENDIF()
264
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)
271 ENDIF()
272
273 ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64)
274
275 # Collect sourcefiles
276 FILE(GLOB SRC_H
277 "${libgit2_SOURCE_DIR}/include/git2.h"
278 "${libgit2_SOURCE_DIR}/include/git2/*.h"
279 "${libgit2_SOURCE_DIR}/include/git2/sys/*.h")
280
281 # On Windows use specific platform sources
282 IF (WIN32 AND NOT CYGWIN)
283 IF(MSVC)
284 SET(WIN_RC "win32/git2.rc")
285 ENDIF()
286
287 FILE(GLOB SRC_OS win32/*.c win32/*.h)
288 ELSEIF (AMIGA)
289 ADD_DEFINITIONS(-DNO_ADDRINFO -DNO_READDIR_R -DNO_MMAP)
290 ELSE()
291 FILE(GLOB SRC_OS unix/*.c unix/*.h)
292 ENDIF()
293
294 IF (USE_LEAK_CHECKER STREQUAL "valgrind")
295 ADD_DEFINITIONS(-DVALGRIND)
296 ENDIF()
297
298 FILE(GLOB SRC_GIT2 *.c *.h
299 allocators/*.c allocators/*.h
300 streams/*.c streams/*.h
301 transports/*.c transports/*.h
302 xdiff/*.c xdiff/*.h)
303
304 # the xdiff dependency is not (yet) warning-free, disable warnings as
305 # errors for the xdiff sources until we've sorted them out
306 IF(MSVC)
307 SET_SOURCE_FILES_PROPERTIES(xdiff/xdiffi.c PROPERTIES COMPILE_FLAGS -WX-)
308 SET_SOURCE_FILES_PROPERTIES(xdiff/xutils.c PROPERTIES COMPILE_FLAGS -WX-)
309 ENDIF()
310
311 # Determine architecture of the machine
312 IF (CMAKE_SIZEOF_VOID_P EQUAL 8)
313 SET(GIT_ARCH_64 1)
314 ELSEIF (CMAKE_SIZEOF_VOID_P EQUAL 4)
315 SET(GIT_ARCH_32 1)
316 ELSEIF (CMAKE_SIZEOF_VOID_P)
317 MESSAGE(FATAL_ERROR "Unsupported architecture (pointer size is ${CMAKE_SIZEOF_VOID_P} bytes)")
318 ELSE()
319 MESSAGE(FATAL_ERROR "Unsupported architecture (CMAKE_SIZEOF_VOID_P is unset)")
320 ENDIF()
321
322 CONFIGURE_FILE(features.h.in git2/sys/features.h)
323
324 SET(LIBGIT2_SOURCES ${SRC_H} ${SRC_GIT2} ${SRC_OS} ${SRC_SSH} ${SRC_SHA1})
325
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>)
330
331 TARGET_INCLUDE_DIRECTORIES(git2internal PRIVATE ${LIBGIT2_INCLUDES} PUBLIC ${libgit2_SOURCE_DIR}/include)
332 TARGET_INCLUDE_DIRECTORIES(git2internal SYSTEM PRIVATE ${LIBGIT2_SYSTEM_INCLUDES})
333
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)
338
339 IF(XCODE_VERSION)
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)
344 ENDIF()
345
346 # Compile and link libgit2
347 ADD_LIBRARY(git2 ${WIN_RC} ${LIBGIT2_OBJECTS})
348 TARGET_LINK_LIBRARIES(git2 ${LIBGIT2_LIBS})
349
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})
354
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")
359 ENDIF()
360
361 IDE_SPLIT_SOURCES(git2)
362
363 IF (SONAME)
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}")
371 ENDIF()
372 ENDIF()
373
374 PKG_BUILD_CONFIG(NAME libgit2
375 VERSION ${LIBGIT2_VERSION_STRING}
376 DESCRIPTION "The git library, take 2"
377 LIBS_SELF git2
378 PRIVATE_LIBS ${LIBGIT2_PC_LIBS}
379 REQUIRES ${LIBGIT2_PC_REQUIRES}
380 )
381
382 IF (MSVC_IDE)
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")
386 ENDIF ()
387
388 # Install
389 INSTALL(TARGETS git2
390 RUNTIME DESTINATION ${BIN_INSTALL_DIR}
391 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
392 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
393 )
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} )