Makefile 97.5 KB
Newer Older
1
# The default target of this Makefile is...
2
all::
3

S
Shawn O. Pearce 已提交
4
# Define V=1 to have a more verbose compile.
5
#
6 7 8 9 10
# Define SHELL_PATH to a POSIX shell if your /bin/sh is broken.
#
# Define SANE_TOOL_PATH to a colon-separated list of paths to prepend
# to PATH if your tools in /usr/bin are broken.
#
11 12 13
# Define SOCKLEN_T to a suitable type (such as 'size_t') if your
# system headers do not define a socklen_t type.
#
G
Gary V. Vaughan 已提交
14 15 16
# Define INLINE to a suitable substitute (such as '__inline' or '') if git
# fails to compile with errors about undefined inline functions or similar.
#
17
# Define SNPRINTF_RETURNS_BOGUS if you are on a system which snprintf()
18 19 20
# or vsnprintf() return -1 instead of number of characters which would
# have been written to the final string if enough space had been available.
#
21
# Define FREAD_READS_DIRECTORIES if you are on a system which succeeds
22 23
# when attempting to read from an fopen'ed directory (or even to fopen
# it at all).
24
#
25
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
26
#
27 28 29 30
# Define USE_LIBPCRE if you have and want to use libpcre. Various
# commands such as log and grep offer runtime options to use
# Perl-compatible regular expressions instead of standard or extended
# POSIX regular expressions.
M
Michał Kiedrowicz 已提交
31
#
32 33 34 35
# USE_LIBPCRE is a synonym for USE_LIBPCRE2, define USE_LIBPCRE1
# instead if you'd like to use the legacy version 1 of the PCRE
# library. Support for version 1 will likely be removed in some future
# release of Git, as upstream has all but abandoned it.
36
#
37 38 39 40 41 42 43 44
# When using USE_LIBPCRE1, define NO_LIBPCRE1_JIT if the PCRE v1
# library is compiled without --enable-jit. We will auto-detect
# whether the version of the PCRE v1 library in use has JIT support at
# all, but we unfortunately can't auto-detect whether JIT support
# hasn't been compiled in in an otherwise JIT-supporting version. If
# you have link-time errors about a missing `pcre_jit_exec` define
# this, or recompile PCRE v1 with --enable-jit.
#
45 46 47 48
# Define LIBPCREDIR=/foo/bar if your PCRE header and library files are
# in /foo/bar/include and /foo/bar/lib directories. Which version of
# PCRE this points to determined by the USE_LIBPCRE1 and USE_LIBPCRE2
# variables.
M
Michał Kiedrowicz 已提交
49
#
K
Kirill Smelkov 已提交
50 51
# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
#
52
# Define NO_CURL if you do not have libcurl installed.  git-http-fetch and
53
# git-http-push are not built, and you cannot use http:// and https://
54
# transports (neither smart nor dumb).
55
#
P
Patrick Mauritz 已提交
56
# Define CURLDIR=/foo/bar if your curl header and library files are in
57
# /foo/bar/include and /foo/bar/lib directories.
P
Patrick Mauritz 已提交
58
#
59 60 61
# Define CURL_CONFIG to curl's configuration program that prints information
# about the library (e.g., its version number).  The default is 'curl-config'.
#
62 63 64 65 66 67 68
# Define CURL_LDFLAGS to specify flags that you need to link when using libcurl,
# if you do not want to rely on the libraries provided by CURL_CONFIG.  The
# default value is a result of `curl-config --libs`.  An example value for
# CURL_LDFLAGS is as follows:
#
#     CURL_LDFLAGS=-lcurl
#
69
# Define NO_EXPAT if you do not have expat installed.  git-http-push is
70
# not built, and you cannot push using http:// and https:// transports (dumb).
71
#
72 73 74
# Define EXPATDIR=/foo/bar if your expat header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
M
Matt Kraai 已提交
75 76 77
# Define EXPAT_NEEDS_XMLPARSE_H if you have an old version of expat (e.g.,
# 1.1 or 1.2) that provides xmlparse.h instead of expat.h.
#
78 79 80 81
# Define NO_GETTEXT if you don't want Git output to be translated.
# A translated Git requires GNU libintl or another gettext implementation,
# plus libintl-perl at runtime.
#
82 83 84
# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust
# the installed gettext translation of the shell scripts output.
#
85 86 87 88 89 90
# Define HAVE_LIBCHARSET_H if you haven't set NO_GETTEXT and you can't
# trust the langinfo.h's nl_langinfo(CODESET) function to return the
# current character set. GNU and Solaris have a nl_langinfo(CODESET),
# FreeBSD can use either, but MinGW and some others need to use
# libcharset.h's locale_charset() instead.
#
91
# Define CHARSET_LIB to the library you need to link with in order to
92
# use locale_charset() function.  On some platforms this needs to set to
93
# -lcharset, on others to -liconv .
94
#
95 96 97 98 99 100
# Define LIBC_CONTAINS_LIBINTL if your gettext implementation doesn't
# need -lintl when linking.
#
# Define NO_MSGFMT_EXTENDED_OPTIONS if your implementation of msgfmt
# doesn't support GNU extensions like --check and --statistics
#
101 102 103
# Define HAVE_PATHS_H if you have paths.h and want to use the default PATH
# it specifies.
#
104
# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
105
# d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
106
#
107 108
# Define HAVE_STRINGS_H if you have strings.h and need it for strcasecmp.
#
109 110
# Define NO_STRCASESTR if you don't have strcasestr.
#
R
René Scharfe 已提交
111 112
# Define NO_MEMMEM if you don't have memmem.
#
M
Matt Kraai 已提交
113 114
# Define NO_GETPAGESIZE if you don't have getpagesize.
#
115 116
# Define NO_STRLCPY if you don't have strlcpy.
#
117 118
# Define NO_STRTOUMAX if you don't have both strtoimax and strtoumax in the
# C library. If your compiler also does not support long long or does not have
119 120
# strtoull, define NO_STRTOULL.
#
J
Jason Riedy 已提交
121 122
# Define NO_SETENV if you don't have setenv in the C library.
#
123 124
# Define NO_UNSETENV if you don't have unsetenv in the C library.
#
125 126
# Define NO_MKDTEMP if you don't have mkdtemp in the C library.
#
127 128
# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
#
129 130 131
# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
# in the C library.
#
132 133
# Define NO_LIBGEN_H if you don't have libgen.h.
#
134 135
# Define NEEDS_LIBGEN if your libgen needs -lgen when linking
#
136 137
# Define NO_SYS_SELECT_H if you don't have sys/select.h.
#
138 139
# Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link.
# Enable it on Windows.  By default, symrefs are still used.
140
#
P
Pavel Roskin 已提交
141
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
E
Eric Wong 已提交
142 143 144
# tests.  These tests take up a significant amount of the total test time
# but are not needed unless you plan to talk to SVN repos.
#
145 146 147 148 149 150 151 152 153 154 155 156
# Define NO_FINK if you are building on Darwin/Mac OS X, have Fink
# installed in /sw, but don't want GIT to link against any libraries
# installed there.  If defined you may specify your own (or Fink's)
# include directories and library directories by defining CFLAGS
# and LDFLAGS appropriately.
#
# Define NO_DARWIN_PORTS if you are building on Darwin/Mac OS X,
# have DarwinPorts installed in /opt/local, but don't want GIT to
# link against any libraries installed there.  If defined you may
# specify your own (or DarwinPort's) include directories and
# library directories by defining CFLAGS and LDFLAGS appropriately.
#
157 158 159 160
# Define NO_APPLE_COMMON_CRYPTO if you are building on Darwin/Mac OS X
# and do not want to use Apple's CommonCrypto library.  This allows you
# to provide your own OpenSSL library, for example from MacPorts.
#
161 162
# Define BLK_SHA1 environment variable to make use of the bundled
# optimized C SHA1 routine.
163
#
164 165
# Define PPC_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for PowerPC.
166
#
J
Jeff King 已提交
167 168 169 170
# Define DC_SHA1 to unconditionally enable the collision-detecting sha1
# algorithm. This is slower, but may detect attempted collision attacks.
# Takes priority over other *_SHA1 knobs.
#
171 172 173 174 175
# Define DC_SHA1_EXTERNAL in addition to DC_SHA1 if you want to build / link
# git with the external SHA1 collision-detect library.
# Without this option, i.e. the default behavior is to build git with its
# own built-in code (or submodule).
#
176 177 178 179 180 181
# Define DC_SHA1_SUBMODULE in addition to DC_SHA1 to use the
# sha1collisiondetection shipped as a submodule instead of the
# non-submodule copy in sha1dc/. This is an experimental option used
# by the git project to migrate to using sha1collisiondetection as a
# submodule.
#
182 183 184
# Define OPENSSL_SHA1 environment variable when running make to link
# with the SHA1 routine from openssl library.
#
185 186 187 188
# Define SHA1_MAX_BLOCK_SIZE to limit the amount of data that will be hashed
# in one call to the platform's SHA1_Update(). e.g. APPLE_COMMON_CRYPTO
# wants 'SHA1_MAX_BLOCK_SIZE=1024L*1024L*1024L' defined.
#
189 190 191 192
# Define BLK_SHA256 to use the built-in SHA-256 routines.
#
# Define GCRYPT_SHA256 to use the SHA-256 routines in libgcrypt.
#
193 194
# Define OPENSSL_SHA256 to use the SHA-256 routines in OpenSSL.
#
195 196 197
# Define NEEDS_CRYPTO_WITH_SSL if you need -lcrypto when using -lssl (Darwin).
#
# Define NEEDS_SSL_WITH_CRYPTO if you need -lssl when using -lcrypto (Darwin).
198
#
199
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
200
#
J
Joachim Schmitz 已提交
201 202
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
J
Justin Lebar 已提交
203
# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t.
J
Joachim Schmitz 已提交
204 205 206
#
# Define NO_UINTMAX_T if you don't have uintmax_t.
#
207 208 209
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
210 211 212 213
# Define NEEDS_RESOLV if linking with -lnsl and/or -lsocket is not enough.
# Notably on Solaris hstrerror resides in libresolv and on Solaris 7
# inet_ntop and inet_pton additionally reside there.
#
214 215
# Define NO_MMAP if you want to avoid mmap.
#
216 217 218
# Define MMAP_PREVENTS_DELETE if a file that is currently mmapped cannot be
# deleted or cannot be replaced using rename().
#
219 220
# Define NO_POLL_H if you don't have poll.h.
#
221 222 223
# Define NO_SYS_POLL_H if you don't have sys/poll.h.
#
# Define NO_POLL if you do not have or don't want to use poll().
224
# This also implies NO_POLL_H and NO_SYS_POLL_H.
225
#
226 227 228
# Define NEEDS_SYS_PARAM_H if you need to include sys/param.h to compile,
# *PLEASE* REPORT to git@vger.kernel.org if your platform needs this;
# we want to know more about the issue.
229
#
J
Junio C Hamano 已提交
230 231
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
232
# Define NO_PREAD if you have a problem with pread() system call (e.g.
233
# cygwin1.dll before v1.5.22).
234
#
235 236 237 238 239
# Define NO_SETITIMER if you don't have setitimer()
#
# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
# This also implies NO_SETITIMER
#
240 241 242
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
243 244 245
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
# the executable mode bit, but doesn't really do so.
#
246 247 248 249
# Define NEEDS_MODE_TRANSLATION if your OS strays from the typical file type
# bits in mode values (e.g. z/OS defines I_SFMT to 0xFF000000 as opposed to the
# usual 0xF000).
#
250 251
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
#
252 253
# Define NO_UNIX_SOCKETS if your system does not offer unix sockets.
#
254 255 256
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
257 258
# Define NO_ICONV if your libc does not properly support iconv.
#
259 260 261
# Define OLD_ICONV if your library has an old iconv(), where the second
# (input buffer pointer) parameter is declared with type (const char **).
#
262 263 264 265
# Define ICONV_OMITS_BOM if your iconv implementation does not write a
# byte-order mark (BOM) when writing UTF-16 or UTF-32 and always writes in
# big-endian format.
#
266 267
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
#
268 269 270
# Define NO_R_TO_GCC_LINKER if your gcc does not like "-R/path/lib"
# that tells runtime paths to dynamic libraries;
# "-Wl,-rpath=/path/lib" is used instead.
271
#
J
Junio C Hamano 已提交
272 273 274
# Define NO_NORETURN if using buggy versions of gcc 4.6+ and profile feedback,
# as the compiler can crash (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49299)
#
275
# Define USE_NSEC below if you want git to care about sub-second file mtimes
276 277 278 279 280
# and ctimes. Note that you need recent glibc (at least 2.2.4) for this. On
# Linux, kernel 2.6.11 or newer is required for reliable sub-second file times
# on file systems with exactly 1 ns or 1 s resolution. If you intend to use Git
# on other file systems (e.g. CEPH, CIFS, NTFS, UDF), don't enable USE_NSEC. See
# Documentation/technical/racy-git.txt for details.
281
#
282 283 284
# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
# "st_ctim"
#
285 286 287
# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
# available.  This automatically turns USE_NSEC off.
#
288
# Define USE_STDEV below if you want git to care about the underlying device
289
# change being considered an inode change from the update-index perspective.
290
#
291 292 293
# Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks
# field that counts the on-disk footprint in 512-byte blocks.
#
294 295 296
# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72
# (not v1.73 or v1.71).
#
J
Jeff King 已提交
297 298
# Define ASCIIDOC_ROFF if your DocBook XSL does not escape raw roff directives
# (versions 1.68.1 through v1.72).
299
#
T
Thomas Rast 已提交
300 301 302 303
# Define GNU_ROFF if your target system uses GNU groff.  This forces
# apostrophes to be ASCII so that cut&pasting examples to the shell
# will work.
#
304 305 306 307 308 309
# Define USE_ASCIIDOCTOR to use Asciidoctor instead of AsciiDoc to build the
# documentation.
#
# Define ASCIIDOCTOR_EXTENSIONS_LAB to point to the location of the Asciidoctor
# Extensions Lab if you have it available.
#
310 311
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
312 313
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
314 315 316 317 318 319
# Define NO_PERL_CPAN_FALLBACKS if you do not want to install bundled
# copies of CPAN modules that serve as a fallback in case the modules
# are not available on the system. This option is intended for
# distributions that want to use their packaged versions of Perl
# modules, instead of the fallbacks shipped with Git.
#
320 321 322
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
# but /usr/bin/python2.7 on some platforms).
#
323 324
# Define NO_PYTHON if you do not want Python scripts or libraries at all.
#
E
Eygene Ryabinkin 已提交
325 326
# Define NO_TCLTK if you do not want Tcl/Tk GUI.
#
327 328 329
# Define SANE_TEXT_GREP to "-a" if you use recent versions of GNU grep
# and egrep that are pickier when their input contains non-ASCII data.
#
330 331 332 333 334
# The TCL_PATH variable governs the location of the Tcl interpreter
# used to optimize git-gui for your system.  Only used if NO_TCLTK
# is not set.  Defaults to the bare 'tclsh'.
#
# The TCLTK_PATH variable governs the location of the Tcl/Tk interpreter.
335 336 337
# If not set it defaults to the bare 'wish'. If it is set to the empty
# string then NO_TCLTK will be forced (this is used by configure script).
#
338 339 340 341
# Define INTERNAL_QSORT to use Git's implementation of qsort(), which
# is a simplified version of the merge sort used in glibc. This is
# recommended if Git triggers O(n^2) behavior in your platform's qsort().
#
R
René Scharfe 已提交
342 343 344
# Define HAVE_ISO_QSORT_S if your platform provides a qsort_s() that's
# compatible with the one described in C11 Annex K.
#
345 346 347
# Define UNRELIABLE_FSTAT if your system's fstat does not return the same
# information on a not yet closed file that lstat would return for the same
# file after it was closed.
348
#
349 350
# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
# when hardlinking a file to another name and unlinking the original file right
351
# away (some NTFS drivers seem to zero the contents in that scenario).
352
#
353 354 355 356 357 358 359
# Define INSTALL_SYMLINKS if you prefer to have everything that can be
# symlinked between bin/ and libexec/ to use relative symlinks between
# the two. This option overrides NO_CROSS_DIRECTORY_HARDLINKS and
# NO_INSTALL_HARDLINKS which will also use symlinking by indirection
# within the same directory in some cases, INSTALL_SYMLINKS will
# always symlink to the final target directly.
#
360 361
# Define NO_CROSS_DIRECTORY_HARDLINKS if you plan to distribute the installed
# programs as a tar, where bin/ and libexec/ might be on different file systems.
362
#
J
Junio C Hamano 已提交
363 364 365
# Define NO_INSTALL_HARDLINKS if you prefer to use either symbolic links or
# copies to install built-in git commands e.g. git-cat-file.
#
366 367
# Define USE_NED_ALLOCATOR if you want to replace the platforms default
# memory allocators with the nedmalloc allocator written by Niall Douglas.
368
#
369 370 371 372 373
# Define OVERRIDE_STRDUP to override the libc version of strdup(3).
# This is necessary when using a custom allocator in order to avoid
# crashes due to allocation and free working on different 'heaps'.
# It's defined automatically if USE_NED_ALLOCATOR is set.
#
374 375
# Define NO_REGEX if your C library lacks regex support with REG_STARTEND
# feature.
376
#
J
Jeff King 已提交
377 378 379
# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
# user.
#
380 381
# Define JSMIN to point to JavaScript minifier that functions as
# a filter to have gitweb.js minified.
J
Junio C Hamano 已提交
382
#
383 384 385
# Define CSSMIN to point to a CSS minifier in order to generate a minified
# version of gitweb.css
#
386 387 388 389
# Define DEFAULT_PAGER to a sensible pager command (defaults to "less") if
# you want to use something different.  The value will be interpreted by the
# shell at runtime when it is used.
#
390 391 392 393 394 395 396
# Define DEFAULT_EDITOR to a sensible editor command (defaults to "vi") if you
# want to use something different.  The value will be interpreted by the shell
# if necessary when it is used.  Examples:
#
#   DEFAULT_EDITOR='~/bin/vi',
#   DEFAULT_EDITOR='$GIT_FALLBACK_EDITOR',
#   DEFAULT_EDITOR='"C:\Program Files\Vim\gvim.exe" --nofork'
397
#
398 399 400 401 402 403
# Define COMPUTE_HEADER_DEPENDENCIES to "yes" if you want dependencies on
# header files to be automatically computed, to avoid rebuilding objects when
# an unrelated header file changes.  Define it to "no" to use the hard-coded
# dependency rules.  The default is "auto", which means to use computed header
# dependencies if your compiler is detected to support it.
#
404
# Define NATIVE_CRLF if your platform uses CRLF for line endings.
405
#
J
Jeff King 已提交
406 407
# Define GIT_USER_AGENT if you want to change how git identifies itself during
# network interactions.  The default is "git/$(GIT_VERSION)".
408
#
409 410 411
# Define DEFAULT_HELP_FORMAT to "man", "info" or "html"
# (defaults to "man") if you want to have a different default when
# "git help" is called without a parameter specifying the format.
412
#
413
# Define GIT_TEST_INDEX_VERSION to 2, 3 or 4 to run the test suite
414 415
# with a different indexfile format version.  If it isn't set the index
# file format used is index-v[23].
416
#
417 418
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
419
#
420
# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
421
#
422 423 424 425
# Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC.
#
# Define NEEDS_LIBRT if your platform requires linking with librt (glibc version
# before 2.17) for clock_gettime and CLOCK_MONOTONIC.
426
#
427 428 429 430 431 432 433 434
# Define USE_PARENS_AROUND_GETTEXT_N to "yes" if your compiler happily
# compiles the following initialization:
#
#   static const char s[] = ("FOO");
#
# and define it to "no" if you need to remove the parentheses () around the
# constant.  The default is "auto", which means to use parentheses if your
# compiler is detected to support it.
J
Junio C Hamano 已提交
435
#
436
# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
437 438
#
# Define HAVE_GETDELIM if your system has the getdelim() function.
439
#
440 441
# Define FILENO_IS_A_MACRO if fileno() is a macro, not a real function.
#
442 443 444
# Define NEED_ACCESS_ROOT_HANDLER if access() under root may success for X_OK
# even if execution permission isn't granted for any user.
#
445 446 447 448 449 450 451
# Define PAGER_ENV to a SP separated VAR=VAL pairs to define
# default environment variables to be passed when a pager is spawned, e.g.
#
#    PAGER_ENV = LESS=FRX LV=-c
#
# to say "export LESS=FRX (and LV=-c) if the environment variable
# LESS (and LV) is not set, respectively".
452
#
J
Jeff King 已提交
453 454 455
# Define TEST_SHELL_PATH if you want to use a shell besides SHELL_PATH for
# running the test scripts (e.g., bash has better support for "set -x"
# tracing).
456
#
457 458
# When cross-compiling, define HOST_CPU as the canonical name of the CPU on
# which the built Git will run (for instance "x86_64").
459 460 461 462 463 464 465
#
# Define RUNTIME_PREFIX to configure Git to resolve its ancillary tooling and
# support files relative to the location of the runtime binary, rather than
# hard-coding them into the binary. Git installations built with RUNTIME_PREFIX
# can be moved to arbitrary filesystem locations. RUNTIME_PREFIX also causes
# Perl scripts to use a modified entry point header allowing them to resolve
# support files at runtime.
466 467 468 469 470 471 472 473 474 475 476 477
#
# When using RUNTIME_PREFIX, define HAVE_BSD_KERN_PROC_SYSCTL if your platform
# supports the KERN_PROC BSD sysctl function.
#
# When using RUNTIME_PREFIX, define PROCFS_EXECUTABLE_PATH if your platform
# mounts a "procfs" filesystem capable of resolving the path of the current
# executable. If defined, this must be the canonical path for the "procfs"
# current executable path.
#
# When using RUNTIME_PREFIX, define HAVE_NS_GET_EXECUTABLE_PATH if your platform
# supports calling _NSGetExecutablePath to retrieve the path of the running
# executable.
478 479 480 481
#
# When using RUNTIME_PREFIX, define HAVE_WPGMPTR if your platform offers
# the global variable _wpgmptr containing the absolute path of the current
# executable (this is the case on Windows).
482
#
483 484
# Define DEVELOPER to enable more compiler warnings. Compiler version
# and family are auto detected, but could be overridden by defining
485 486 487 488 489
# COMPILER_FEATURES (see config.mak.dev). You can still set
# CFLAGS="..." in combination with DEVELOPER enables, whether that's
# for tweaking something unrelated (e.g. optimization level), or for
# selectively overriding something DEVELOPER or one of the DEVOPTS
# (see just below) brings in.
490 491 492 493 494 495 496 497 498 499
#
# When DEVELOPER is set, DEVOPTS can be used to control compiler
# options.  This variable contains keywords separated by
# whitespace. The following keywords are are recognized:
#
#    no-error:
#
#        suppresses the -Werror that implicitly comes with
#        DEVELOPER=1. Useful for getting the full set of errors
#        without immediately dying, or for logging them.
500 501 502 503 504 505
#
#    extra-all:
#
#        The DEVELOPER mode enables -Wextra with a few exceptions. By
#        setting this flag the exceptions are removed, and all of
#        -Wextra is used.
506 507 508 509 510
#
#    pedantic:
#
#        Enable -pedantic compilation. This also disables
#        USE_PARENS_AROUND_GETTEXT_N to produce only relevant warnings.
511

512
GIT-VERSION-FILE: FORCE
513
	@$(SHELL_PATH) ./GIT-VERSION-GEN
514
-include GIT-VERSION-FILE
515

516 517
# Set our default configuration.
#
518 519 520
# Among the variables below, these:
#   gitexecdir
#   template_dir
521
#   sysconfdir
522 523
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
524
# runtime figures out where they are based on the path to the executable.
525 526 527 528 529
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
530 531
#   localedir
#   perllibdir
532 533
# This can help installing the suite in a relocatable way.

534
prefix = $(HOME)
535
bindir = $(prefix)/bin
536 537
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
538
gitexecdir = libexec/git-core
539
mergetoolsdir = $(gitexecdir)/mergetools
540
sharedir = $(prefix)/share
541
gitwebdir = $(sharedir)/gitweb
542
perllibdir = $(sharedir)/perl5
543
localedir = $(sharedir)/locale
544
template_dir = share/git-core/templates
545
htmldir = $(prefix)/share/doc/git-doc
546
ETC_GITCONFIG = $(sysconfdir)/gitconfig
547
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
548
lib = lib
549
# DESTDIR =
550
pathsep = :
551

552
bindir_relative = $(patsubst $(prefix)/%,%,$(bindir))
553 554
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
555
gitexecdir_relative = $(patsubst $(prefix)/%,%,$(gitexecdir))
556
localedir_relative = $(patsubst $(prefix)/%,%,$(localedir))
557
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))
558
perllibdir_relative = $(patsubst $(prefix)/%,%,$(perllibdir))
559

560
export prefix bindir sharedir sysconfdir gitwebdir perllibdir localedir
561

562
# Set our default programs
563
CC = cc
564
AR = ar
565
RM = rm -f
566
DIFF = diff
567
TAR = tar
568
FIND = find
569
INSTALL = install
570
TCL_PATH = tclsh
571
TCLTK_PATH = wish
572
XGETTEXT = xgettext
573
MSGFMT = msgfmt
574
CURL_CONFIG = curl-config
575
GCOV = gcov
576
STRIP = strip
R
René Scharfe 已提交
577
SPATCH = spatch
578

579 580
export TCL_PATH TCLTK_PATH

581 582
# Set our default LIBS variables
PTHREAD_LIBS = -lpthread
583

584 585 586 587 588
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
589 590
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
591
GENERATED_H =
592
EXTRA_CPPFLAGS =
593 594
FUZZ_OBJS =
FUZZ_PROGRAMS =
595
LIB_OBJS =
596
PROGRAM_OBJS =
597
PROGRAMS =
598
EXCLUDED_PROGRAMS =
599
SCRIPT_PERL =
600
SCRIPT_PYTHON =
601
SCRIPT_SH =
602
SCRIPT_LIB =
603
TEST_BUILTINS_OBJS =
604
TEST_PROGRAMS_NEED_X =
605

J
Jonathan Nieder 已提交
606 607 608 609 610 611
# Having this variable in your environment would break pipelines because
# you cause "cd" to echo its destination to stdout.  It can also take
# scripts to unexpected places.  If you like CDPATH, define it for your
# interactive shell sessions without exporting it.
unexport CDPATH

612
SCRIPT_SH += git-bisect.sh
613
SCRIPT_SH += git-difftool--helper.sh
614 615 616 617 618 619
SCRIPT_SH += git-filter-branch.sh
SCRIPT_SH += git-merge-octopus.sh
SCRIPT_SH += git-merge-one-file.sh
SCRIPT_SH += git-merge-resolve.sh
SCRIPT_SH += git-mergetool.sh
SCRIPT_SH += git-quiltimport.sh
620
SCRIPT_SH += git-legacy-stash.sh
621 622 623 624
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

625 626
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
627
SCRIPT_LIB += git-rebase--am
628
SCRIPT_LIB += git-rebase--common
629
SCRIPT_LIB += git-rebase--preserve-merges
630
SCRIPT_LIB += git-sh-setup
631
SCRIPT_LIB += git-sh-i18n
632

633 634 635 636 637 638 639
SCRIPT_PERL += git-add--interactive.perl
SCRIPT_PERL += git-archimport.perl
SCRIPT_PERL += git-cvsexportcommit.perl
SCRIPT_PERL += git-cvsimport.perl
SCRIPT_PERL += git-cvsserver.perl
SCRIPT_PERL += git-send-email.perl
SCRIPT_PERL += git-svn.perl
640

P
Pete Wyckoff 已提交
641
SCRIPT_PYTHON += git-p4.py
642

643 644 645 646 647 648 649 650 651 652 653 654 655 656
# Generated files for scripts
SCRIPT_SH_GEN = $(patsubst %.sh,%,$(SCRIPT_SH))
SCRIPT_PERL_GEN = $(patsubst %.perl,%,$(SCRIPT_PERL))
SCRIPT_PYTHON_GEN = $(patsubst %.py,%,$(SCRIPT_PYTHON))

# Individual rules to allow e.g.
# "make -C ../.. SCRIPT_PERL=contrib/foo/bar.perl build-perl-script"
# from subdirectories like contrib/*/
.PHONY: build-perl-script build-sh-script build-python-script
build-perl-script: $(SCRIPT_PERL_GEN)
build-sh-script: $(SCRIPT_SH_GEN)
build-python-script: $(SCRIPT_PYTHON_GEN)

.PHONY: install-perl-script install-sh-script install-python-script
657
install-sh-script: $(SCRIPT_SH_GEN)
F
Felipe Contreras 已提交
658
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
659
install-perl-script: $(SCRIPT_PERL_GEN)
F
Felipe Contreras 已提交
660
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
661
install-python-script: $(SCRIPT_PYTHON_GEN)
F
Felipe Contreras 已提交
662
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
663 664 665 666 667 668 669 670 671

.PHONY: clean-perl-script clean-sh-script clean-python-script
clean-sh-script:
	$(RM) $(SCRIPT_SH_GEN)
clean-perl-script:
	$(RM) $(SCRIPT_PERL_GEN)
clean-python-script:
	$(RM) $(SCRIPT_PYTHON_GEN)

672 673 674
SCRIPTS = $(SCRIPT_SH_GEN) \
	  $(SCRIPT_PERL_GEN) \
	  $(SCRIPT_PYTHON_GEN) \
675
	  git-instaweb
676

677 678
ETAGS_TARGET = TAGS

679
FUZZ_OBJS += fuzz-commit-graph.o
680
FUZZ_OBJS += fuzz-pack-headers.o
681
FUZZ_OBJS += fuzz-pack-idx.o
682 683 684 685 686 687

# Always build fuzz objects even if not testing, to prevent bit-rot.
all:: $(FUZZ_OBJS)

FUZZ_PROGRAMS += $(patsubst %.o,%,$(FUZZ_OBJS))

688 689
# Empty...
EXTRA_PROGRAMS =
690

691 692
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
693

694
PROGRAM_OBJS += credential-store.o
695
PROGRAM_OBJS += daemon.o
696
PROGRAM_OBJS += fast-import.o
697
PROGRAM_OBJS += http-backend.o
698
PROGRAM_OBJS += imap-send.o
699
PROGRAM_OBJS += sh-i18n--envsubst.o
700
PROGRAM_OBJS += shell.o
701
PROGRAM_OBJS += remote-testsvn.o
702

703 704 705
# Binary suffix, set to .exe for Windows builds
X =

706
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
707

708
TEST_BUILTINS_OBJS += test-chmtime.o
709
TEST_BUILTINS_OBJS += test-config.o
710
TEST_BUILTINS_OBJS += test-ctype.o
711
TEST_BUILTINS_OBJS += test-date.o
712
TEST_BUILTINS_OBJS += test-delta.o
713
TEST_BUILTINS_OBJS += test-drop-caches.o
714
TEST_BUILTINS_OBJS += test-dump-cache-tree.o
715
TEST_BUILTINS_OBJS += test-dump-fsmonitor.o
716
TEST_BUILTINS_OBJS += test-dump-split-index.o
717
TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
718
TEST_BUILTINS_OBJS += test-example-decorate.o
719
TEST_BUILTINS_OBJS += test-genrandom.o
720
TEST_BUILTINS_OBJS += test-genzeros.o
721
TEST_BUILTINS_OBJS += test-hash.o
722
TEST_BUILTINS_OBJS += test-hashmap.o
723
TEST_BUILTINS_OBJS += test-hash-speed.o
724
TEST_BUILTINS_OBJS += test-index-version.o
725
TEST_BUILTINS_OBJS += test-json-writer.o
726
TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
727
TEST_BUILTINS_OBJS += test-match-trees.o
728
TEST_BUILTINS_OBJS += test-mergesort.o
729
TEST_BUILTINS_OBJS += test-mktemp.o
730
TEST_BUILTINS_OBJS += test-online-cpus.o
731
TEST_BUILTINS_OBJS += test-parse-options.o
732
TEST_BUILTINS_OBJS += test-path-utils.o
733
TEST_BUILTINS_OBJS += test-pkt-line.o
734
TEST_BUILTINS_OBJS += test-prio-queue.o
735
TEST_BUILTINS_OBJS += test-reach.o
736
TEST_BUILTINS_OBJS += test-read-cache.o
737
TEST_BUILTINS_OBJS += test-read-midx.o
738
TEST_BUILTINS_OBJS += test-ref-store.o
739
TEST_BUILTINS_OBJS += test-regex.o
740
TEST_BUILTINS_OBJS += test-repository.o
741
TEST_BUILTINS_OBJS += test-revision-walking.o
742
TEST_BUILTINS_OBJS += test-run-command.o
743
TEST_BUILTINS_OBJS += test-scrap-cache-tree.o
744
TEST_BUILTINS_OBJS += test-serve-v2.o
745
TEST_BUILTINS_OBJS += test-sha1.o
746
TEST_BUILTINS_OBJS += test-sha1-array.o
747
TEST_BUILTINS_OBJS += test-sha256.o
748
TEST_BUILTINS_OBJS += test-sigchain.o
749
TEST_BUILTINS_OBJS += test-strcmp-offset.o
750
TEST_BUILTINS_OBJS += test-string-list.o
751
TEST_BUILTINS_OBJS += test-submodule-config.o
752
TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
753
TEST_BUILTINS_OBJS += test-subprocess.o
754
TEST_BUILTINS_OBJS += test-trace2.o
755
TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
756
TEST_BUILTINS_OBJS += test-xml-encode.o
757
TEST_BUILTINS_OBJS += test-wildmatch.o
758
TEST_BUILTINS_OBJS += test-windows-named-pipe.o
759
TEST_BUILTINS_OBJS += test-write-cache.o
760

761 762
# Do not add more tests here unless they have extra dependencies. Add
# them in TEST_BUILTINS_OBJS above.
J
Johannes Schindelin 已提交
763
TEST_PROGRAMS_NEED_X += test-fake-ssh
D
David Barr 已提交
764
TEST_PROGRAMS_NEED_X += test-line-buffer
D
David Barr 已提交
765
TEST_PROGRAMS_NEED_X += test-svn-fe
766
TEST_PROGRAMS_NEED_X += test-tool
767

768
TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
769

J
Junio C Hamano 已提交
770
# List built-in command $C whose implementation cmd_$C() is not in
771 772
# builtin/$C.o but is linked in as part of some other command.
BUILT_INS += $(patsubst builtin/%.o,git-%$X,$(BUILTIN_OBJS))
773 774

BUILT_INS += git-cherry$X
775
BUILT_INS += git-cherry-pick$X
776 777 778 779 780
BUILT_INS += git-format-patch$X
BUILT_INS += git-fsck-objects$X
BUILT_INS += git-init$X
BUILT_INS += git-merge-subtree$X
BUILT_INS += git-show$X
J
Junio C Hamano 已提交
781
BUILT_INS += git-stage$X
782 783
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
784

785 786
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
787
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
788

E
Eygene Ryabinkin 已提交
789
# what 'all' will build but not install in gitexecdir
790
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
791

792 793 794 795 796 797 798 799 800
# what test wrappers are needed and 'install' will install, in bindir
BINDIR_PROGRAMS_NEED_X += git
BINDIR_PROGRAMS_NEED_X += git-upload-pack
BINDIR_PROGRAMS_NEED_X += git-receive-pack
BINDIR_PROGRAMS_NEED_X += git-upload-archive
BINDIR_PROGRAMS_NEED_X += git-shell

BINDIR_PROGRAMS_NO_X += git-cvsserver

801 802 803 804 805 806 807
# Set paths to tools early so that they can be used for version tests.
ifndef SHELL_PATH
	SHELL_PATH = /bin/sh
endif
ifndef PERL_PATH
	PERL_PATH = /usr/bin/perl
endif
808 809 810
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
811

L
Luben Tuikov 已提交
812
export PERL_PATH
813
export PYTHON_PATH
L
Luben Tuikov 已提交
814

J
Jeff King 已提交
815 816
TEST_SHELL_PATH = $(SHELL_PATH)

817 818 819
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
820

N
Nguyễn Thái Ngọc Duy 已提交
821
GENERATED_H += command-list.h
822

823
LIB_H := $(sort $(shell git ls-files '*.h' ':!t/' ':!Documentation/' 2>/dev/null || \
824
	$(FIND) . \
825 826 827
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
828
	-name '*.h' -print))
829

830
LIB_OBJS += abspath.o
831
LIB_OBJS += advice.o
832 833
LIB_OBJS += alias.o
LIB_OBJS += alloc.o
834
LIB_OBJS += apply.o
835 836 837
LIB_OBJS += archive.o
LIB_OBJS += archive-tar.o
LIB_OBJS += archive-zip.o
838
LIB_OBJS += argv-array.o
839 840
LIB_OBJS += attr.o
LIB_OBJS += base85.o
841
LIB_OBJS += bisect.o
842
LIB_OBJS += blame.o
843 844
LIB_OBJS += blob.o
LIB_OBJS += branch.o
845
LIB_OBJS += bulk-checkin.o
846 847
LIB_OBJS += bundle.o
LIB_OBJS += cache-tree.o
J
Jeff King 已提交
848
LIB_OBJS += chdir-notify.o
849
LIB_OBJS += checkout.o
850
LIB_OBJS += color.o
851
LIB_OBJS += column.o
852 853
LIB_OBJS += combine-diff.o
LIB_OBJS += commit.o
854
LIB_OBJS += commit-graph.o
855
LIB_OBJS += commit-reach.o
856
LIB_OBJS += compat/obstack.o
J
Jeff King 已提交
857
LIB_OBJS += compat/terminal.o
858 859
LIB_OBJS += config.o
LIB_OBJS += connect.o
860
LIB_OBJS += connected.o
861 862
LIB_OBJS += convert.o
LIB_OBJS += copy.o
J
Jeff King 已提交
863
LIB_OBJS += credential.o
864 865 866 867
LIB_OBJS += csum-file.o
LIB_OBJS += ctype.o
LIB_OBJS += date.o
LIB_OBJS += decorate.o
J
Jeff King 已提交
868
LIB_OBJS += delta-islands.o
869 870 871 872 873 874 875
LIB_OBJS += diffcore-break.o
LIB_OBJS += diffcore-delta.o
LIB_OBJS += diffcore-order.o
LIB_OBJS += diffcore-pickaxe.o
LIB_OBJS += diffcore-rename.o
LIB_OBJS += diff-delta.o
LIB_OBJS += diff-lib.o
876
LIB_OBJS += diff-no-index.o
877 878
LIB_OBJS += diff.o
LIB_OBJS += dir.o
879
LIB_OBJS += dir-iterator.o
880
LIB_OBJS += editor.o
881 882
LIB_OBJS += entry.o
LIB_OBJS += environment.o
883 884 885 886
LIB_OBJS += ewah/bitmap.o
LIB_OBJS += ewah/ewah_bitmap.o
LIB_OBJS += ewah/ewah_io.o
LIB_OBJS += ewah/ewah_rlw.o
887
LIB_OBJS += exec-cmd.o
888
LIB_OBJS += fetch-negotiator.o
889
LIB_OBJS += fetch-object.o
890
LIB_OBJS += fetch-pack.o
891
LIB_OBJS += fsck.o
892
LIB_OBJS += fsmonitor.o
893
LIB_OBJS += gettext.o
894
LIB_OBJS += gpg-interface.o
A
Adam Simpkins 已提交
895
LIB_OBJS += graph.o
896
LIB_OBJS += grep.o
897
LIB_OBJS += hashmap.o
898
LIB_OBJS += linear-assignment.o
899
LIB_OBJS += help.o
L
Linus Torvalds 已提交
900
LIB_OBJS += hex.o
901
LIB_OBJS += ident.o
902
LIB_OBJS += interdiff.o
903
LIB_OBJS += json-writer.o
F
Fredrik Kuivinen 已提交
904
LIB_OBJS += kwset.o
905
LIB_OBJS += levenshtein.o
906
LIB_OBJS += line-log.o
B
Bo Yang 已提交
907
LIB_OBJS += line-range.o
908
LIB_OBJS += list-objects.o
909 910
LIB_OBJS += list-objects-filter.o
LIB_OBJS += list-objects-filter-options.o
911 912 913
LIB_OBJS += ll-merge.o
LIB_OBJS += lockfile.o
LIB_OBJS += log-tree.o
914
LIB_OBJS += ls-refs.o
J
Junio C Hamano 已提交
915
LIB_OBJS += mailinfo.o
916 917
LIB_OBJS += mailmap.o
LIB_OBJS += match-trees.o
918
LIB_OBJS += mem-pool.o
919
LIB_OBJS += merge.o
920
LIB_OBJS += merge-blobs.o
921
LIB_OBJS += merge-recursive.o
R
René Scharfe 已提交
922
LIB_OBJS += mergesort.o
923
LIB_OBJS += midx.o
924
LIB_OBJS += name-hash.o
925
LIB_OBJS += negotiator/default.o
926
LIB_OBJS += negotiator/skipping.o
J
Johannes Schindelin 已提交
927
LIB_OBJS += notes.o
J
Jeff King 已提交
928
LIB_OBJS += notes-cache.o
929
LIB_OBJS += notes-merge.o
930
LIB_OBJS += notes-utils.o
931
LIB_OBJS += object.o
J
Jonathan Tan 已提交
932
LIB_OBJS += oidmap.o
J
Jeff King 已提交
933
LIB_OBJS += oidset.o
934
LIB_OBJS += packfile.o
935
LIB_OBJS += pack-bitmap.o
936
LIB_OBJS += pack-bitmap-write.o
937
LIB_OBJS += pack-check.o
938
LIB_OBJS += pack-objects.o
939 940 941 942
LIB_OBJS += pack-revindex.o
LIB_OBJS += pack-write.o
LIB_OBJS += pager.o
LIB_OBJS += parse-options.o
943
LIB_OBJS += parse-options-cb.o
944 945 946
LIB_OBJS += patch-delta.o
LIB_OBJS += patch-ids.o
LIB_OBJS += path.o
947
LIB_OBJS += pathspec.o
948
LIB_OBJS += pkt-line.o
949
LIB_OBJS += preload-index.o
950
LIB_OBJS += pretty.o
951
LIB_OBJS += prio-queue.o
952
LIB_OBJS += progress.o
953
LIB_OBJS += prompt.o
954
LIB_OBJS += protocol.o
955
LIB_OBJS += quote.o
956
LIB_OBJS += range-diff.o
957 958
LIB_OBJS += reachable.o
LIB_OBJS += read-cache.o
959
LIB_OBJS += rebase-interactive.o
960 961
LIB_OBJS += reflog-walk.o
LIB_OBJS += refs.o
962
LIB_OBJS += refs/files-backend.o
963
LIB_OBJS += refs/iterator.o
964
LIB_OBJS += refs/packed-backend.o
965
LIB_OBJS += refs/ref-cache.o
966
LIB_OBJS += refspec.o
967
LIB_OBJS += ref-filter.o
968
LIB_OBJS += remote.o
969
LIB_OBJS += replace-object.o
970
LIB_OBJS += repository.o
971
LIB_OBJS += rerere.o
972
LIB_OBJS += resolve-undo.o
973 974
LIB_OBJS += revision.o
LIB_OBJS += run-command.o
975
LIB_OBJS += send-pack.o
976
LIB_OBJS += sequencer.o
B
Brandon Williams 已提交
977
LIB_OBJS += serve.o
978 979
LIB_OBJS += server-info.o
LIB_OBJS += setup.o
980
LIB_OBJS += sha1-array.o
981
LIB_OBJS += sha1-lookup.o
982
LIB_OBJS += sha1-file.o
983
LIB_OBJS += sha1-name.o
984 985
LIB_OBJS += shallow.o
LIB_OBJS += sideband.o
986
LIB_OBJS += sigchain.o
987
LIB_OBJS += split-index.o
988
LIB_OBJS += strbuf.o
989
LIB_OBJS += streaming.o
990
LIB_OBJS += string-list.o
991
LIB_OBJS += submodule.o
992
LIB_OBJS += submodule-config.o
993
LIB_OBJS += sub-process.o
994 995
LIB_OBJS += symlinks.o
LIB_OBJS += tag.o
996
LIB_OBJS += tempfile.o
997
LIB_OBJS += thread-utils.o
998
LIB_OBJS += tmp-objdir.o
999
LIB_OBJS += trace.o
1000 1001 1002 1003 1004
LIB_OBJS += trace2.o
LIB_OBJS += trace2/tr2_cfg.o
LIB_OBJS += trace2/tr2_cmd_name.o
LIB_OBJS += trace2/tr2_dst.o
LIB_OBJS += trace2/tr2_sid.o
1005
LIB_OBJS += trace2/tr2_sysenv.o
1006 1007 1008 1009 1010
LIB_OBJS += trace2/tr2_tbuf.o
LIB_OBJS += trace2/tr2_tgt_event.o
LIB_OBJS += trace2/tr2_tgt_normal.o
LIB_OBJS += trace2/tr2_tgt_perf.o
LIB_OBJS += trace2/tr2_tls.o
1011
LIB_OBJS += trailer.o
1012
LIB_OBJS += transport.o
1013
LIB_OBJS += transport-helper.o
1014 1015 1016 1017
LIB_OBJS += tree-diff.o
LIB_OBJS += tree.o
LIB_OBJS += tree-walk.o
LIB_OBJS += unpack-trees.o
1018
LIB_OBJS += upload-pack.o
J
Jeff King 已提交
1019
LIB_OBJS += url.o
1020
LIB_OBJS += urlmatch.o
1021
LIB_OBJS += usage.o
1022
LIB_OBJS += userdiff.o
1023
LIB_OBJS += utf8.o
1024
LIB_OBJS += varint.o
1025
LIB_OBJS += version.o
1026
LIB_OBJS += versioncmp.o
1027
LIB_OBJS += walker.o
1028
LIB_OBJS += wildmatch.o
1029
LIB_OBJS += worktree.o
1030
LIB_OBJS += wrapper.o
1031
LIB_OBJS += write-or-die.o
1032 1033 1034
LIB_OBJS += ws.o
LIB_OBJS += wt-status.o
LIB_OBJS += xdiff-interface.o
1035
LIB_OBJS += zlib.o
1036

1037
BUILTIN_OBJS += builtin/add.o
1038
BUILTIN_OBJS += builtin/am.o
1039 1040 1041 1042 1043 1044 1045 1046 1047
BUILTIN_OBJS += builtin/annotate.o
BUILTIN_OBJS += builtin/apply.o
BUILTIN_OBJS += builtin/archive.o
BUILTIN_OBJS += builtin/bisect--helper.o
BUILTIN_OBJS += builtin/blame.o
BUILTIN_OBJS += builtin/branch.o
BUILTIN_OBJS += builtin/bundle.o
BUILTIN_OBJS += builtin/cat-file.o
BUILTIN_OBJS += builtin/check-attr.o
A
Adam Spiers 已提交
1048
BUILTIN_OBJS += builtin/check-ignore.o
1049
BUILTIN_OBJS += builtin/check-mailmap.o
1050 1051 1052 1053 1054
BUILTIN_OBJS += builtin/check-ref-format.o
BUILTIN_OBJS += builtin/checkout-index.o
BUILTIN_OBJS += builtin/checkout.o
BUILTIN_OBJS += builtin/clean.o
BUILTIN_OBJS += builtin/clone.o
1055
BUILTIN_OBJS += builtin/column.o
1056 1057
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
1058
BUILTIN_OBJS += builtin/commit-graph.o
1059 1060
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
1061
BUILTIN_OBJS += builtin/credential.o
1062 1063 1064 1065 1066
BUILTIN_OBJS += builtin/describe.o
BUILTIN_OBJS += builtin/diff-files.o
BUILTIN_OBJS += builtin/diff-index.o
BUILTIN_OBJS += builtin/diff-tree.o
BUILTIN_OBJS += builtin/diff.o
1067
BUILTIN_OBJS += builtin/difftool.o
1068 1069 1070 1071 1072 1073 1074
BUILTIN_OBJS += builtin/fast-export.o
BUILTIN_OBJS += builtin/fetch-pack.o
BUILTIN_OBJS += builtin/fetch.o
BUILTIN_OBJS += builtin/fmt-merge-msg.o
BUILTIN_OBJS += builtin/for-each-ref.o
BUILTIN_OBJS += builtin/fsck.o
BUILTIN_OBJS += builtin/gc.o
1075
BUILTIN_OBJS += builtin/get-tar-commit-id.o
1076 1077 1078 1079 1080
BUILTIN_OBJS += builtin/grep.o
BUILTIN_OBJS += builtin/hash-object.o
BUILTIN_OBJS += builtin/help.o
BUILTIN_OBJS += builtin/index-pack.o
BUILTIN_OBJS += builtin/init-db.o
1081
BUILTIN_OBJS += builtin/interpret-trailers.o
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
BUILTIN_OBJS += builtin/log.o
BUILTIN_OBJS += builtin/ls-files.o
BUILTIN_OBJS += builtin/ls-remote.o
BUILTIN_OBJS += builtin/ls-tree.o
BUILTIN_OBJS += builtin/mailinfo.o
BUILTIN_OBJS += builtin/mailsplit.o
BUILTIN_OBJS += builtin/merge.o
BUILTIN_OBJS += builtin/merge-base.o
BUILTIN_OBJS += builtin/merge-file.o
BUILTIN_OBJS += builtin/merge-index.o
BUILTIN_OBJS += builtin/merge-ours.o
BUILTIN_OBJS += builtin/merge-recursive.o
BUILTIN_OBJS += builtin/merge-tree.o
BUILTIN_OBJS += builtin/mktag.o
BUILTIN_OBJS += builtin/mktree.o
D
Derrick Stolee 已提交
1097
BUILTIN_OBJS += builtin/multi-pack-index.o
1098 1099
BUILTIN_OBJS += builtin/mv.o
BUILTIN_OBJS += builtin/name-rev.o
J
Junio C Hamano 已提交
1100
BUILTIN_OBJS += builtin/notes.o
1101 1102 1103 1104 1105 1106
BUILTIN_OBJS += builtin/pack-objects.o
BUILTIN_OBJS += builtin/pack-redundant.o
BUILTIN_OBJS += builtin/pack-refs.o
BUILTIN_OBJS += builtin/patch-id.o
BUILTIN_OBJS += builtin/prune-packed.o
BUILTIN_OBJS += builtin/prune.o
P
Paul Tan 已提交
1107
BUILTIN_OBJS += builtin/pull.o
1108
BUILTIN_OBJS += builtin/push.o
1109
BUILTIN_OBJS += builtin/range-diff.o
1110
BUILTIN_OBJS += builtin/read-tree.o
1111
BUILTIN_OBJS += builtin/rebase.o
1112 1113 1114
BUILTIN_OBJS += builtin/receive-pack.o
BUILTIN_OBJS += builtin/reflog.o
BUILTIN_OBJS += builtin/remote.o
I
Ilari Liusvaara 已提交
1115
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
1116
BUILTIN_OBJS += builtin/remote-fd.o
1117
BUILTIN_OBJS += builtin/repack.o
1118 1119 1120 1121 1122 1123 1124 1125 1126 1127
BUILTIN_OBJS += builtin/replace.o
BUILTIN_OBJS += builtin/rerere.o
BUILTIN_OBJS += builtin/reset.o
BUILTIN_OBJS += builtin/rev-list.o
BUILTIN_OBJS += builtin/rev-parse.o
BUILTIN_OBJS += builtin/revert.o
BUILTIN_OBJS += builtin/rm.o
BUILTIN_OBJS += builtin/send-pack.o
BUILTIN_OBJS += builtin/shortlog.o
BUILTIN_OBJS += builtin/show-branch.o
J
Jeff King 已提交
1128
BUILTIN_OBJS += builtin/show-index.o
1129
BUILTIN_OBJS += builtin/show-ref.o
1130
BUILTIN_OBJS += builtin/stash.o
1131
BUILTIN_OBJS += builtin/stripspace.o
1132
BUILTIN_OBJS += builtin/submodule--helper.o
1133 1134 1135 1136 1137 1138 1139 1140
BUILTIN_OBJS += builtin/symbolic-ref.o
BUILTIN_OBJS += builtin/tag.o
BUILTIN_OBJS += builtin/unpack-file.o
BUILTIN_OBJS += builtin/unpack-objects.o
BUILTIN_OBJS += builtin/update-index.o
BUILTIN_OBJS += builtin/update-ref.o
BUILTIN_OBJS += builtin/update-server-info.o
BUILTIN_OBJS += builtin/upload-archive.o
1141
BUILTIN_OBJS += builtin/upload-pack.o
1142
BUILTIN_OBJS += builtin/var.o
1143
BUILTIN_OBJS += builtin/verify-commit.o
1144 1145
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
1146
BUILTIN_OBJS += builtin/worktree.o
1147
BUILTIN_OBJS += builtin/write-tree.o
1148

1149
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
1150
EXTLIBS =
1151

J
Jeff King 已提交
1152 1153
GIT_USER_AGENT = git/$(GIT_VERSION)

1154 1155 1156 1157
ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/sha1.h)
DC_SHA1_SUBMODULE = auto
endif

1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176
# Set CFLAGS, LDFLAGS and other *FLAGS variables. These might be
# tweaked by config.* below as well as the command-line, both of
# which'll override these defaults.
CFLAGS = -g -O2 -Wall
LDFLAGS =
BASIC_CFLAGS = -I.
BASIC_LDFLAGS =

# library flags
ARFLAGS = rcs
PTHREAD_CFLAGS =

# For the 'sparse' target
SPARSE_FLAGS ?=
SP_EXTRA_FLAGS =

# For the 'coccicheck' target
SPATCH_FLAGS = --all-includes --patch .

1177
include config.mak.uname
1178
-include config.mak.autogen
1179
-include config.mak
1180

1181
ifdef DEVELOPER
1182
include config.mak.dev
1183 1184
endif

1185
ALL_CFLAGS = $(DEVELOPER_CFLAGS) $(CPPFLAGS) $(CFLAGS)
1186 1187
ALL_LDFLAGS = $(LDFLAGS)

1188 1189 1190 1191
comma := ,
empty :=
space := $(empty) $(empty)

1192
ifdef SANITIZE
1193
SANITIZERS := $(foreach flag,$(subst $(comma),$(space),$(SANITIZE)),$(flag))
1194
BASIC_CFLAGS += -fsanitize=$(SANITIZE) -fno-sanitize-recover=$(SANITIZE)
1195
BASIC_CFLAGS += -fno-omit-frame-pointer
1196
ifneq ($(filter undefined,$(SANITIZERS)),)
1197
BASIC_CFLAGS += -DNO_UNALIGNED_LOADS
1198
BASIC_CFLAGS += -DSHA1DC_FORCE_ALIGNED_ACCESS
1199
endif
1200 1201 1202
ifneq ($(filter leak,$(SANITIZERS)),)
BASIC_CFLAGS += -DSUPPRESS_ANNOTATED_LEAKS
endif
1203 1204
endif

1205 1206 1207 1208 1209 1210 1211 1212
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

1213
ifndef COMPUTE_HEADER_DEPENDENCIES
1214 1215 1216 1217
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
1218
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
1219 1220
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
1221
	echo $$?)
1222
ifeq ($(dep_check),0)
1223 1224 1225
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1226
endif
1227 1228
endif

1229
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1230
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1231 1232 1233 1234 1235
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1236 1237
endif

1238
ifdef SANE_TOOL_PATH
1239 1240
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1241 1242
PATH := $(SANE_TOOL_PATH):${PATH}
else
1243
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1244 1245
endif

1246 1247 1248 1249 1250 1251
ifeq (,$(HOST_CPU))
	BASIC_CFLAGS += -DGIT_HOST_CPU="\"$(firstword $(subst -, ,$(uname_M)))\""
else
	BASIC_CFLAGS += -DGIT_HOST_CPU="\"$(HOST_CPU)\""
endif

G
Gary V. Vaughan 已提交
1252 1253 1254 1255
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1256 1257 1258 1259
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1260 1261 1262 1263 1264 1265 1266 1267
ifeq (yes,$(USE_PARENS_AROUND_GETTEXT_N))
	BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=1
else
ifeq (no,$(USE_PARENS_AROUND_GETTEXT_N))
	BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=0
endif
endif

1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
ifeq ($(uname_S),Darwin)
	ifndef NO_FINK
		ifeq ($(shell test -d /sw/lib && echo y),y)
			BASIC_CFLAGS += -I/sw/include
			BASIC_LDFLAGS += -L/sw/lib
		endif
	endif
	ifndef NO_DARWIN_PORTS
		ifeq ($(shell test -d /opt/local/lib && echo y),y)
			BASIC_CFLAGS += -I/opt/local/include
			BASIC_LDFLAGS += -L/opt/local/lib
		endif
	endif
1281
	ifndef NO_APPLE_COMMON_CRYPTO
1282
		NO_OPENSSL = YesPlease
1283 1284 1285
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1286
	NO_REGEX = YesPlease
1287
	PTHREAD_LIBS =
1288 1289
endif

1290 1291 1292 1293 1294 1295 1296 1297
ifndef CC_LD_DYNPATH
	ifdef NO_R_TO_GCC_LINKER
		# Some gcc does not accept and pass -R to the linker to specify
		# the runtime dynamic library path.
		CC_LD_DYNPATH = -Wl,-rpath,
	else
		CC_LD_DYNPATH = -R
	endif
1298 1299
endif

1300 1301 1302 1303 1304
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

1305
USE_LIBPCRE2 ?= $(USE_LIBPCRE)
1306

1307 1308 1309
ifneq (,$(USE_LIBPCRE2))
	ifdef USE_LIBPCRE1
$(error Only set USE_LIBPCRE2 (or its alias USE_LIBPCRE) or USE_LIBPCRE1, not both!)
M
Michał Kiedrowicz 已提交
1310
	endif
1311

1312 1313 1314 1315 1316
	BASIC_CFLAGS += -DUSE_LIBPCRE2
	EXTLIBS += -lpcre2-8
endif

ifdef USE_LIBPCRE1
1317
	BASIC_CFLAGS += -DUSE_LIBPCRE1
M
Michał Kiedrowicz 已提交
1318
	EXTLIBS += -lpcre
1319 1320 1321 1322

ifdef NO_LIBPCRE1_JIT
	BASIC_CFLAGS += -DNO_LIBPCRE1_JIT
endif
M
Michał Kiedrowicz 已提交
1323 1324
endif

1325 1326 1327
ifdef LIBPCREDIR
	BASIC_CFLAGS += -I$(LIBPCREDIR)/include
	EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
M
Michał Kiedrowicz 已提交
1328 1329
endif

K
Kirill Smelkov 已提交
1330 1331 1332 1333
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1334
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1335
IMAP_SEND_LDFLAGS =
1336

D
Daniel Barkalow 已提交
1337 1338
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1339 1340 1341
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
1342
	EXCLUDED_PROGRAMS += git-http-fetch git-http-push
D
Daniel Barkalow 已提交
1343
else
1344
	ifdef CURLDIR
1345 1346
		# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
		BASIC_CFLAGS += -I$(CURLDIR)/include
1347
		CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib)
1348
	else
1349
		CURL_LIBCURL =
1350
	endif
1351

1352 1353 1354 1355 1356 1357
ifdef CURL_LDFLAGS
	CURL_LIBCURL += $(CURL_LDFLAGS)
else
	CURL_LIBCURL += $(shell $(CURL_CONFIG) --libs)
endif

1358 1359 1360
	REMOTE_CURL_PRIMARY = git-remote-http$X
	REMOTE_CURL_ALIASES = git-remote-https$X git-remote-ftp$X git-remote-ftps$X
	REMOTE_CURL_NAMES = $(REMOTE_CURL_PRIMARY) $(REMOTE_CURL_ALIASES)
1361 1362
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1363
	curl_check := $(shell (echo 070908; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1364 1365
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1366
			PROGRAM_OBJS += http-push.o
1367 1368
		else
			EXCLUDED_PROGRAMS += git-http-push
1369
		endif
1370 1371
	else
		EXCLUDED_PROGRAMS += git-http-push
1372
	endif
1373
	curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1374 1375 1376 1377 1378 1379 1380 1381
	ifeq "$(curl_check)" "072200"
		USE_CURL_FOR_IMAP_SEND = YesPlease
	endif
	ifdef USE_CURL_FOR_IMAP_SEND
		BASIC_CFLAGS += -DUSE_CURL_FOR_IMAP_SEND
		IMAP_SEND_BUILDDEPS = http.o
		IMAP_SEND_LDFLAGS += $(CURL_LIBCURL)
	endif
1382
	ifndef NO_EXPAT
1383 1384 1385 1386 1387 1388
		ifdef EXPATDIR
			BASIC_CFLAGS += -I$(EXPATDIR)/include
			EXPAT_LIBEXPAT = -L$(EXPATDIR)/$(lib) $(CC_LD_DYNPATH)$(EXPATDIR)/$(lib) -lexpat
		else
			EXPAT_LIBEXPAT = -lexpat
		endif
M
Matt Kraai 已提交
1389 1390 1391
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1392
	endif
1393
endif
R
Remi Pommarel 已提交
1394
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
1395

1396 1397
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1398
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1399 1400 1401
endif
EXTLIBS += -lz

P
Petr Baudis 已提交
1402
ifndef NO_OPENSSL
J
Junio C Hamano 已提交
1403
	OPENSSL_LIBSSL = -lssl
J
Junio C Hamano 已提交
1404
	ifdef OPENSSLDIR
1405
		BASIC_CFLAGS += -I$(OPENSSLDIR)/include
1406
		OPENSSL_LINK = -L$(OPENSSLDIR)/$(lib) $(CC_LD_DYNPATH)$(OPENSSLDIR)/$(lib)
J
Junio C Hamano 已提交
1407 1408 1409
	else
		OPENSSL_LINK =
	endif
1410
	ifdef NEEDS_CRYPTO_WITH_SSL
1411
		OPENSSL_LIBSSL += -lcrypto
1412
	endif
P
Petr Baudis 已提交
1413
else
1414
	BASIC_CFLAGS += -DNO_OPENSSL
J
Junio C Hamano 已提交
1415
	OPENSSL_LIBSSL =
P
Petr Baudis 已提交
1416
endif
1417 1418 1419
ifdef NO_OPENSSL
	LIB_4_CRYPTO =
else
1420
ifdef NEEDS_SSL_WITH_CRYPTO
J
Junio C Hamano 已提交
1421
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -lssl
1422
else
J
Junio C Hamano 已提交
1423
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto
1424
endif
1425 1426 1427
ifdef APPLE_COMMON_CRYPTO
	LIB_4_CRYPTO += -framework Security -framework CoreFoundation
endif
1428
endif
1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440
ifndef NO_ICONV
	ifdef NEEDS_LIBICONV
		ifdef ICONVDIR
			BASIC_CFLAGS += -I$(ICONVDIR)/include
			ICONV_LINK = -L$(ICONVDIR)/$(lib) $(CC_LD_DYNPATH)$(ICONVDIR)/$(lib)
		else
			ICONV_LINK =
		endif
		ifdef NEEDS_LIBINTL_BEFORE_LIBICONV
			ICONV_LINK += -lintl
		endif
		EXTLIBS += $(ICONV_LINK) -liconv
J
Joachim Schmitz 已提交
1441
	endif
1442
endif
1443 1444 1445
ifdef ICONV_OMITS_BOM
	BASIC_CFLAGS += -DICONV_OMITS_BOM
endif
1446 1447 1448
ifdef NEEDS_LIBGEN
	EXTLIBS += -lgen
endif
1449 1450 1451 1452 1453
ifndef NO_GETTEXT
ifndef LIBC_CONTAINS_LIBINTL
	EXTLIBS += -lintl
endif
endif
1454
ifdef NEEDS_SOCKET
1455
	EXTLIBS += -lsocket
1456
endif
1457
ifdef NEEDS_NSL
1458
	EXTLIBS += -lnsl
1459
endif
1460 1461 1462
ifdef NEEDS_RESOLV
	EXTLIBS += -lresolv
endif
1463
ifdef NO_D_TYPE_IN_DIRENT
1464
	BASIC_CFLAGS += -DNO_D_TYPE_IN_DIRENT
1465
endif
1466 1467 1468
ifdef NO_GECOS_IN_PWENT
	BASIC_CFLAGS += -DNO_GECOS_IN_PWENT
endif
1469 1470 1471
ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
	BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT
endif
1472 1473 1474
ifdef USE_NSEC
	BASIC_CFLAGS += -DUSE_NSEC
endif
1475 1476 1477
ifdef USE_ST_TIMESPEC
	BASIC_CFLAGS += -DUSE_ST_TIMESPEC
endif
J
Junio C Hamano 已提交
1478 1479 1480
ifdef NO_NORETURN
	BASIC_CFLAGS += -DNO_NORETURN
endif
1481 1482 1483
ifdef NO_NSEC
	BASIC_CFLAGS += -DNO_NSEC
endif
1484 1485 1486 1487
ifdef SNPRINTF_RETURNS_BOGUS
	COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS
	COMPAT_OBJS += compat/snprintf.o
endif
1488 1489 1490 1491
ifdef FREAD_READS_DIRECTORIES
	COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES
	COMPAT_OBJS += compat/fopen.o
endif
1492
ifdef NO_SYMLINK_HEAD
1493
	BASIC_CFLAGS += -DNO_SYMLINK_HEAD
1494
endif
1495
ifdef GETTEXT_POISON
1496
$(warning The GETTEXT_POISON option has been removed in favor of runtime GIT_TEST_GETTEXT_POISON. See t/README!)
1497
endif
1498 1499
ifdef NO_GETTEXT
	BASIC_CFLAGS += -DNO_GETTEXT
1500
	USE_GETTEXT_SCHEME ?= fallthrough
1501
endif
1502
ifdef NO_POLL
1503
	NO_POLL_H = YesPlease
1504 1505 1506 1507
	NO_SYS_POLL_H = YesPlease
	COMPAT_CFLAGS += -DNO_POLL -Icompat/poll
	COMPAT_OBJS += compat/poll/poll.o
endif
1508
ifdef NO_STRCASESTR
1509
	COMPAT_CFLAGS += -DNO_STRCASESTR
J
Jason Riedy 已提交
1510 1511
	COMPAT_OBJS += compat/strcasestr.o
endif
1512 1513 1514 1515
ifdef NO_STRLCPY
	COMPAT_CFLAGS += -DNO_STRLCPY
	COMPAT_OBJS += compat/strlcpy.o
endif
1516 1517
ifdef NO_STRTOUMAX
	COMPAT_CFLAGS += -DNO_STRTOUMAX
1518
	COMPAT_OBJS += compat/strtoumax.o compat/strtoimax.o
1519 1520 1521 1522
endif
ifdef NO_STRTOULL
	COMPAT_CFLAGS += -DNO_STRTOULL
endif
J
Jason Riedy 已提交
1523
ifdef NO_SETENV
1524
	COMPAT_CFLAGS += -DNO_SETENV
J
Jason Riedy 已提交
1525
	COMPAT_OBJS += compat/setenv.o
1526
endif
1527 1528 1529 1530
ifdef NO_MKDTEMP
	COMPAT_CFLAGS += -DNO_MKDTEMP
	COMPAT_OBJS += compat/mkdtemp.o
endif
1531 1532 1533 1534
ifdef MKDIR_WO_TRAILING_SLASH
	COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH
	COMPAT_OBJS += compat/mkdir.o
endif
J
Johannes Schindelin 已提交
1535
ifdef NO_UNSETENV
J
Jason Riedy 已提交
1536 1537 1538
	COMPAT_CFLAGS += -DNO_UNSETENV
	COMPAT_OBJS += compat/unsetenv.o
endif
1539 1540 1541
ifdef NO_SYS_SELECT_H
	BASIC_CFLAGS += -DNO_SYS_SELECT_H
endif
1542 1543 1544
ifdef NO_POLL_H
	BASIC_CFLAGS += -DNO_POLL_H
endif
1545 1546 1547
ifdef NO_SYS_POLL_H
	BASIC_CFLAGS += -DNO_SYS_POLL_H
endif
1548 1549
ifdef NEEDS_SYS_PARAM_H
	BASIC_CFLAGS += -DNEEDS_SYS_PARAM_H
1550
endif
1551 1552 1553 1554 1555 1556
ifdef NO_INTTYPES_H
	BASIC_CFLAGS += -DNO_INTTYPES_H
endif
ifdef NO_INITGROUPS
	BASIC_CFLAGS += -DNO_INITGROUPS
endif
1557
ifdef NO_MMAP
1558
	COMPAT_CFLAGS += -DNO_MMAP
J
Jason Riedy 已提交
1559
	COMPAT_OBJS += compat/mmap.o
J
Janos Laube 已提交
1560 1561 1562 1563 1564
else
	ifdef USE_WIN32_MMAP
		COMPAT_CFLAGS += -DUSE_WIN32_MMAP
		COMPAT_OBJS += compat/win32mmap.o
	endif
1565
endif
1566 1567 1568
ifdef MMAP_PREVENTS_DELETE
	BASIC_CFLAGS += -DMMAP_PREVENTS_DELETE
endif
1569 1570
ifdef OBJECT_CREATION_USES_RENAMES
	COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1
1571
endif
1572 1573
ifdef NO_STRUCT_ITIMERVAL
	COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL
1574
	NO_SETITIMER = YesPlease
1575 1576 1577 1578
endif
ifdef NO_SETITIMER
	COMPAT_CFLAGS += -DNO_SETITIMER
endif
1579 1580 1581 1582
ifdef NO_PREAD
	COMPAT_CFLAGS += -DNO_PREAD
	COMPAT_OBJS += compat/pread.o
endif
1583 1584 1585
ifdef NO_FAST_WORKING_DIRECTORY
	BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
endif
1586 1587 1588
ifdef NO_TRUSTABLE_FILEMODE
	BASIC_CFLAGS += -DNO_TRUSTABLE_FILEMODE
endif
1589 1590 1591 1592
ifdef NEEDS_MODE_TRANSLATION
	COMPAT_CFLAGS += -DNEEDS_MODE_TRANSLATION
	COMPAT_OBJS += compat/stat.o
endif
1593
ifdef NO_IPV6
1594
	BASIC_CFLAGS += -DNO_IPV6
1595
endif
J
Joachim Schmitz 已提交
1596 1597 1598
ifdef NO_INTPTR_T
	COMPAT_CFLAGS += -DNO_INTPTR_T
endif
1599 1600 1601
ifdef NO_UINTMAX_T
	BASIC_CFLAGS += -Duintmax_t=uint32_t
endif
1602 1603
ifdef NO_SOCKADDR_STORAGE
ifdef NO_IPV6
1604
	BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in
1605
else
1606
	BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in6
1607
endif
1608
endif
1609 1610
ifdef NO_INET_NTOP
	LIB_OBJS += compat/inet_ntop.o
1611
	BASIC_CFLAGS += -DNO_INET_NTOP
1612
endif
1613 1614
ifdef NO_INET_PTON
	LIB_OBJS += compat/inet_pton.o
1615
	BASIC_CFLAGS += -DNO_INET_PTON
1616
endif
1617 1618
ifdef NO_UNIX_SOCKETS
	BASIC_CFLAGS += -DNO_UNIX_SOCKETS
1619
	EXCLUDED_PROGRAMS += git-credential-cache git-credential-cache--daemon
1620
else
1621 1622 1623 1624
	LIB_OBJS += unix-socket.o
	PROGRAM_OBJS += credential-cache.o
	PROGRAM_OBJS += credential-cache--daemon.o
endif
1625

1626
ifdef NO_ICONV
1627
	BASIC_CFLAGS += -DNO_ICONV
1628 1629
endif

1630 1631 1632 1633
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1634 1635 1636 1637
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1638 1639 1640 1641
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1642 1643 1644 1645 1646
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

1647 1648 1649
ifdef OPENSSL_SHA1
	EXTLIBS += $(LIB_4_CRYPTO)
	BASIC_CFLAGS += -DSHA1_OPENSSL
J
Jeff King 已提交
1650
else
1651 1652
ifdef BLK_SHA1
	LIB_OBJS += block-sha1/sha1.o
1653
	BASIC_CFLAGS += -DSHA1_BLK
1654
else
1655 1656
ifdef PPC_SHA1
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1657
	BASIC_CFLAGS += -DSHA1_PPC
1658 1659 1660
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
1661
	BASIC_CFLAGS += -DSHA1_APPLE
1662
else
1663
	DC_SHA1 := YesPlease
1664 1665
	BASIC_CFLAGS += -DSHA1_DC
	LIB_OBJS += sha1dc_git.o
1666 1667
ifdef DC_SHA1_EXTERNAL
	ifdef DC_SHA1_SUBMODULE
1668
		ifneq ($(DC_SHA1_SUBMODULE),auto)
1669
$(error Only set DC_SHA1_EXTERNAL or DC_SHA1_SUBMODULE, not both)
1670
		endif
1671 1672 1673 1674
	endif
	BASIC_CFLAGS += -DDC_SHA1_EXTERNAL
	EXTLIBS += -lsha1detectcoll
else
1675 1676 1677 1678 1679
ifdef DC_SHA1_SUBMODULE
	LIB_OBJS += sha1collisiondetection/lib/sha1.o
	LIB_OBJS += sha1collisiondetection/lib/ubc_check.o
	BASIC_CFLAGS += -DDC_SHA1_SUBMODULE
else
1680 1681
	LIB_OBJS += sha1dc/sha1.o
	LIB_OBJS += sha1dc/ubc_check.o
1682
endif
1683 1684 1685 1686 1687
	BASIC_CFLAGS += \
		-DSHA1DC_NO_STANDARD_INCLUDES \
		-DSHA1DC_INIT_SAFE_HASH_DEFAULT=0 \
		-DSHA1DC_CUSTOM_INCLUDE_SHA1_C="\"cache.h\"" \
		-DSHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C="\"git-compat-util.h\""
1688 1689 1690
endif
endif
endif
1691
endif
1692
endif
1693

1694 1695 1696 1697
ifdef OPENSSL_SHA256
	EXTLIBS += $(LIB_4_CRYPTO)
	BASIC_CFLAGS += -DSHA256_OPENSSL
else
1698 1699 1700 1701 1702 1703 1704
ifdef GCRYPT_SHA256
	BASIC_CFLAGS += -DSHA256_GCRYPT
	EXTLIBS += -lgcrypt
else
	LIB_OBJS += sha256/block/sha256.o
	BASIC_CFLAGS += -DSHA256_BLK
endif
1705
endif
1706

1707 1708 1709 1710
ifdef SHA1_MAX_BLOCK_SIZE
	LIB_OBJS += compat/sha1-chunked.o
	BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
1711 1712 1713 1714
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1715 1716 1717 1718
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1719 1720 1721
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1722 1723 1724 1725
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
R
René Scharfe 已提交
1726 1727 1728 1729 1730
ifdef HAVE_ISO_QSORT_S
	COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S
else
	COMPAT_OBJS += compat/qsort_s.o
endif
1731 1732 1733
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1734

J
Junio C Hamano 已提交
1735 1736 1737
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1738
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1739
	EXTLIBS += $(PTHREAD_LIBS)
N
Nicolas Pitre 已提交
1740
endif
1741

1742 1743 1744 1745
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1746 1747
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1748
	EXTLIBS += $(CHARSET_LIB)
1749 1750
endif

1751 1752 1753 1754
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1755 1756 1757 1758
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1759 1760 1761
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1762 1763 1764
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1765 1766 1767 1768
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1769 1770 1771
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1772

1773
ifdef USE_NED_ALLOCATOR
1774 1775 1776 1777 1778 1779 1780 1781
	COMPAT_CFLAGS += -Icompat/nedmalloc
	COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
	OVERRIDE_STRDUP = YesPlease
endif

ifdef OVERRIDE_STRDUP
	COMPAT_CFLAGS += -DOVERRIDE_STRDUP
	COMPAT_OBJS += compat/strdup.o
1782 1783
endif

1784 1785 1786 1787
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1788 1789 1790 1791
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1792 1793 1794 1795 1796
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1797 1798 1799 1800
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1801 1802 1803 1804
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1805 1806 1807 1808
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1809 1810 1811 1812
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1813 1814 1815 1816
ifdef HAVE_BSD_KERN_PROC_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_KERN_PROC_SYSCTL
endif

1817 1818 1819 1820
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1821 1822 1823 1824 1825 1826 1827 1828 1829
ifneq ($(PROCFS_EXECUTABLE_PATH),)
	procfs_executable_path_SQ = $(subst ','\'',$(PROCFS_EXECUTABLE_PATH))
	BASIC_CFLAGS += '-DPROCFS_EXECUTABLE_PATH="$(procfs_executable_path_SQ)"'
endif

ifdef HAVE_NS_GET_EXECUTABLE_PATH
	BASIC_CFLAGS += -DHAVE_NS_GET_EXECUTABLE_PATH
endif

1830 1831 1832 1833
ifdef HAVE_WPGMPTR
	BASIC_CFLAGS += -DHAVE_WPGMPTR
endif

1834 1835 1836 1837 1838
ifdef FILENO_IS_A_MACRO
	COMPAT_CFLAGS += -DFILENO_IS_A_MACRO
	COMPAT_OBJS += compat/fileno.o
endif

1839 1840 1841 1842 1843
ifdef NEED_ACCESS_ROOT_HANDLER
	COMPAT_CFLAGS += -DNEED_ACCESS_ROOT_HANDLER
	COMPAT_OBJS += compat/access.o
endif

1844
ifeq ($(TCLTK_PATH),)
1845
NO_TCLTK = NoThanks
1846 1847
endif

1848
ifeq ($(PERL_PATH),)
1849
NO_PERL = NoThanks
1850 1851
endif

1852
ifeq ($(PYTHON_PATH),)
1853
NO_PYTHON = NoThanks
1854 1855
endif

1856 1857 1858 1859
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1860
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1861 1862
QUIET_SUBDIR1  =

1863
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1864 1865 1866 1867 1868
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1869
ifneq ($(findstring s,$(MAKEFLAGS)),s)
S
Shawn O. Pearce 已提交
1870
ifndef V
A
Alex Riesen 已提交
1871
	QUIET_CC       = @echo '   ' CC $@;
1872 1873 1874 1875
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1876
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1877
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1878
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1879
	QUIET_GCOV     = @echo '   ' GCOV $@;
1880
	QUIET_SP       = @echo '   ' SP $<;
R
Ramsay Jones 已提交
1881
	QUIET_HDR      = @echo '   ' HDR $<;
1882
	QUIET_RC       = @echo '   ' RC $@;
1883
	QUIET_SUBDIR0  = +@subdir=
1884 1885
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1886
	export V
A
Alex Riesen 已提交
1887
	export QUIET_GEN
1888 1889
	export QUIET_BUILT_IN
endif
1890
endif
1891

J
Junio C Hamano 已提交
1892 1893 1894 1895
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1896 1897 1898 1899 1900 1901 1902
### profile feedback build
#

# Can adjust this to be a global directory if you want to do extended
# data gathering
PROFILE_DIR := $(CURDIR)

1903
ifeq ("$(PROFILE)","GEN")
1904
	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
1905
	EXTLIBS += -lgcov
1906 1907
	export CCACHE_DISABLE = t
	V = 1
1908 1909
else
ifneq ("$(PROFILE)","")
1910
	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1911 1912
	export CCACHE_DISABLE = t
	V = 1
1913
endif
1914
endif
1915

P
Pavel Roskin 已提交
1916
# Shell quote (do not use $(call) to accommodate ancient setups);
1917

1918
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1919
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1920 1921 1922

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1923
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1924
mandir_SQ = $(subst ','\'',$(mandir))
1925 1926
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1927
perllibdir_SQ = $(subst ','\'',$(perllibdir))
1928
localedir_SQ = $(subst ','\'',$(localedir))
1929
localedir_relative_SQ = $(subst ','\'',$(localedir_relative))
1930
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
1931
gitexecdir_relative_SQ = $(subst ','\'',$(gitexecdir_relative))
1932
template_dir_SQ = $(subst ','\'',$(template_dir))
1933
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1934
prefix_SQ = $(subst ','\'',$(prefix))
1935
perllibdir_relative_SQ = $(subst ','\'',$(perllibdir_relative))
1936
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1937 1938

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
J
Jeff King 已提交
1939
TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
1940
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1941
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1942
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1943
DIFF_SQ = $(subst ','\'',$(DIFF))
1944
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1945

1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970
# RUNTIME_PREFIX's resolution logic requires resource paths to be expressed
# relative to each other and share an installation path.
#
# This is a dependency in:
# - Git's binary RUNTIME_PREFIX logic in (see "exec_cmd.c").
# - The runtime prefix Perl header (see
#   "perl/header_templates/runtime_prefix.template.pl").
ifdef RUNTIME_PREFIX

ifneq ($(filter /%,$(firstword $(gitexecdir_relative))),)
$(error RUNTIME_PREFIX requires a relative gitexecdir, not: $(gitexecdir))
endif

ifneq ($(filter /%,$(firstword $(localedir_relative))),)
$(error RUNTIME_PREFIX requires a relative localedir, not: $(localedir))
endif

ifndef NO_PERL
ifneq ($(filter /%,$(firstword $(perllibdir_relative))),)
$(error RUNTIME_PREFIX requires a relative perllibdir, not: $(perllibdir))
endif
endif

endif

1971 1972 1973 1974 1975 1976 1977 1978 1979
# We must filter out any object files from $(GITLIBS),
# as it is typically used like:
#
#   foo: foo.o $(GITLIBS)
#	$(CC) $(filter %.o,$^) $(LIBS)
#
# where we use it as a dependency. Since we also pull object files
# from the dependency list, that would make each entry appear twice.
LIBS = $(filter-out %.o, $(GITLIBS)) $(EXTLIBS)
1980

1981
BASIC_CFLAGS += $(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1982
LIB_OBJS += $(COMPAT_OBJS)
1983

1984 1985 1986 1987 1988 1989 1990 1991 1992
# Quote for C

ifdef DEFAULT_EDITOR
DEFAULT_EDITOR_CQ = "$(subst ",\",$(subst \,\\,$(DEFAULT_EDITOR)))"
DEFAULT_EDITOR_CQ_SQ = $(subst ','\'',$(DEFAULT_EDITOR_CQ))

BASIC_CFLAGS += -DDEFAULT_EDITOR='$(DEFAULT_EDITOR_CQ_SQ)'
endif

1993 1994 1995 1996 1997 1998 1999
ifdef DEFAULT_PAGER
DEFAULT_PAGER_CQ = "$(subst ",\",$(subst \,\\,$(DEFAULT_PAGER)))"
DEFAULT_PAGER_CQ_SQ = $(subst ','\'',$(DEFAULT_PAGER_CQ))

BASIC_CFLAGS += -DDEFAULT_PAGER='$(DEFAULT_PAGER_CQ_SQ)'
endif

2000 2001 2002 2003 2004 2005 2006
ifdef SHELL_PATH
SHELL_PATH_CQ = "$(subst ",\",$(subst \,\\,$(SHELL_PATH)))"
SHELL_PATH_CQ_SQ = $(subst ','\'',$(SHELL_PATH_CQ))

BASIC_CFLAGS += -DSHELL_PATH='$(SHELL_PATH_CQ_SQ)'
endif

J
Jeff King 已提交
2007 2008 2009
GIT_USER_AGENT_SQ = $(subst ','\'',$(GIT_USER_AGENT))
GIT_USER_AGENT_CQ = "$(subst ",\",$(subst \,\\,$(GIT_USER_AGENT)))"
GIT_USER_AGENT_CQ_SQ = $(subst ','\'',$(GIT_USER_AGENT_CQ))
2010 2011 2012 2013
GIT-USER-AGENT: FORCE
	@if test x'$(GIT_USER_AGENT_SQ)' != x"`cat GIT-USER-AGENT 2>/dev/null`"; then \
		echo '$(GIT_USER_AGENT_SQ)' >GIT-USER-AGENT; \
	fi
J
Jeff King 已提交
2014

2015 2016 2017 2018
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

2019 2020 2021 2022 2023
PAGER_ENV_SQ = $(subst ','\'',$(PAGER_ENV))
PAGER_ENV_CQ = "$(subst ",\",$(subst \,\\,$(PAGER_ENV)))"
PAGER_ENV_CQ_SQ = $(subst ','\'',$(PAGER_ENV_CQ))
BASIC_CFLAGS += -DPAGER_ENV='$(PAGER_ENV_CQ_SQ)'

2024 2025 2026
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

2027
export DIFF TAR INSTALL DESTDIR SHELL_PATH
2028 2029


P
Petr Baudis 已提交
2030 2031
### Build rules

2032 2033
SHELL = $(SHELL_PATH)

2034 2035 2036
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
2037 2038 2039 2040
all:: profile
endif

profile:: profile-clean
2041 2042
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
2043 2044 2045 2046 2047
	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
		$(MAKE) PROFILE=GEN -j1 perf; \
	else \
		echo "Skipping profile of perf tests..."; \
	fi
2048 2049 2050 2051 2052 2053 2054
	$(MAKE) PROFILE=USE all

profile-fast: profile-clean
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 perf
	$(MAKE) PROFILE=USE all

2055 2056

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
2057
ifneq (,$X)
2058
	$(QUIET_BUILT_IN)$(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) git$X)), test -d '$p' -o '$p' -ef '$p$X' || $(RM) '$p';)
2059
endif
2060

2061
all::
E
Eygene Ryabinkin 已提交
2062
ifndef NO_TCLTK
2063
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
2064
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
2065
endif
2066
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
2067

2068 2069 2070 2071 2072
please_set_SHELL_PATH_to_a_more_modern_shell:
	@$$(:)

shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell

J
Junio C Hamano 已提交
2073
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
2074
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
2075

2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108
### Target-specific flags and dependencies

# The generic compilation pattern rule and automatically
# computed header dependencies (falling back to a dependency on
# LIB_H) are enough to describe how most targets should be built,
# but some targets are special enough to need something a little
# different.
#
# - When a source file "foo.c" #includes a generated header file,
#   we need to list that dependency for the "foo.o" target.
#
#   We also list it from other targets that are built from foo.c
#   like "foo.sp" and "foo.s", even though that is easy to forget
#   to do because the generated header is already present around
#   after a regular build attempt.
#
# - Some code depends on configuration kept in makefile
#   variables. The target-specific variable EXTRA_CPPFLAGS can
#   be used to convey that information to the C preprocessor
#   using -D options.
#
#   The "foo.o" target should have a corresponding dependency on
#   a file that changes when the value of the makefile variable
#   changes.  For example, targets making use of the
#   $(GIT_VERSION) variable depend on GIT-VERSION-FILE.
#
#   Technically the ".sp" and ".s" targets do not need this
#   dependency because they are force-built, but they get the
#   same dependency for consistency. This way, you do not have to
#   know how each target is implemented. And it means the
#   dependencies here will not need to change if the force-build
#   details change some day.

2109
git.sp git.s git.o: GIT-PREFIX
2110
git.sp git.s git.o: EXTRA_CPPFLAGS = \
2111 2112 2113
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
2114

2115
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
2116 2117
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
		$(filter %.o,$^) $(LIBS)
2118

N
Nguyễn Thái Ngọc Duy 已提交
2119
help.sp help.s help.o: command-list.h
2120

N
Nguyễn Thái Ngọc Duy 已提交
2121
builtin/help.sp builtin/help.s builtin/help.o: command-list.h GIT-PREFIX
2122
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
2123 2124 2125
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
2126

2127
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
2128
version.sp version.s version.o: EXTRA_CPPFLAGS = \
2129
	'-DGIT_VERSION="$(GIT_VERSION)"' \
2130
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)' \
2131 2132 2133
	'-DGIT_BUILT_FROM_COMMIT="$(shell \
		GIT_CEILING_DIRECTORIES="$(CURDIR)/.." \
		git rev-parse -q --verify HEAD 2>/dev/null)"'
2134

J
Junio C Hamano 已提交
2135
$(BUILT_INS): git$X
2136
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
2137 2138 2139
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
2140

2141
command-list.h: generate-cmdlist.sh command-list.txt
2142

2143
command-list.h: $(wildcard Documentation/git*.txt) Documentation/*config.txt Documentation/config/*.txt
2144 2145 2146
	$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh \
		$(patsubst %,--exclude-program %,$(EXCLUDED_PROGRAMS)) \
		command-list.txt >$@+ && mv $@+ $@
F
Fredrik Kuivinen 已提交
2147

2148
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
2149
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
2150 2151
	$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV):\
	$(perllibdir_SQ)
2152 2153 2154 2155
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
2156
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
2157
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
2158
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
2159
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
2160
    -e $(BROKEN_PATH_FIX) \
2161 2162
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
2163
    -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
2164
    -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
2165 2166 2167
    $@.sh >$@+
endef

2168 2169 2170
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
2171
		echo >&2 "    * new script parameters"; \
2172 2173 2174 2175
		echo "$$FLAGS" >$@; \
            fi


2176
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
2177
	$(QUIET_GEN)$(cmd_munge_script) && \
2178
	chmod +x $@+ && \
2179
	mv $@+ $@
2180

2181
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
2182 2183 2184
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

2185
git.res: git.rc GIT-VERSION-FILE GIT-PREFIX
2186
	$(QUIET_RC)$(RC) \
2187 2188
	  $(join -DMAJOR= -DMINOR= -DMICRO= -DPATCHLEVEL=, $(wordlist 1, 4, \
	    $(shell echo $(GIT_VERSION) 0 0 0 0 | tr '.a-zA-Z-' ' '))) \
S
Steven Penny 已提交
2189
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
2190

2191
# This makes sure we depend on the NO_PERL setting itself.
2192
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
2193

2194 2195 2196
# Used for substitution in Perl modules. Disabled when using RUNTIME_PREFIX
# since the locale directory is injected.
perl_localedir_SQ = $(localedir_SQ)
2197

2198
ifndef NO_PERL
2199
PERL_HEADER_TEMPLATE = perl/header_templates/fixed_prefix.template.pl
2200
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ):$(perllibdir_SQ)
2201

2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218
PERL_DEFINES := $(PERL_PATH_SQ) $(PERLLIB_EXTRA_SQ) $(perllibdir_SQ)
PERL_DEFINES += $(RUNTIME_PREFIX)

# Support Perl runtime prefix. In this mode, a different header is installed
# into Perl scripts.
ifdef RUNTIME_PREFIX

PERL_HEADER_TEMPLATE = perl/header_templates/runtime_prefix.template.pl

# Don't export a fixed $(localedir) path; it will be resolved by the Perl header
# at runtime.
perl_localedir_SQ =

endif

PERL_DEFINES += $(gitexecdir) $(perllibdir) $(localedir)

2219
$(SCRIPT_PERL_GEN): % : %.perl GIT-PERL-DEFINES GIT-PERL-HEADER GIT-VERSION-FILE
2220
	$(QUIET_GEN)$(RM) $@ $@+ && \
2221 2222
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
2223
	    -e '	r GIT-PERL-HEADER' \
2224
	    -e '	G' \
2225
	    -e '}' \
2226
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
2227
	    $< >$@+ && \
2228
	chmod +x $@+ && \
2229
	mv $@+ $@
2230

2231
PERL_DEFINES := $(subst $(space),:,$(PERL_DEFINES))
2232 2233 2234 2235 2236 2237 2238
GIT-PERL-DEFINES: FORCE
	@FLAGS='$(PERL_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
		echo >&2 "    * new perl-specific parameters"; \
		echo "$$FLAGS" >$@; \
	    fi

2239 2240 2241 2242 2243 2244
GIT-PERL-HEADER: $(PERL_HEADER_TEMPLATE) GIT-PERL-DEFINES Makefile
	$(QUIET_GEN)$(RM) $@ && \
	INSTLIBDIR='$(perllibdir_SQ)' && \
	INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \
	INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \
	sed -e 's=@@PATHSEP@@=$(pathsep)=g' \
2245
	    -e "s=@@INSTLIBDIR@@=$$INSTLIBDIR=g" \
2246 2247 2248
	    -e 's=@@PERLLIBDIR_REL@@=$(perllibdir_relative_SQ)=g' \
	    -e 's=@@GITEXECDIR_REL@@=$(gitexecdir_relative_SQ)=g' \
	    -e 's=@@LOCALEDIR_REL@@=$(localedir_relative_SQ)=g' \
2249 2250
	    $< >$@+ && \
	mv $@+ $@
2251

2252
.PHONY: perllibdir
2253 2254
perllibdir:
	@echo '$(perllibdir_SQ)'
2255 2256 2257 2258 2259

.PHONY: gitweb
gitweb:
	$(QUIET_SUBDIR0)gitweb $(QUIET_SUBDIR1) all

2260
git-instaweb: git-instaweb.sh GIT-SCRIPT-DEFINES
2261
	$(QUIET_GEN)$(cmd_munge_script) && \
2262
	chmod +x $@+ && \
2263
	mv $@+ $@
2264
else # NO_PERL
2265
$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh
2266 2267 2268 2269 2270 2271 2272
	$(QUIET_GEN)$(RM) $@ $@+ && \
	sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
	    -e 's|@@REASON@@|NO_PERL=$(NO_PERL)|g' \
	    unimplemented.sh >$@+ && \
	chmod +x $@+ && \
	mv $@+ $@
endif # NO_PERL
2273

2274 2275 2276
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

2277
ifndef NO_PYTHON
F
Felipe Contreras 已提交
2278 2279
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
2280
	$(QUIET_GEN)$(RM) $@ $@+ && \
2281
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
2282
	    $< >$@+ && \
2283 2284 2285
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
2286
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
2287 2288 2289 2290 2291 2292 2293 2294
	$(QUIET_GEN)$(RM) $@ $@+ && \
	sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
	    -e 's|@@REASON@@|NO_PYTHON=$(NO_PYTHON)|g' \
	    unimplemented.sh >$@+ && \
	chmod +x $@+ && \
	mv $@+ $@
endif # NO_PYTHON

2295 2296 2297 2298 2299 2300
CONFIGURE_RECIPE = $(RM) configure configure.ac+ && \
		   sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
			configure.ac >configure.ac+ && \
		   autoconf -o configure configure.ac+ && \
		   $(RM) configure.ac+

2301
configure: configure.ac GIT-VERSION-FILE
2302
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
2303

2304
ifdef AUTOCONFIGURED
2305 2306 2307 2308 2309 2310
# We avoid depending on 'configure' here, because it gets rebuilt
# every time GIT-VERSION-FILE is modified, only to update the embedded
# version number string, which config.status does not care about.  We
# do want to recheck when the platform/environment detection logic
# changes, hence this depends on configure.ac.
config.status: configure.ac
2311
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
2312
	if test -f config.status; then \
2313 2314 2315 2316 2317 2318 2319 2320 2321
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

2322 2323 2324 2325 2326 2327
XDIFF_OBJS += xdiff/xdiffi.o
XDIFF_OBJS += xdiff/xprepare.o
XDIFF_OBJS += xdiff/xutils.o
XDIFF_OBJS += xdiff/xemit.o
XDIFF_OBJS += xdiff/xmerge.o
XDIFF_OBJS += xdiff/xpatience.o
2328
XDIFF_OBJS += xdiff/xhistogram.o
2329 2330

VCSSVN_OBJS += vcs-svn/line_buffer.o
2331
VCSSVN_OBJS += vcs-svn/sliding_window.o
2332
VCSSVN_OBJS += vcs-svn/fast_export.o
2333
VCSSVN_OBJS += vcs-svn/svndiff.o
2334 2335
VCSSVN_OBJS += vcs-svn/svndump.o

2336
TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
2337 2338 2339
OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
	$(XDIFF_OBJS) \
	$(VCSSVN_OBJS) \
2340
	$(FUZZ_OBJS) \
2341
	common-main.o \
2342 2343 2344 2345
	git.o
ifndef NO_CURL
	OBJECTS += http.o http-walker.o remote-curl.o
endif
2346

2347
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
2348
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
2349

2350
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2351
$(dep_dirs):
2352
	@mkdir -p $@
2353 2354

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
2355
dep_file = $(dir $@).depend/$(notdir $@).d
2356
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
2357 2358
endif

2359
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2360 2361
dep_dirs =
missing_dep_dirs =
2362 2363 2364 2365 2366 2367 2368
dep_args =
endif

ASM_SRC := $(wildcard $(OBJECTS:o=S))
ASM_OBJ := $(ASM_SRC:S=o)
C_OBJ := $(filter-out $(ASM_OBJ),$(OBJECTS))

2369 2370
.SUFFIXES:

2371
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
2372
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2373
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
2374
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2375

2376
%.s: %.c GIT-CFLAGS FORCE
2377
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2378 2379

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
2380 2381
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
2382 2383 2384
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
2385 2386 2387 2388 2389
endif
else
# Dependencies on header files, for platforms that do not support
# the gcc -MMD option.
#
N
Nguyễn Thái Ngọc Duy 已提交
2390
# Dependencies on automatically generated headers such as command-list.h
2391 2392
# should _not_ be included here, since they are necessary even when
# building an object for the first time.
J
Jonathan Nieder 已提交
2393

2394
$(OBJECTS): $(LIB_H) $(GENERATED_H)
2395
endif
2396

2397 2398
exec-cmd.sp exec-cmd.s exec-cmd.o: GIT-PREFIX
exec-cmd.sp exec-cmd.s exec-cmd.o: EXTRA_CPPFLAGS = \
2399
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
2400
	'-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
2401
	'-DBINDIR="$(bindir_relative_SQ)"' \
2402
	'-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"'
2403

2404
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2405
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2406
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2407

2408
config.sp config.s config.o: GIT-PREFIX
2409 2410
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2411

2412
attr.sp attr.s attr.o: GIT-PREFIX
2413 2414
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2415

2416
gettext.sp gettext.s gettext.o: GIT-PREFIX
2417
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
2418
	-DGIT_LOCALE_PATH='"$(localedir_relative_SQ)"'
2419

2420
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SP_EXTRA_FLAGS += \
2421 2422
	-DCURL_DISABLE_TYPECHECK

2423
pack-revindex.sp: SP_EXTRA_FLAGS += -Wno-memcpy-max-count
2424

2425
ifdef NO_EXPAT
2426
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2427 2428
endif

2429
ifdef NO_REGEX
2430 2431
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2432 2433
endif

2434
ifdef USE_NED_ALLOCATOR
2435
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2436
	-DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
2437
compat/nedmalloc/nedmalloc.sp: SP_EXTRA_FLAGS += -Wno-non-pointer-null
2438 2439
endif

2440
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2441
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2442

2443
git-imap-send$X: imap-send.o $(IMAP_SEND_BUILDDEPS) GIT-LDFLAGS $(GITLIBS)
R
Robert Shearman 已提交
2444
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
2445
		$(IMAP_SEND_LDFLAGS) $(LIBS)
2446

2447
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2448
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2449
		$(CURL_LIBCURL) $(LIBS)
2450
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2451
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2452
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2453

2454 2455 2456 2457
git-remote-testsvn$X: remote-testsvn.o GIT-LDFLAGS $(GITLIBS) $(VCSSVN_LIB)
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) \
	$(VCSSVN_LIB)

2458 2459 2460 2461 2462 2463
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

2464
$(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o GIT-LDFLAGS $(GITLIBS)
2465
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2466
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2467

P
Petr Baudis 已提交
2468
$(LIB_FILE): $(LIB_OBJS)
2469
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2470

2471
$(XDIFF_LIB): $(XDIFF_OBJS)
2472
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2473

J
Jonathan Nieder 已提交
2474
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2475
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2476

2477 2478
export DEFAULT_EDITOR DEFAULT_PAGER

2479 2480 2481 2482 2483 2484 2485 2486
Documentation/GIT-EXCLUDED-PROGRAMS: FORCE
	@EXCLUDED='EXCLUDED_PROGRAMS := $(EXCLUDED_PROGRAMS)'; \
	    if test x"$$EXCLUDED" != \
		x"`cat Documentation/GIT-EXCLUDED-PROGRAMS 2>/dev/null`" ; then \
		echo >&2 "    * new documentation flags"; \
		echo "$$EXCLUDED" >Documentation/GIT-EXCLUDED-PROGRAMS; \
            fi

2487 2488
.PHONY: doc man man-perl html info pdf
doc: man-perl
P
Petr Baudis 已提交
2489 2490
	$(MAKE) -C Documentation all

2491
man: man-perl
2492 2493
	$(MAKE) -C Documentation man

2494 2495
man-perl: perl/build/man/man3/Git.3pm

2496 2497 2498
html:
	$(MAKE) -C Documentation html

2499 2500 2501
info:
	$(MAKE) -C Documentation info

2502 2503 2504
pdf:
	$(MAKE) -C Documentation pdf

2505 2506
XGETTEXT_FLAGS = \
	--force-po \
2507
	--add-comments=TRANSLATORS: \
2508 2509
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2510 2511
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2512 2513
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2514
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
2515
	--keyword=__ --keyword=N__ --keyword="__n:1,2"
2516
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2517 2518
LOCALIZED_SH = $(SCRIPT_SH)
LOCALIZED_SH += git-parse-remote.sh
2519
LOCALIZED_SH += git-rebase--preserve-merges.sh
2520
LOCALIZED_SH += git-sh-setup.sh
2521
LOCALIZED_PERL = $(SCRIPT_PERL)
2522 2523 2524 2525 2526 2527

ifdef XGETTEXT_INCLUDE_TESTS
LOCALIZED_C += t/t0200/test.c
LOCALIZED_SH += t/t0200/test.sh
LOCALIZED_PERL += t/t0200/test.perl
endif
2528

2529 2530 2531 2532 2533 2534 2535 2536
## Note that this is meant to be run only by the localization coordinator
## under a very controlled condition, i.e. (1) it is to be run in a
## Git repository (not a tarball extract), (2) any local modifications
## will be lost.
## Gettext tools cannot work with our own custom PRItime type, so
## we replace PRItime with PRIuMAX.  We need to update this to
## PRIdMAX if we switch to a signed type later.

2537
po/git.pot: $(GENERATED_H) FORCE
2538 2539 2540 2541 2542 2543 2544 2545 2546 2547
	# All modifications will be reverted at the end, so we do not
	# want to have any local change.
	git diff --quiet HEAD && git diff --quiet --cached

	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
	do \
		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
		cat "$$s+" >"$$s" && rm "$$s+"; \
	done

2548 2549 2550
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2551 2552
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2553 2554 2555

	# Reverting the munged source, leaving only the updated $@
	git reset --hard
2556 2557
	mv $@+ $@

E
Elia Pinto 已提交
2558
.PHONY: pot
2559 2560
pot: po/git.pot

2561 2562 2563 2564 2565 2566 2567 2568 2569 2570
POFILES := $(wildcard po/*.po)
MOFILES := $(patsubst po/%.po,po/build/locale/%/LC_MESSAGES/git.mo,$(POFILES))

ifndef NO_GETTEXT
all:: $(MOFILES)
endif

po/build/locale/%/LC_MESSAGES/git.mo: po/%.po
	$(QUIET_MSGFMT)mkdir -p $(dir $@) && $(MSGFMT) -o $@ $<

2571 2572
LIB_PERL := $(wildcard perl/Git.pm perl/Git/*.pm perl/Git/*/*.pm perl/Git/*/*/*.pm)
LIB_PERL_GEN := $(patsubst perl/%.pm,perl/build/lib/%.pm,$(LIB_PERL))
2573 2574
LIB_CPAN := $(wildcard perl/FromCPAN/*.pm perl/FromCPAN/*/*.pm)
LIB_CPAN_GEN := $(patsubst perl/%.pm,perl/build/lib/%.pm,$(LIB_CPAN))
2575 2576

ifndef NO_PERL
2577
all:: $(LIB_PERL_GEN)
2578
ifndef NO_PERL_CPAN_FALLBACKS
2579
all:: $(LIB_CPAN_GEN)
2580
endif
2581
NO_PERL_CPAN_FALLBACKS_SQ = $(subst ','\'',$(NO_PERL_CPAN_FALLBACKS))
2582 2583
endif

2584
perl/build/lib/%.pm: perl/%.pm
2585
	$(QUIET_GEN)mkdir -p $(dir $@) && \
2586
	sed -e 's|@@LOCALEDIR@@|$(perl_localedir_SQ)|g' \
2587 2588
	    -e 's|@@NO_PERL_CPAN_FALLBACKS@@|$(NO_PERL_CPAN_FALLBACKS_SQ)|g' \
	< $< > $@
2589 2590 2591 2592 2593

perl/build/man/man3/Git.3pm: perl/Git.pm
	$(QUIET_GEN)mkdir -p $(dir $@) && \
	pod2man $< $@

J
Jeff King 已提交
2594
FIND_SOURCE_FILES = ( \
2595 2596
	git ls-files \
		'*.[hcS]' \
2597
		'*.sh' \
2598
		':!*[tp][0-9][0-9][0-9][0-9]*' \
2599
		':!contrib' \
2600
		2>/dev/null || \
J
Jeff King 已提交
2601 2602
	$(FIND) . \
		\( -name .git -type d -prune \) \
2603
		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
2604
		-o \( -name contrib -type d -prune \) \
2605 2606
		-o \( -name build -type d -prune \) \
		-o \( -name 'trash*' -type d -prune \) \
J
Jeff King 已提交
2607
		-o \( -name '*.[hcS]' -type f -print \) \
2608
		-o \( -name '*.sh' -type f -print \) \
J
Jeff King 已提交
2609
	)
2610

2611 2612
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2613
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2614

2615
tags: FORCE
2616
	$(RM) tags
2617
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2618

K
Kristof Provost 已提交
2619 2620
cscope:
	$(RM) cscope*
2621
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2622

2623
### Detect prefix changes
2624 2625 2626 2627 2628 2629
TRACK_PREFIX = $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ):\
		$(localedir_SQ)

GIT-PREFIX: FORCE
	@FLAGS='$(TRACK_PREFIX)'; \
	if test x"$$FLAGS" != x"`cat GIT-PREFIX 2>/dev/null`" ; then \
2630
		echo >&2 "    * new prefix flags"; \
2631 2632 2633 2634
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

TRACK_CFLAGS = $(CC):$(subst ','\'',$(ALL_CFLAGS)):$(USE_GETTEXT_SCHEME)
2635

2636
GIT-CFLAGS: FORCE
2637 2638
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2639
		echo >&2 "    * new build flags"; \
2640 2641 2642
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2643 2644 2645 2646 2647
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

GIT-LDFLAGS: FORCE
	@FLAGS='$(TRACK_LDFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-LDFLAGS 2>/dev/null`" ; then \
2648
		echo >&2 "    * new link flags"; \
2649 2650 2651
		echo "$$FLAGS" >GIT-LDFLAGS; \
            fi

J
Junio C Hamano 已提交
2652 2653 2654
# We need to apply sq twice, once to protect from the shell
# that runs GIT-BUILD-OPTIONS, and then again to protect it
# and the first level quoting from the shell that runs "echo".
2655
GIT-BUILD-OPTIONS: FORCE
2656
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@+
J
Jeff King 已提交
2657
	@echo TEST_SHELL_PATH=\''$(subst ','\'',$(TEST_SHELL_PATH_SQ))'\' >>$@+
2658 2659 2660 2661 2662
	@echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@+
	@echo DIFF=\''$(subst ','\'',$(subst ','\'',$(DIFF)))'\' >>$@+
	@echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@+
	@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@+
	@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@+
2663
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2664 2665
	@echo USE_LIBPCRE1=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE1)))'\' >>$@+
	@echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+
2666
	@echo NO_LIBPCRE1_JIT=\''$(subst ','\'',$(subst ','\'',$(NO_LIBPCRE1_JIT)))'\' >>$@+
2667
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
2668
	@echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+
2669 2670
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
2671
	@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
2672
	@echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
2673
	@echo X=\'$(X)\' >>$@+
2674
ifdef TEST_OUTPUT_DIRECTORY
2675
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2676
endif
2677
ifdef GIT_TEST_OPTS
2678
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2679
endif
2680
ifdef GIT_TEST_CMP
2681
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2682 2683
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2684
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2685
endif
2686
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
2687
ifdef GIT_PERF_REPEAT_COUNT
2688
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2689 2690
endif
ifdef GIT_PERF_REPO
2691
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2692 2693
endif
ifdef GIT_PERF_LARGE_REPO
2694
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2695 2696
endif
ifdef GIT_PERF_MAKE_OPTS
2697
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2698
endif
2699 2700 2701
ifdef GIT_PERF_MAKE_COMMAND
	@echo GIT_PERF_MAKE_COMMAND=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_COMMAND)))'\' >>$@+
endif
2702 2703 2704
ifdef GIT_INTEROP_MAKE_OPTS
	@echo GIT_INTEROP_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_INTEROP_MAKE_OPTS)))'\' >>$@+
endif
2705 2706
ifdef GIT_TEST_INDEX_VERSION
	@echo GIT_TEST_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_INDEX_VERSION)))'\' >>$@+
2707
endif
2708
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2709

2710 2711 2712
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2713

2714 2715
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2716
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2717
		echo >&2 "    * new Python interpreter location"; \
2718 2719 2720 2721
		echo "$$VARS" >$@; \
            fi
endif

2722 2723 2724 2725 2726 2727 2728 2729
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)

bin-wrappers/%: wrap-for-bin.sh
	@mkdir -p bin-wrappers
	$(QUIET_GEN)sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
	     -e 's|@@BUILD_DIR@@|$(shell pwd)|' \
2730
	     -e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%,$(@F))|' < $< > $@ && \
2731
	chmod +x $@
2732

2733 2734 2735 2736
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2737
export NO_SVN_TESTS
2738
export TEST_NO_MALLOC_CHECK
2739

2740 2741
### Testing rules

2742
test: all
P
Petr Baudis 已提交
2743 2744
	$(MAKE) -C t/ all

2745 2746 2747 2748 2749
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

2750
t/helper/test-line-buffer$X: $(VCSSVN_LIB)
R
René Scharfe 已提交
2751

2752
t/helper/test-svn-fe$X: $(VCSSVN_LIB)
D
David Barr 已提交
2753

2754
.PRECIOUS: $(TEST_OBJS)
2755

2756 2757
t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))

2758
t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS)
D
David Barr 已提交
2759
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
2760

2761
check-sha1:: t/helper/test-tool$X
2762
	t/helper/test-sha1.sh
2763

2764 2765 2766 2767
SP_OBJ = $(patsubst %.o,%.sp,$(C_OBJ))

$(SP_OBJ): %.sp: %.c GIT-CFLAGS FORCE
	$(QUIET_SP)cgcc -no-compile $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) \
2768
		$(SPARSE_FLAGS) $(SP_EXTRA_FLAGS) $<
2769 2770 2771 2772

.PHONY: sparse $(SP_OBJ)
sparse: $(SP_OBJ)

R
Ramsay Jones 已提交
2773
GEN_HDRS := command-list.h unicode-width.h
2774 2775 2776 2777
EXCEPT_HDRS := $(GEN_HDRS) compat/% xdiff/%
ifndef GCRYPT_SHA256
	EXCEPT_HDRS += sha256/gcrypt.h
endif
R
Ramsay Jones 已提交
2778 2779 2780 2781 2782 2783 2784 2785 2786
CHK_HDRS = $(filter-out $(EXCEPT_HDRS),$(patsubst ./%,%,$(LIB_H)))
HCO = $(patsubst %.h,%.hco,$(CHK_HDRS))

$(HCO): %.hco: %.h FORCE
	$(QUIET_HDR)$(CC) -include git-compat-util.h -I. -o /dev/null -c -xc $<

.PHONY: hdr-check $(HCO)
hdr-check: $(HCO)

2787 2788 2789 2790
.PHONY: style
style:
	git clang-format --style file --diff --extensions c,h

N
Nguyễn Thái Ngọc Duy 已提交
2791
check: command-list.h
2792
	@if sparse; \
2793
	then \
2794
		echo >&2 "Use 'make sparse' instead"; \
2795
		$(MAKE) --no-print-directory sparse; \
2796
	else \
2797
		echo >&2 "Did you mean 'make test'?"; \
2798 2799
		exit 1; \
	fi
P
Petr Baudis 已提交
2800

R
René Scharfe 已提交
2801
C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
2802 2803 2804 2805 2806 2807 2808
ifdef DC_SHA1_SUBMODULE
COCCI_SOURCES = $(filter-out sha1collisiondetection/%,$(C_SOURCES))
else
COCCI_SOURCES = $(filter-out sha1dc/%,$(C_SOURCES))
endif

%.cocci.patch: %.cocci $(COCCI_SOURCES)
R
René Scharfe 已提交
2809
	@echo '    ' SPATCH $<; \
2810
	ret=0; \
2811
	for f in $(COCCI_SOURCES); do \
2812 2813 2814 2815 2816 2817 2818 2819 2820
		$(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS) || \
			{ ret=$$?; break; }; \
	done >$@+ 2>$@.log; \
	if test $$ret != 0; \
	then \
		cat $@.log; \
		exit 1; \
	fi; \
	mv $@+ $@; \
R
René Scharfe 已提交
2821 2822 2823 2824
	if test -s $@; \
	then \
		echo '    ' SPATCH result: $@; \
	fi
2825
coccicheck: $(addsuffix .patch,$(filter-out %.pending.cocci,$(wildcard contrib/coccinelle/*.cocci)))
R
René Scharfe 已提交
2826

2827 2828 2829 2830
# See contrib/coccinelle/README
coccicheck-pending: $(addsuffix .patch,$(wildcard contrib/coccinelle/*.pending.cocci))

.PHONY: coccicheck coccicheck-pending
R
René Scharfe 已提交
2831

P
Petr Baudis 已提交
2832 2833
### Installation rules

2834
ifneq ($(filter /%,$(firstword $(template_dir))),)
2835
template_instdir = $(template_dir)
2836 2837
else
template_instdir = $(prefix)/$(template_dir)
2838 2839 2840
endif
export template_instdir

2841
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2842
gitexec_instdir = $(gitexecdir)
2843 2844
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2845 2846 2847 2848
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2849 2850 2851 2852 2853 2854 2855
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2856 2857
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2858
.PHONY: profile-install profile-fast-install
2859 2860 2861 2862 2863 2864
profile-install: profile
	$(MAKE) install

profile-fast-install: profile-fast
	$(MAKE) install

2865
install: all
2866
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2867 2868
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2869
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2870
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2871
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2872
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2873
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2874 2875 2876 2877 2878
ifndef NO_GETTEXT
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(localedir_SQ)'
	(cd po/build/locale && $(TAR) cf - .) | \
	(cd '$(DESTDIR_SQ)$(localedir_SQ)' && umask 022 && $(TAR) xof -)
endif
2879
ifndef NO_PERL
2880 2881 2882
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perllibdir_SQ)'
	(cd perl/build/lib && $(TAR) cf - .) | \
	(cd '$(DESTDIR_SQ)$(perllibdir_SQ)' && umask 022 && $(TAR) xof -)
J
Junio C Hamano 已提交
2883
	$(MAKE) -C gitweb install
2884
endif
E
Eygene Ryabinkin 已提交
2885
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2886
	$(MAKE) -C gitk-git install
2887
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2888
endif
2889
ifneq (,$X)
2890
	$(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) git$X)), test '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p' -ef '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p$X' || $(RM) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p';)
2891
endif
2892

2893
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2894
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2895
	destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e 's|[^/][^/]*|..|g') && \
2896
	{ test "$$bindir/" = "$$execdir/" || \
2897 2898
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
2899 2900 2901 2902 2903
		test -n "$(INSTALL_SYMLINKS)" && \
		ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/$$p" "$$execdir/$$p" || \
		{ test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
		  ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		  cp "$$bindir/$$p" "$$execdir/$$p" || exit; } \
2904 2905
	  done; \
	} && \
2906 2907
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
2908 2909 2910 2911 2912 2913
		test -n "$(INSTALL_SYMLINKS)" && \
		ln -s "git$X" "$$bindir/$$p" || \
		{ test -z "$(NO_INSTALL_HARDLINKS)" && \
		  ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \
		  ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \
		  cp "$$bindir/git$X" "$$bindir/$$p" || exit; } \
2914
	done && \
2915
	for p in $(BUILT_INS); do \
2916
		$(RM) "$$execdir/$$p" && \
2917 2918 2919 2920 2921 2922
		test -n "$(INSTALL_SYMLINKS)" && \
		ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/git$X" "$$execdir/$$p" || \
		{ test -z "$(NO_INSTALL_HARDLINKS)" && \
		  ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \
		  ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \
		  cp "$$execdir/git$X" "$$execdir/$$p" || exit; } \
2923
	done && \
2924 2925
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2926
		$(RM) "$$execdir/$$p" && \
2927 2928 2929 2930 2931 2932
		test -n "$(INSTALL_SYMLINKS)" && \
		ln -s "git-remote-http$X" "$$execdir/$$p" || \
		{ test -z "$(NO_INSTALL_HARDLINKS)" && \
		  ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \
		  ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \
		  cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \
2933
	done && \
2934
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2935

2936
.PHONY: install-gitweb install-doc install-man install-man-perl install-html install-info install-pdf
E
Elia Pinto 已提交
2937
.PHONY: quick-install-doc quick-install-man quick-install-html
2938 2939 2940
install-gitweb:
	$(MAKE) -C gitweb install

2941
install-doc: install-man-perl
P
Petr Baudis 已提交
2942 2943
	$(MAKE) -C Documentation install

2944
install-man: install-man-perl
2945 2946
	$(MAKE) -C Documentation install-man

2947
install-man-perl: man-perl
2948 2949 2950 2951
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mandir_SQ)/man3'
	(cd perl/build/man/man3 && $(TAR) cf - .) | \
	(cd '$(DESTDIR_SQ)$(mandir_SQ)/man3' && umask 022 && $(TAR) xof -)

2952 2953 2954
install-html:
	$(MAKE) -C Documentation install-html

2955 2956 2957
install-info:
	$(MAKE) -C Documentation install-info

2958 2959 2960
install-pdf:
	$(MAKE) -C Documentation install-pdf

2961 2962
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2963

2964 2965 2966
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2967 2968 2969
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2970 2971 2972 2973


### Maintainer's dist rules

2974
GIT_TARNAME = git-$(GIT_VERSION)
2975
dist: git-archive$(X) configure
2976 2977
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2978
	@mkdir -p $(GIT_TARNAME)
2979
	@cp configure $(GIT_TARNAME)
2980
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2981
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2982
	$(TAR) rf $(GIT_TARNAME).tar \
2983
		$(GIT_TARNAME)/configure \
2984
		$(GIT_TARNAME)/version \
2985
		$(GIT_TARNAME)/git-gui/version
2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000
ifdef DC_SHA1_SUBMODULE
	@mkdir -p $(GIT_TARNAME)/sha1collisiondetection/lib
	@cp sha1collisiondetection/LICENSE.txt \
		$(GIT_TARNAME)/sha1collisiondetection/
	@cp sha1collisiondetection/LICENSE.txt \
		$(GIT_TARNAME)/sha1collisiondetection/
	@cp sha1collisiondetection/lib/sha1.[ch] \
		$(GIT_TARNAME)/sha1collisiondetection/lib/
	@cp sha1collisiondetection/lib/ubc_check.[ch] \
		$(GIT_TARNAME)/sha1collisiondetection/lib/
	$(TAR) rf $(GIT_TARNAME).tar \
		$(GIT_TARNAME)/sha1collisiondetection/LICENSE.txt \
		$(GIT_TARNAME)/sha1collisiondetection/lib/sha1.[ch] \
		$(GIT_TARNAME)/sha1collisiondetection/lib/ubc_check.[ch]
endif
3001
	@$(RM) -r $(GIT_TARNAME)
3002
	gzip -f -9 $(GIT_TARNAME).tar
3003

3004 3005 3006 3007
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
3008

3009 3010
artifacts-tar:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) \
		GIT-BUILD-OPTIONS $(TEST_PROGRAMS) $(test_bindir_programs) \
3011
		$(MOFILES)
3012 3013 3014 3015 3016 3017 3018
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) \
		SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
	test -n "$(ARTIFACTS_DIRECTORY)"
	mkdir -p "$(ARTIFACTS_DIRECTORY)"
	$(TAR) czf "$(ARTIFACTS_DIRECTORY)/artifacts.tar.gz" $^ templates/blt/
.PHONY: artifacts-tar

3019 3020
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
3021
.PHONY: dist-doc distclean
3022
dist-doc:
3023
	$(RM) -r .doc-tmp-dir
3024 3025 3026 3027 3028
	mkdir .doc-tmp-dir
	$(MAKE) -C Documentation WEBDOC_DEST=../.doc-tmp-dir install-webdoc
	cd .doc-tmp-dir && $(TAR) cf ../$(htmldocs).tar .
	gzip -n -9 -f $(htmldocs).tar
	:
3029
	$(RM) -r .doc-tmp-dir
3030
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
3031
	$(MAKE) -C Documentation DESTDIR=./ \
3032
		man1dir=../.doc-tmp-dir/man1 \
3033
		man5dir=../.doc-tmp-dir/man5 \
3034
		man7dir=../.doc-tmp-dir/man7 \
3035 3036 3037
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
3038
	$(RM) -r .doc-tmp-dir
3039

P
Petr Baudis 已提交
3040
### Cleaning rules
3041

3042 3043
distclean: clean
	$(RM) configure
3044 3045 3046
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
3047

3048 3049 3050 3051
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

3052 3053 3054 3055
cocciclean:
	$(RM) contrib/coccinelle/*.cocci.patch*

clean: profile-clean coverage-clean cocciclean
3056 3057
	$(RM) *.res
	$(RM) $(OBJECTS)
3058
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
3059
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
3060
	$(RM) $(TEST_PROGRAMS)
3061
	$(RM) $(FUZZ_PROGRAMS)
3062
	$(RM) -r bin-wrappers $(dep_dirs)
3063
	$(RM) -r po/build/
N
Nguyễn Thái Ngọc Duy 已提交
3064
	$(RM) *.pyc *.pyo */*.pyc */*.pyo command-list.h $(ETAGS_TARGET) tags cscope*
3065 3066 3067
	$(RM) -r $(GIT_TARNAME) .doc-tmp-dir
	$(RM) $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
	$(RM) $(htmldocs).tar.gz $(manpages).tar.gz
3068
	$(MAKE) -C Documentation/ clean
3069
	$(RM) Documentation/GIT-EXCLUDED-PROGRAMS
3070
ifndef NO_PERL
3071
	$(MAKE) -C gitweb clean
3072
	$(RM) -r perl/build/
3073
endif
P
Petr Baudis 已提交
3074
	$(MAKE) -C templates/ clean
3075
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
3076
ifndef NO_TCLTK
J
Junio C Hamano 已提交
3077
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
3078 3079
	$(MAKE) -C git-gui clean
endif
3080
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
3081
	$(RM) GIT-USER-AGENT GIT-PREFIX
3082
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PERL-HEADER GIT-PYTHON-VARS
3083

3084
.PHONY: all install profile-clean cocciclean clean strip
3085
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
3086
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
3087

J
Junio C Hamano 已提交
3088 3089
### Check documentation
#
J
Jeff King 已提交
3090 3091 3092 3093
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
3094
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
3095 3096

.PHONY: check-docs
J
Junio C Hamano 已提交
3097
check-docs::
3098
	$(MAKE) -C Documentation lint-docs
3099
	@(for v in $(patsubst %$X,%,$(ALL_COMMANDS)); \
J
Junio C Hamano 已提交
3100 3101 3102
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
3103
		git-merge-resolve | git-merge-subtree | \
3104
		git-fsck-objects | git-init-db | \
3105
		git-remote-* | git-stage | git-legacy-* | \
3106
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
3107 3108 3109
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
3110
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
3111
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
3112 3113 3114 3115
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
3116 3117
	done; \
	( \
3118 3119
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
3120
		    -e '/guide$$/d' \
3121
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
3122
		    -e 's/^/listed /' command-list.txt; \
3123 3124
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
3125
		sed -e 's|^|documented |' \
3126 3127 3128
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
3129
		case " $(patsubst %$X,%,$(ALL_COMMANDS) $(EXCLUDED_PROGRAMS)) " in \
3130 3131 3132 3133
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
3134 3135 3136 3137 3138

### Make sure built-ins do not have dups and listed in git.c
#
check-builtins::
	./check-builtins.sh
J
Junio C Hamano 已提交
3139

3140 3141
### Test suite coverage testing
#
3142
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
3143
.PHONY: coverage-untested-functions cover_db cover_db_html
3144
.PHONY: coverage-clean-results
3145 3146

coverage:
3147
	$(MAKE) coverage-test
3148
	$(MAKE) coverage-untested-functions
3149

3150
object_dirs := $(sort $(dir $(OBJECTS)))
3151
coverage-clean-results:
3152 3153 3154
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
3155
	$(RM) -r cover_db/
3156
	$(RM) -r cover_db_html/
3157

3158 3159 3160
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

3161 3162
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
3163
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
3164

3165
coverage-compile:
3166
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
3167 3168

coverage-test: coverage-clean-results coverage-compile
3169
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
3170
		DEFAULT_TEST_TARGET=test -j1 test
3171

3172 3173 3174 3175 3176
coverage-prove: coverage-clean-results coverage-compile
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
		DEFAULT_TEST_TARGET=prove GIT_PROVE_OPTS="$(GIT_PROVE_OPTS) -j1" \
		-j1 test

3177
coverage-report:
3178
	$(QUIET_GCOV)for dir in $(object_dirs); do \
3179
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
3180
	done
3181 3182

coverage-untested-functions: coverage-report
3183 3184
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
3185
		> coverage-untested-functions
3186 3187 3188

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
3189 3190 3191

cover_db_html: cover_db
	cover -report html -outputdir cover_db_html cover_db
A
Andi Kleen 已提交
3192

3193 3194 3195 3196 3197 3198 3199 3200 3201 3202

### Fuzz testing
#
# Building fuzz targets generally requires a special set of compiler flags that
# are not necessarily appropriate for general builds, and that vary greatly
# depending on the compiler version used.
#
# An example command to build against libFuzzer from LLVM 4.0.0:
#
# make CC=clang CXX=clang++ \
3203
#      CFLAGS="-fsanitize-coverage=trace-pc-guard -fsanitize=address" \
3204 3205 3206
#      LIB_FUZZING_ENGINE=/usr/lib/llvm-4.0/lib/libFuzzer.a \
#      fuzz-all
#
3207 3208
FUZZ_CXXFLAGS ?= $(CFLAGS)

3209 3210 3211
.PHONY: fuzz-all

$(FUZZ_PROGRAMS): all
3212
	$(QUIET_LINK)$(CXX) $(FUZZ_CXXFLAGS) $(LIB_OBJS) $(BUILTIN_OBJS) \
3213 3214 3215
		$(XDIFF_OBJS) $(EXTLIBS) git.o $@.o $(LIB_FUZZING_ENGINE) -o $@

fuzz-all: $(FUZZ_PROGRAMS)