@@ -15,7 +15,10 @@ PROJECT(libgit2 C)
15
15
CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
16
16
17
17
# Add find modules to the path
18
- SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR} /cmake/Modules/" )
18
+ SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR} /cmake/Modules/" )
19
+
20
+ INCLUDE (CheckLibraryExists)
21
+ INCLUDE (AddCFlagIfSupported)
19
22
20
23
# Build options
21
24
#
@@ -33,8 +36,9 @@ OPTION( ANDROID "Build for android NDK" OFF )
33
36
34
37
OPTION ( USE_ICONV "Link with and use iconv library" OFF )
35
38
OPTION ( USE_SSH "Link with libssh to enable SSH support" ON )
39
+ OPTION ( VALGRIND "Configure build for valgrind" OFF )
36
40
37
- IF (APPLE )
41
+ IF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" )
38
42
SET ( USE_ICONV ON )
39
43
ENDIF ()
40
44
@@ -54,6 +58,10 @@ IF(MSVC)
54
58
# By default, libgit2 is built with WinHTTP. To use the built-in
55
59
# HTTP transport, invoke CMake with the "-DWINHTTP=OFF" argument.
56
60
OPTION ( WINHTTP "Use Win32 WinHTTP routines" ON )
61
+
62
+ ADD_DEFINITIONS (-D_SCL_SECURE_NO_WARNINGS)
63
+ ADD_DEFINITIONS (-D_CRT_SECURE_NO_DEPRECATE)
64
+ ADD_DEFINITIONS (-D_CRT_NONSTDC_NO_DEPRECATE)
57
65
ENDIF ()
58
66
59
67
# This variable will contain the libraries we need to put into
@@ -77,17 +85,13 @@ FUNCTION(TARGET_OS_LIBRARIES target)
77
85
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)" )
78
86
TARGET_LINK_LIBRARIES (${target} socket nsl)
79
87
SET (LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} -lsocket -lnsl" PARENT_SCOPE)
80
- ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Linux" )
88
+ ENDIF ()
89
+ CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" NEED_LIBRT)
90
+ IF (NEED_LIBRT)
81
91
TARGET_LINK_LIBRARIES (${target} rt)
82
92
SET (LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} -lrt" PARENT_SCOPE)
83
93
ENDIF ()
84
94
85
- IF (USE_ICONV)
86
- TARGET_LINK_LIBRARIES (${target} iconv)
87
- ADD_DEFINITIONS (-DGIT_USE_ICONV)
88
- SET (LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} -liconv" PARENT_SCOPE)
89
- ENDIF ()
90
-
91
95
IF (THREADSAFE)
92
96
TARGET_LINK_LIBRARIES (${target} ${CMAKE_THREAD_LIBS_INIT} )
93
97
ENDIF ()
@@ -123,6 +127,9 @@ STRING(REGEX REPLACE "^.*LIBGIT2_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" LIBGIT2_V
123
127
STRING (REGEX REPLACE "^.*LIBGIT2_VERSION \" [0-9]+\\ .[0-9]+\\ .([0-9]+).*$" "\\ 1" LIBGIT2_VERSION_REV "${GIT2_HEADER} " )
124
128
SET (LIBGIT2_VERSION_STRING "${LIBGIT2_VERSION_MAJOR} .${LIBGIT2_VERSION_MINOR} .${LIBGIT2_VERSION_REV} " )
125
129
130
+ FILE (STRINGS "include/git2/version.h" GIT2_HEADER_SOVERSION REGEX "^#define LIBGIT2_SOVERSION [0-9]+$" )
131
+ STRING (REGEX REPLACE "^.*LIBGIT2_SOVERSION ([0-9]+)$" "\\ 1" LIBGIT2_SOVERSION "${GIT2_HEADER_SOVERSION} " )
132
+
126
133
# Find required dependencies
127
134
INCLUDE_DIRECTORIES (src include )
128
135
@@ -135,13 +142,13 @@ ELSE ()
135
142
FIND_PACKAGE (OpenSSL)
136
143
ENDIF ()
137
144
138
- FIND_PACKAGE (HTTP_Parser QUIET )
145
+ FIND_PACKAGE (HTTP_Parser)
139
146
IF (HTTP_PARSER_FOUND AND HTTP_PARSER_VERSION_MAJOR EQUAL 2)
140
147
INCLUDE_DIRECTORIES (${HTTP_PARSER_INCLUDE_DIRS} )
141
148
LINK_LIBRARIES (${HTTP_PARSER_LIBRARIES} )
142
149
SET (LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} -lhttp_parser" )
143
150
ELSE ()
144
- MESSAGE ("http-parser was not found or is too old; using bundled 3rd-party sources." )
151
+ MESSAGE (STATUS "http-parser was not found or is too old; using bundled 3rd-party sources." )
145
152
INCLUDE_DIRECTORIES (deps/http-parser)
146
153
FILE (GLOB SRC_HTTP deps/http-parser/*.c deps/http-parser/*.h)
147
154
ENDIF ()
@@ -153,7 +160,11 @@ IF (WIN32 AND NOT MINGW AND NOT SHA1_TYPE STREQUAL "builtin")
153
160
FILE (GLOB SRC_SHA1 src/hash/hash_win32.c)
154
161
ELSEIF (OPENSSL_FOUND AND NOT SHA1_TYPE STREQUAL "builtin" )
155
162
ADD_DEFINITIONS (-DOPENSSL_SHA1)
156
- SET (LIBGIT2_PC_REQUIRES "${LIBGIT2_PC_REQUIRES} openssl" )
163
+ IF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD" )
164
+ SET (LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} -lssl" )
165
+ ELSE ()
166
+ SET (LIBGIT2_PC_REQUIRES "${LIBGIT2_PC_REQUIRES} openssl" )
167
+ ENDIF ()
157
168
ELSE ()
158
169
FILE (GLOB SRC_SHA1 src/hash/hash_generic.c)
159
170
ENDIF ()
@@ -164,34 +175,31 @@ IF (ENABLE_TRACE STREQUAL "ON")
164
175
ENDIF ()
165
176
166
177
# Include POSIX regex when it is required
167
- IF (WIN32 OR AMIGA OR ANDROID)
178
+ IF (WIN32 OR AMIGA OR ANDROID OR CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)" )
168
179
INCLUDE_DIRECTORIES (deps/regex )
169
180
SET (SRC_REGEX deps/regex /regex .c)
170
181
ENDIF ()
171
182
172
183
# Optional external dependency: zlib
173
- # It's optional, but FIND_PACKAGE gives a warning that looks more like an
174
- # error.
175
- FIND_PACKAGE (ZLIB QUIET )
184
+ FIND_PACKAGE (ZLIB)
176
185
IF (ZLIB_FOUND)
177
186
INCLUDE_DIRECTORIES (${ZLIB_INCLUDE_DIRS} )
178
187
LINK_LIBRARIES (${ZLIB_LIBRARIES} )
179
- IF (APPLE )
188
+ IF (APPLE OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD" )
180
189
SET (LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} -lz" )
181
190
ELSE ()
182
191
SET (LIBGIT2_PC_REQUIRES "${LIBGIT2_PC_REQUIRES} zlib" )
183
192
ENDIF ()
184
- # Fake the message CMake would have shown
185
- MESSAGE ("-- Found zlib: ${ZLIB_LIBRARY} " )
186
193
ELSE ()
187
- MESSAGE ( "zlib was not found; using bundled 3rd-party sources." )
194
+ MESSAGE (STATUS "zlib was not found; using bundled 3rd-party sources." )
188
195
INCLUDE_DIRECTORIES (deps/zlib)
189
196
ADD_DEFINITIONS (-DNO_VIZ -DSTDC -DNO_GZIP)
190
197
FILE (GLOB SRC_ZLIB deps/zlib/*.c deps/zlib/*.h)
191
198
ENDIF ()
192
199
193
- IF (USE_SSH AND NOT MINGW)
194
- FIND_PACKAGE (LIBSSH2 QUIET )
200
+ # Optional external dependency: libssh2
201
+ IF (USE_SSH)
202
+ FIND_PACKAGE (LIBSSH2)
195
203
ENDIF ()
196
204
IF (LIBSSH2_FOUND)
197
205
ADD_DEFINITIONS (-DGIT_SSH)
@@ -200,6 +208,15 @@ IF (LIBSSH2_FOUND)
200
208
SET (SSH_LIBRARIES ${LIBSSH2_LIBRARIES} )
201
209
ENDIF ()
202
210
211
+ # Optional external dependency: iconv
212
+ IF (USE_ICONV)
213
+ FIND_PACKAGE (Iconv)
214
+ ENDIF ()
215
+ IF (ICONV_FOUND)
216
+ ADD_DEFINITIONS (-DGIT_USE_ICONV)
217
+ INCLUDE_DIRECTORIES (${ICONV_INCLUDE_DIR} )
218
+ SET (LIBGIT2_PC_LIBS "${LIBGIT2_PC_LIBS} ${ICONV_LIBRARIES} " )
219
+ ENDIF ()
203
220
204
221
# Platform specific compilation flags
205
222
IF (MSVC )
@@ -274,7 +291,11 @@ IF (MSVC)
274
291
# Precompiled headers
275
292
276
293
ELSE ()
277
- SET (CMAKE_C_FLAGS "-D_GNU_SOURCE -Wall -Wextra -Wno-missing-field-initializers -Wstrict-aliasing=2 -Wstrict-prototypes ${CMAKE_C_FLAGS} " )
294
+ SET (CMAKE_C_FLAGS "-D_GNU_SOURCE -Wall -Wextra ${CMAKE_C_FLAGS} " )
295
+
296
+ IF (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)" )
297
+ SET (CMAKE_C_FLAGS "-std=c99 -D_POSIX_C_SOURCE=200112L -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS ${CMAKE_C_FLAGS} " )
298
+ ENDIF ()
278
299
279
300
IF (WIN32 AND NOT CYGWIN )
280
301
SET (CMAKE_C_FLAGS_DEBUG "-D_DEBUG" )
@@ -288,11 +309,22 @@ ELSE ()
288
309
ADD_DEFINITIONS (-D__USE_MINGW_ANSI_STDIO=1)
289
310
290
311
ELSEIF (BUILD_SHARED_LIBS )
291
- SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fPIC" )
312
+ ADD_C_FLAG_IF_SUPPORTED(-fvisibility=hidden)
313
+
314
+ SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC" )
292
315
ENDIF ()
316
+
317
+ ADD_C_FLAG_IF_SUPPORTED(-Wno-missing-field-initializers)
318
+ ADD_C_FLAG_IF_SUPPORTED(-Wstrict-aliasing=2)
319
+ ADD_C_FLAG_IF_SUPPORTED(-Wstrict-prototypes)
320
+ ADD_C_FLAG_IF_SUPPORTED(-Wdeclaration-after-statement)
321
+ ADD_C_FLAG_IF_SUPPORTED(-Wno-unused-const-variable )
322
+ ADD_C_FLAG_IF_SUPPORTED(-Wno-unused-function)
323
+
293
324
IF (APPLE ) # Apple deprecated OpenSSL
294
- SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations" )
295
- ENDIF ()
325
+ ADD_C_FLAG_IF_SUPPORTED(-Wno-deprecated-declarations)
326
+ ENDIF ()
327
+
296
328
IF (PROFILE)
297
329
SET (CMAKE_C_FLAGS "-pg ${CMAKE_C_FLAGS} " )
298
330
SET (CMAKE_EXE_LINKER_FLAGS "-pg ${CMAKE_EXE_LINKER_FLAGS} " )
@@ -317,7 +349,7 @@ ENDIF()
317
349
318
350
IF (THREADSAFE)
319
351
IF (NOT WIN32 )
320
- find_package (Threads REQUIRED)
352
+ FIND_PACKAGE (Threads REQUIRED)
321
353
ENDIF ()
322
354
323
355
ADD_DEFINITIONS (-DGIT_THREADS)
@@ -333,9 +365,11 @@ IF (WIN32 AND NOT CYGWIN)
333
365
ADD_DEFINITIONS (-DWIN32 -D_WIN32_WINNT=0x0501)
334
366
FILE (GLOB SRC_OS src/win32 /*.c src/win32 /*.h)
335
367
ELSEIF (AMIGA)
336
- ADD_DEFINITIONS (-DNO_ADDRINFO -DNO_READDIR_R)
337
- FILE (GLOB SRC_OS src/amiga/*.c src/amiga/*.h)
368
+ ADD_DEFINITIONS (-DNO_ADDRINFO -DNO_READDIR_R -DNO_MMAP)
338
369
ELSE ()
370
+ IF (VALGRIND)
371
+ ADD_DEFINITIONS (-DNO_MMAP)
372
+ ENDIF ()
339
373
FILE (GLOB SRC_OS src/unix /*.c src/unix /*.h)
340
374
ENDIF ()
341
375
FILE (GLOB SRC_GIT2 src/*.c src/*.h src/transports/*.c src/transports/*.h src/xdiff/*.c src/xdiff/*.h)
@@ -346,13 +380,14 @@ IF (CMAKE_SIZEOF_VOID_P EQUAL 8)
346
380
ELSEIF (CMAKE_SIZEOF_VOID_P EQUAL 4)
347
381
ADD_DEFINITIONS (-DGIT_ARCH_32)
348
382
ELSE ()
349
- message (FATAL_ERROR "Unsupported architecture" )
383
+ MESSAGE (FATAL_ERROR "Unsupported architecture" )
350
384
ENDIF ()
351
385
352
386
# Compile and link libgit2
353
387
ADD_LIBRARY (git2 ${SRC_H} ${SRC_GIT2} ${SRC_OS} ${SRC_ZLIB} ${SRC_HTTP} ${SRC_REGEX} ${SRC_SHA1} ${WIN_RC} )
354
388
TARGET_LINK_LIBRARIES (git2 ${SSL_LIBRARIES} )
355
389
TARGET_LINK_LIBRARIES (git2 ${SSH_LIBRARIES} )
390
+ TARGET_LINK_LIBRARIES (git2 ${ICONV_LIBRARIES} )
356
391
TARGET_OS_LIBRARIES(git2)
357
392
358
393
# Workaround for Cmake bug #0011240 (see http://public.kitware.com/Bug/view.php?id=11240)
@@ -365,7 +400,7 @@ MSVC_SPLIT_SOURCES(git2)
365
400
366
401
IF (SONAME)
367
402
SET_TARGET_PROPERTIES (git2 PROPERTIES VERSION ${LIBGIT2_VERSION_STRING} )
368
- SET_TARGET_PROPERTIES (git2 PROPERTIES SOVERSION ${LIBGIT2_VERSION_MAJOR } )
403
+ SET_TARGET_PROPERTIES (git2 PROPERTIES SOVERSION ${LIBGIT2_SOVERSION } )
369
404
IF (LIBGIT2_FILENAME)
370
405
ADD_DEFINITIONS (-DLIBGIT2_FILENAME=\"${LIBGIT2_FILENAME} \")
371
406
SET_TARGET_PROPERTIES (git2 PROPERTIES OUTPUT_NAME ${LIBGIT2_FILENAME} )
@@ -418,6 +453,7 @@ IF (BUILD_CLAR)
418
453
419
454
TARGET_LINK_LIBRARIES (libgit2_clar ${SSL_LIBRARIES} )
420
455
TARGET_LINK_LIBRARIES (libgit2_clar ${SSH_LIBRARIES} )
456
+ TARGET_LINK_LIBRARIES (libgit2_clar ${ICONV_LIBRARIES} )
421
457
TARGET_OS_LIBRARIES(libgit2_clar)
422
458
MSVC_SPLIT_SOURCES(libgit2_clar)
423
459
@@ -433,7 +469,7 @@ ENDIF ()
433
469
IF (TAGS)
434
470
FIND_PROGRAM (CTAGS ctags)
435
471
IF (NOT CTAGS)
436
- message (FATAL_ERROR "Could not find ctags command" )
472
+ MESSAGE (FATAL_ERROR "Could not find ctags command" )
437
473
ENDIF ()
438
474
439
475
FILE (GLOB_RECURSE SRC_ALL *.[ch])
0 commit comments