Makefile 95.9 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 445 446 447 448
# 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".
449
#
J
Jeff King 已提交
450 451 452
# 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).
453
#
454 455
# When cross-compiling, define HOST_CPU as the canonical name of the CPU on
# which the built Git will run (for instance "x86_64").
456 457 458 459 460 461 462
#
# 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.
463 464 465 466 467 468 469 470 471 472 473 474
#
# 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.
475 476 477 478
#
# 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).
479
#
480 481 482
# Define DEVELOPER to enable more compiler warnings. Compiler version
# and family are auto detected, but could be overridden by defining
# COMPILER_FEATURES (see config.mak.dev)
483 484 485 486 487 488 489 490 491 492
#
# 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.
493 494 495 496 497 498
#
#    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.
499 500 501 502 503
#
#    pedantic:
#
#        Enable -pedantic compilation. This also disables
#        USE_PARENS_AROUND_GETTEXT_N to produce only relevant warnings.
504

505
GIT-VERSION-FILE: FORCE
506
	@$(SHELL_PATH) ./GIT-VERSION-GEN
507
-include GIT-VERSION-FILE
508

J
Junio C Hamano 已提交
509
# CFLAGS and LDFLAGS are for the users to override from the command line.
510
CFLAGS = -g -O2 -Wall
J
Junio C Hamano 已提交
511
LDFLAGS =
512
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
513
ALL_LDFLAGS = $(LDFLAGS)
514 515
ARFLAGS = rcs

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
PTHREAD_LIBS = -lpthread
576
PTHREAD_CFLAGS =
577
GCOV = gcov
578
STRIP = strip
R
René Scharfe 已提交
579
SPATCH = spatch
580

581 582
export TCL_PATH TCLTK_PATH

583 584 585 586 587
# user customisation variable for 'sparse' target
SPARSE_FLAGS ?=
# internal/platform customisation variable for 'sparse'
SP_EXTRA_FLAGS =

588
SPATCH_FLAGS = --all-includes --patch .
589

590
BASIC_CFLAGS = -I.
P
Petr Baudis 已提交
591
BASIC_LDFLAGS =
592

593 594 595 596 597
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
598 599
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
600
GENERATED_H =
601
EXTRA_CPPFLAGS =
602 603
FUZZ_OBJS =
FUZZ_PROGRAMS =
604
LIB_OBJS =
605
PROGRAM_OBJS =
606 607
PROGRAMS =
SCRIPT_PERL =
608
SCRIPT_PYTHON =
609
SCRIPT_SH =
610
SCRIPT_LIB =
611
TEST_BUILTINS_OBJS =
612
TEST_PROGRAMS_NEED_X =
613

J
Jonathan Nieder 已提交
614 615 616 617 618 619
# 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

620
SCRIPT_SH += git-bisect.sh
621
SCRIPT_SH += git-difftool--helper.sh
622 623 624 625 626 627
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
628
SCRIPT_SH += git-legacy-rebase.sh
629
SCRIPT_SH += git-remote-testgit.sh
630 631 632 633 634
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

635 636
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
637
SCRIPT_LIB += git-rebase--am
638
SCRIPT_LIB += git-rebase--common
639
SCRIPT_LIB += git-rebase--preserve-merges
640
SCRIPT_LIB += git-sh-setup
641
SCRIPT_LIB += git-sh-i18n
642

643 644 645 646 647 648 649
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
650

P
Pete Wyckoff 已提交
651
SCRIPT_PYTHON += git-p4.py
652

653
NO_INSTALL += git-remote-testgit
654

655 656 657 658 659
# 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))

660 661 662 663
SCRIPT_SH_INS = $(filter-out $(NO_INSTALL),$(SCRIPT_SH_GEN))
SCRIPT_PERL_INS = $(filter-out $(NO_INSTALL),$(SCRIPT_PERL_GEN))
SCRIPT_PYTHON_INS = $(filter-out $(NO_INSTALL),$(SCRIPT_PYTHON_GEN))

664 665 666 667 668 669 670 671 672
# 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
673
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
674
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
675
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
676
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
677
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
678
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
679 680 681 682 683 684 685 686 687

.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)

688 689 690
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
691
	  git-instaweb
692

693 694
ETAGS_TARGET = TAGS

695
FUZZ_OBJS += fuzz-commit-graph.o
696
FUZZ_OBJS += fuzz-pack-headers.o
697
FUZZ_OBJS += fuzz-pack-idx.o
698 699 700 701 702 703

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

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

704 705
# Empty...
EXTRA_PROGRAMS =
706

707 708
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
709

710
PROGRAM_OBJS += credential-store.o
711
PROGRAM_OBJS += daemon.o
712
PROGRAM_OBJS += fast-import.o
713
PROGRAM_OBJS += http-backend.o
714
PROGRAM_OBJS += imap-send.o
715
PROGRAM_OBJS += sh-i18n--envsubst.o
716
PROGRAM_OBJS += shell.o
717
PROGRAM_OBJS += remote-testsvn.o
718

719 720 721
# Binary suffix, set to .exe for Windows builds
X =

722
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
723

724
TEST_BUILTINS_OBJS += test-chmtime.o
725
TEST_BUILTINS_OBJS += test-config.o
726
TEST_BUILTINS_OBJS += test-ctype.o
727
TEST_BUILTINS_OBJS += test-date.o
728
TEST_BUILTINS_OBJS += test-delta.o
729
TEST_BUILTINS_OBJS += test-drop-caches.o
730
TEST_BUILTINS_OBJS += test-dump-cache-tree.o
731
TEST_BUILTINS_OBJS += test-dump-fsmonitor.o
732
TEST_BUILTINS_OBJS += test-dump-split-index.o
733
TEST_BUILTINS_OBJS += test-dump-untracked-cache.o
734
TEST_BUILTINS_OBJS += test-example-decorate.o
735
TEST_BUILTINS_OBJS += test-genrandom.o
736
TEST_BUILTINS_OBJS += test-genzeros.o
737
TEST_BUILTINS_OBJS += test-hash.o
738
TEST_BUILTINS_OBJS += test-hashmap.o
739
TEST_BUILTINS_OBJS += test-hash-speed.o
740
TEST_BUILTINS_OBJS += test-index-version.o
741
TEST_BUILTINS_OBJS += test-json-writer.o
742
TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
743
TEST_BUILTINS_OBJS += test-match-trees.o
744
TEST_BUILTINS_OBJS += test-mergesort.o
745
TEST_BUILTINS_OBJS += test-mktemp.o
746
TEST_BUILTINS_OBJS += test-online-cpus.o
747
TEST_BUILTINS_OBJS += test-parse-options.o
748
TEST_BUILTINS_OBJS += test-path-utils.o
749
TEST_BUILTINS_OBJS += test-pkt-line.o
750
TEST_BUILTINS_OBJS += test-prio-queue.o
751
TEST_BUILTINS_OBJS += test-reach.o
752
TEST_BUILTINS_OBJS += test-read-cache.o
753
TEST_BUILTINS_OBJS += test-read-midx.o
754
TEST_BUILTINS_OBJS += test-ref-store.o
755
TEST_BUILTINS_OBJS += test-regex.o
756
TEST_BUILTINS_OBJS += test-repository.o
757
TEST_BUILTINS_OBJS += test-revision-walking.o
758
TEST_BUILTINS_OBJS += test-run-command.o
759
TEST_BUILTINS_OBJS += test-scrap-cache-tree.o
760
TEST_BUILTINS_OBJS += test-sha1.o
761
TEST_BUILTINS_OBJS += test-sha1-array.o
762
TEST_BUILTINS_OBJS += test-sha256.o
763
TEST_BUILTINS_OBJS += test-sigchain.o
764
TEST_BUILTINS_OBJS += test-strcmp-offset.o
765
TEST_BUILTINS_OBJS += test-string-list.o
766
TEST_BUILTINS_OBJS += test-submodule-config.o
767
TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
768
TEST_BUILTINS_OBJS += test-subprocess.o
769
TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
770
TEST_BUILTINS_OBJS += test-xml-encode.o
771
TEST_BUILTINS_OBJS += test-wildmatch.o
772
TEST_BUILTINS_OBJS += test-windows-named-pipe.o
773
TEST_BUILTINS_OBJS += test-write-cache.o
774

775 776
# Do not add more tests here unless they have extra dependencies. Add
# them in TEST_BUILTINS_OBJS above.
J
Johannes Schindelin 已提交
777
TEST_PROGRAMS_NEED_X += test-fake-ssh
D
David Barr 已提交
778
TEST_PROGRAMS_NEED_X += test-line-buffer
D
David Barr 已提交
779
TEST_PROGRAMS_NEED_X += test-svn-fe
780
TEST_PROGRAMS_NEED_X += test-tool
781

782
TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
783

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

BUILT_INS += git-cherry$X
789
BUILT_INS += git-cherry-pick$X
790 791 792 793 794
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 已提交
795
BUILT_INS += git-stage$X
796 797
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
798

799 800
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
801
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
802

E
Eygene Ryabinkin 已提交
803
# what 'all' will build but not install in gitexecdir
804
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
805

806 807 808 809 810 811 812 813 814
# 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

815 816 817 818 819 820 821
# 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
822 823 824
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
825

L
Luben Tuikov 已提交
826
export PERL_PATH
827
export PYTHON_PATH
L
Luben Tuikov 已提交
828

J
Jeff King 已提交
829 830
TEST_SHELL_PATH = $(SHELL_PATH)

831 832 833
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
834

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

837 838 839 840 841
LIB_H = $(shell $(FIND) . \
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
	-name '*.h' -print)
842

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

1039
BUILTIN_OBJS += builtin/add.o
1040
BUILTIN_OBJS += builtin/am.o
1041 1042 1043 1044 1045 1046 1047 1048 1049
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 已提交
1050
BUILTIN_OBJS += builtin/check-ignore.o
1051
BUILTIN_OBJS += builtin/check-mailmap.o
1052 1053 1054 1055 1056
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
1057
BUILTIN_OBJS += builtin/column.o
1058 1059
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
1060
BUILTIN_OBJS += builtin/commit-graph.o
1061 1062
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
1063
BUILTIN_OBJS += builtin/credential.o
1064 1065 1066 1067 1068
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
1069
BUILTIN_OBJS += builtin/difftool.o
1070 1071 1072 1073 1074 1075 1076
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
1077
BUILTIN_OBJS += builtin/get-tar-commit-id.o
1078 1079 1080 1081 1082
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
1083
BUILTIN_OBJS += builtin/interpret-trailers.o
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
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 已提交
1099
BUILTIN_OBJS += builtin/multi-pack-index.o
1100 1101
BUILTIN_OBJS += builtin/mv.o
BUILTIN_OBJS += builtin/name-rev.o
J
Junio C Hamano 已提交
1102
BUILTIN_OBJS += builtin/notes.o
1103 1104 1105 1106 1107 1108
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 已提交
1109
BUILTIN_OBJS += builtin/pull.o
1110
BUILTIN_OBJS += builtin/push.o
1111
BUILTIN_OBJS += builtin/range-diff.o
1112
BUILTIN_OBJS += builtin/read-tree.o
1113
BUILTIN_OBJS += builtin/rebase.o
1114
BUILTIN_OBJS += builtin/rebase--interactive.o
1115 1116 1117
BUILTIN_OBJS += builtin/receive-pack.o
BUILTIN_OBJS += builtin/reflog.o
BUILTIN_OBJS += builtin/remote.o
I
Ilari Liusvaara 已提交
1118
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
1119
BUILTIN_OBJS += builtin/remote-fd.o
1120
BUILTIN_OBJS += builtin/repack.o
1121 1122 1123 1124 1125 1126 1127 1128
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
B
Brandon Williams 已提交
1129
BUILTIN_OBJS += builtin/serve.o
1130 1131
BUILTIN_OBJS += builtin/shortlog.o
BUILTIN_OBJS += builtin/show-branch.o
J
Jeff King 已提交
1132
BUILTIN_OBJS += builtin/show-index.o
1133 1134
BUILTIN_OBJS += builtin/show-ref.o
BUILTIN_OBJS += builtin/stripspace.o
1135
BUILTIN_OBJS += builtin/submodule--helper.o
1136 1137 1138 1139 1140 1141 1142 1143
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
1144
BUILTIN_OBJS += builtin/upload-pack.o
1145
BUILTIN_OBJS += builtin/var.o
1146
BUILTIN_OBJS += builtin/verify-commit.o
1147 1148
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
1149
BUILTIN_OBJS += builtin/worktree.o
1150
BUILTIN_OBJS += builtin/write-tree.o
1151

1152
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
1153
EXTLIBS =
1154

J
Jeff King 已提交
1155 1156
GIT_USER_AGENT = git/$(GIT_VERSION)

1157 1158 1159 1160
ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/sha1.h)
DC_SHA1_SUBMODULE = auto
endif

1161
include config.mak.uname
1162
-include config.mak.autogen
1163
-include config.mak
1164

1165
ifdef DEVELOPER
1166
include config.mak.dev
1167 1168
endif

1169 1170 1171 1172
comma := ,
empty :=
space := $(empty) $(empty)

1173
ifdef SANITIZE
1174
SANITIZERS := $(foreach flag,$(subst $(comma),$(space),$(SANITIZE)),$(flag))
1175
BASIC_CFLAGS += -fsanitize=$(SANITIZE) -fno-sanitize-recover=$(SANITIZE)
1176
BASIC_CFLAGS += -fno-omit-frame-pointer
1177
ifneq ($(filter undefined,$(SANITIZERS)),)
1178 1179
BASIC_CFLAGS += -DNO_UNALIGNED_LOADS
endif
1180 1181 1182
ifneq ($(filter leak,$(SANITIZERS)),)
BASIC_CFLAGS += -DSUPPRESS_ANNOTATED_LEAKS
endif
1183 1184
endif

1185 1186 1187 1188 1189 1190 1191 1192
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

1193
ifndef COMPUTE_HEADER_DEPENDENCIES
1194 1195 1196 1197
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
1198
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
1199 1200
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
1201
	echo $$?)
1202
ifeq ($(dep_check),0)
1203 1204 1205
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1206
endif
1207 1208
endif

1209
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1210
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1211 1212 1213 1214 1215
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1216 1217
endif

1218
ifdef SANE_TOOL_PATH
1219 1220
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1221 1222
PATH := $(SANE_TOOL_PATH):${PATH}
else
1223
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1224 1225
endif

1226 1227 1228 1229 1230 1231
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 已提交
1232 1233 1234 1235
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1236 1237 1238 1239
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1240 1241 1242 1243 1244 1245 1246 1247
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

1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
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
1261
	ifndef NO_APPLE_COMMON_CRYPTO
1262
		NO_OPENSSL = YesPlease
1263 1264 1265
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1266
	NO_REGEX = YesPlease
1267
	PTHREAD_LIBS =
1268 1269
endif

1270 1271 1272 1273 1274 1275 1276 1277
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
1278 1279
endif

1280 1281 1282 1283 1284
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

1285
USE_LIBPCRE2 ?= $(USE_LIBPCRE)
1286

1287 1288 1289
ifneq (,$(USE_LIBPCRE2))
	ifdef USE_LIBPCRE1
$(error Only set USE_LIBPCRE2 (or its alias USE_LIBPCRE) or USE_LIBPCRE1, not both!)
M
Michał Kiedrowicz 已提交
1290
	endif
1291

1292 1293 1294 1295 1296
	BASIC_CFLAGS += -DUSE_LIBPCRE2
	EXTLIBS += -lpcre2-8
endif

ifdef USE_LIBPCRE1
1297
	BASIC_CFLAGS += -DUSE_LIBPCRE1
M
Michał Kiedrowicz 已提交
1298
	EXTLIBS += -lpcre
1299 1300 1301 1302

ifdef NO_LIBPCRE1_JIT
	BASIC_CFLAGS += -DNO_LIBPCRE1_JIT
endif
M
Michał Kiedrowicz 已提交
1303 1304
endif

1305 1306 1307
ifdef LIBPCREDIR
	BASIC_CFLAGS += -I$(LIBPCREDIR)/include
	EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
M
Michał Kiedrowicz 已提交
1308 1309
endif

K
Kirill Smelkov 已提交
1310 1311 1312 1313
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1314
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1315
IMAP_SEND_LDFLAGS =
1316

D
Daniel Barkalow 已提交
1317 1318
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1319 1320 1321
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1322
else
1323
	ifdef CURLDIR
1324 1325
		# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
		BASIC_CFLAGS += -I$(CURLDIR)/include
1326
		CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib)
1327
	else
1328
		CURL_LIBCURL =
1329
	endif
1330

1331 1332 1333 1334 1335 1336
ifdef CURL_LDFLAGS
	CURL_LIBCURL += $(CURL_LDFLAGS)
else
	CURL_LIBCURL += $(shell $(CURL_CONFIG) --libs)
endif

1337 1338 1339
	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)
1340 1341
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1342
	curl_check := $(shell (echo 070908; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1343 1344
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1345
			PROGRAM_OBJS += http-push.o
1346
		endif
1347
	endif
1348
	curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1349 1350 1351 1352 1353 1354 1355 1356
	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
1357
	ifndef NO_EXPAT
1358 1359 1360 1361 1362 1363
		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 已提交
1364 1365 1366
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1367
	endif
1368
endif
R
Remi Pommarel 已提交
1369
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
1370

1371 1372
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1373
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1374 1375 1376
endif
EXTLIBS += -lz

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

1598
ifdef NO_ICONV
1599
	BASIC_CFLAGS += -DNO_ICONV
1600 1601
endif

1602 1603 1604 1605
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1606 1607 1608 1609
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1610 1611 1612 1613
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1614 1615 1616 1617 1618
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

1619 1620 1621
ifdef OPENSSL_SHA1
	EXTLIBS += $(LIB_4_CRYPTO)
	BASIC_CFLAGS += -DSHA1_OPENSSL
J
Jeff King 已提交
1622
else
1623 1624
ifdef BLK_SHA1
	LIB_OBJS += block-sha1/sha1.o
1625
	BASIC_CFLAGS += -DSHA1_BLK
1626
else
1627 1628
ifdef PPC_SHA1
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1629
	BASIC_CFLAGS += -DSHA1_PPC
1630 1631 1632
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
1633
	BASIC_CFLAGS += -DSHA1_APPLE
1634
else
1635
	DC_SHA1 := YesPlease
1636 1637
	BASIC_CFLAGS += -DSHA1_DC
	LIB_OBJS += sha1dc_git.o
1638 1639
ifdef DC_SHA1_EXTERNAL
	ifdef DC_SHA1_SUBMODULE
1640
		ifneq ($(DC_SHA1_SUBMODULE),auto)
1641
$(error Only set DC_SHA1_EXTERNAL or DC_SHA1_SUBMODULE, not both)
1642
		endif
1643 1644 1645 1646
	endif
	BASIC_CFLAGS += -DDC_SHA1_EXTERNAL
	EXTLIBS += -lsha1detectcoll
else
1647 1648 1649 1650 1651
ifdef DC_SHA1_SUBMODULE
	LIB_OBJS += sha1collisiondetection/lib/sha1.o
	LIB_OBJS += sha1collisiondetection/lib/ubc_check.o
	BASIC_CFLAGS += -DDC_SHA1_SUBMODULE
else
1652 1653
	LIB_OBJS += sha1dc/sha1.o
	LIB_OBJS += sha1dc/ubc_check.o
1654
endif
1655 1656 1657 1658 1659
	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\""
1660 1661 1662
endif
endif
endif
1663
endif
1664
endif
1665

1666 1667 1668 1669
ifdef OPENSSL_SHA256
	EXTLIBS += $(LIB_4_CRYPTO)
	BASIC_CFLAGS += -DSHA256_OPENSSL
else
1670 1671 1672 1673 1674 1675 1676
ifdef GCRYPT_SHA256
	BASIC_CFLAGS += -DSHA256_GCRYPT
	EXTLIBS += -lgcrypt
else
	LIB_OBJS += sha256/block/sha256.o
	BASIC_CFLAGS += -DSHA256_BLK
endif
1677
endif
1678

1679 1680 1681 1682
ifdef SHA1_MAX_BLOCK_SIZE
	LIB_OBJS += compat/sha1-chunked.o
	BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
1683 1684 1685 1686
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1687 1688 1689 1690
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1691 1692 1693
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1694 1695 1696 1697
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
R
René Scharfe 已提交
1698 1699 1700 1701 1702
ifdef HAVE_ISO_QSORT_S
	COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S
else
	COMPAT_OBJS += compat/qsort_s.o
endif
1703 1704 1705
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1706

J
Junio C Hamano 已提交
1707 1708 1709
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1710
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1711
	EXTLIBS += $(PTHREAD_LIBS)
N
Nicolas Pitre 已提交
1712
endif
1713

1714 1715 1716 1717
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1718 1719
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1720
	EXTLIBS += $(CHARSET_LIB)
1721 1722
endif

1723 1724 1725 1726
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1727 1728 1729 1730
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1731 1732 1733
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1734 1735 1736
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1737 1738 1739 1740
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1741 1742 1743
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1744

1745
ifdef USE_NED_ALLOCATOR
1746 1747 1748 1749 1750 1751 1752 1753
	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
1754 1755
endif

1756 1757 1758 1759
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1760 1761 1762 1763
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1764 1765 1766 1767 1768
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1769 1770 1771 1772
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1773 1774 1775 1776
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1777 1778 1779 1780
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1781 1782 1783 1784
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1785 1786 1787 1788
ifdef HAVE_BSD_KERN_PROC_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_KERN_PROC_SYSCTL
endif

1789 1790 1791 1792
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1793 1794 1795 1796 1797 1798 1799 1800 1801
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

1802 1803 1804 1805
ifdef HAVE_WPGMPTR
	BASIC_CFLAGS += -DHAVE_WPGMPTR
endif

1806 1807 1808 1809 1810
ifdef FILENO_IS_A_MACRO
	COMPAT_CFLAGS += -DFILENO_IS_A_MACRO
	COMPAT_OBJS += compat/fileno.o
endif

1811
ifeq ($(TCLTK_PATH),)
1812
NO_TCLTK = NoThanks
1813 1814
endif

1815
ifeq ($(PERL_PATH),)
1816
NO_PERL = NoThanks
1817 1818
endif

1819
ifeq ($(PYTHON_PATH),)
1820
NO_PYTHON = NoThanks
1821 1822
endif

1823 1824 1825 1826
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1827
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1828 1829
QUIET_SUBDIR1  =

1830
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1831 1832 1833 1834 1835
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1836
ifneq ($(findstring s,$(MAKEFLAGS)),s)
S
Shawn O. Pearce 已提交
1837
ifndef V
A
Alex Riesen 已提交
1838
	QUIET_CC       = @echo '   ' CC $@;
1839 1840 1841 1842
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1843
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1844
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1845
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1846
	QUIET_GCOV     = @echo '   ' GCOV $@;
1847
	QUIET_SP       = @echo '   ' SP $<;
R
Ramsay Jones 已提交
1848
	QUIET_HDR      = @echo '   ' HDR $<;
1849
	QUIET_RC       = @echo '   ' RC $@;
1850
	QUIET_SUBDIR0  = +@subdir=
1851 1852
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1853
	export V
A
Alex Riesen 已提交
1854
	export QUIET_GEN
1855 1856
	export QUIET_BUILT_IN
endif
1857
endif
1858

J
Junio C Hamano 已提交
1859 1860 1861 1862
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1863 1864 1865 1866 1867 1868 1869
### profile feedback build
#

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

1870
ifeq ("$(PROFILE)","GEN")
1871
	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
1872
	EXTLIBS += -lgcov
1873 1874
	export CCACHE_DISABLE = t
	V = 1
1875 1876
else
ifneq ("$(PROFILE)","")
1877
	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1878 1879
	export CCACHE_DISABLE = t
	V = 1
1880
endif
1881
endif
1882

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

1885
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1886
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1887 1888 1889

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1890
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1891
mandir_SQ = $(subst ','\'',$(mandir))
1892 1893
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1894
perllibdir_SQ = $(subst ','\'',$(perllibdir))
1895
localedir_SQ = $(subst ','\'',$(localedir))
1896
localedir_relative_SQ = $(subst ','\'',$(localedir_relative))
1897
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
1898
gitexecdir_relative_SQ = $(subst ','\'',$(gitexecdir_relative))
1899
template_dir_SQ = $(subst ','\'',$(template_dir))
1900
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1901
prefix_SQ = $(subst ','\'',$(prefix))
1902
perllibdir_relative_SQ = $(subst ','\'',$(perllibdir_relative))
1903
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1904 1905

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
J
Jeff King 已提交
1906
TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
1907
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1908
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1909
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1910
DIFF_SQ = $(subst ','\'',$(DIFF))
1911
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1912

1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937
# 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

1938 1939 1940 1941 1942 1943 1944 1945 1946
# 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)
1947

1948
BASIC_CFLAGS += $(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1949
LIB_OBJS += $(COMPAT_OBJS)
1950

1951 1952 1953 1954 1955 1956 1957 1958 1959
# 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

1960 1961 1962 1963 1964 1965 1966
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

1967 1968 1969 1970 1971 1972 1973
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 已提交
1974 1975 1976
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))
1977 1978 1979 1980
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 已提交
1981

1982 1983 1984 1985
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1986 1987 1988 1989 1990
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)'

1991 1992 1993
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1994
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1995 1996


P
Petr Baudis 已提交
1997 1998
### Build rules

1999 2000
SHELL = $(SHELL_PATH)

2001 2002 2003
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
2004 2005 2006 2007
all:: profile
endif

profile:: profile-clean
2008 2009
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
2010 2011 2012 2013 2014
	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
		$(MAKE) PROFILE=GEN -j1 perf; \
	else \
		echo "Skipping profile of perf tests..."; \
	fi
2015 2016 2017 2018 2019 2020 2021
	$(MAKE) PROFILE=USE all

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

2022 2023

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
2024
ifneq (,$X)
2025
	$(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';)
2026
endif
2027

2028
all::
E
Eygene Ryabinkin 已提交
2029
ifndef NO_TCLTK
2030
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
2031
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
2032
endif
2033
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
2034

2035 2036 2037 2038 2039
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 已提交
2040
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
2041
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
2042

2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075
### 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.

2076
git.sp git.s git.o: GIT-PREFIX
2077
git.sp git.s git.o: EXTRA_CPPFLAGS = \
2078 2079 2080
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
2081

2082
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
2083 2084
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
		$(filter %.o,$^) $(LIBS)
2085

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

N
Nguyễn Thái Ngọc Duy 已提交
2088
builtin/help.sp builtin/help.s builtin/help.o: command-list.h GIT-PREFIX
2089
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
2090 2091 2092
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
2093

2094
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
2095
version.sp version.s version.o: EXTRA_CPPFLAGS = \
2096
	'-DGIT_VERSION="$(GIT_VERSION)"' \
2097
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)' \
2098 2099 2100
	'-DGIT_BUILT_FROM_COMMIT="$(shell \
		GIT_CEILING_DIRECTORIES="$(CURDIR)/.." \
		git rev-parse -q --verify HEAD 2>/dev/null)"'
2101

J
Junio C Hamano 已提交
2102
$(BUILT_INS): git$X
2103
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
2104 2105 2106
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
2107

2108
command-list.h: generate-cmdlist.sh command-list.txt
2109

2110
command-list.h: $(wildcard Documentation/git*.txt) Documentation/*config.txt Documentation/config/*.txt
2111
	$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh command-list.txt >$@+ && mv $@+ $@
F
Fredrik Kuivinen 已提交
2112

2113
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
2114
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
2115 2116
	$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV):\
	$(perllibdir_SQ)
2117 2118 2119 2120
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
2121
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
2122
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
2123
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
2124
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
2125
    -e $(BROKEN_PATH_FIX) \
2126 2127
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
2128
    -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
2129
    -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
2130 2131 2132
    $@.sh >$@+
endef

2133 2134 2135
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
2136
		echo >&2 "    * new script parameters"; \
2137 2138 2139 2140
		echo "$$FLAGS" >$@; \
            fi


2141
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
2142
	$(QUIET_GEN)$(cmd_munge_script) && \
2143
	chmod +x $@+ && \
2144
	mv $@+ $@
2145

2146
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
2147 2148 2149
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

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

2156
# This makes sure we depend on the NO_PERL setting itself.
2157
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
2158

2159 2160 2161
# Used for substitution in Perl modules. Disabled when using RUNTIME_PREFIX
# since the locale directory is injected.
perl_localedir_SQ = $(localedir_SQ)
2162

2163
ifndef NO_PERL
2164
PERL_HEADER_TEMPLATE = perl/header_templates/fixed_prefix.template.pl
2165
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ):$(perllibdir_SQ)
2166

2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183
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)

2184
$(SCRIPT_PERL_GEN): % : %.perl GIT-PERL-DEFINES GIT-PERL-HEADER GIT-VERSION-FILE
2185
	$(QUIET_GEN)$(RM) $@ $@+ && \
2186 2187
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
2188
	    -e '	r GIT-PERL-HEADER' \
2189
	    -e '	G' \
2190
	    -e '}' \
2191
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
2192
	    $< >$@+ && \
2193
	chmod +x $@+ && \
2194
	mv $@+ $@
2195

2196
PERL_DEFINES := $(subst $(space),:,$(PERL_DEFINES))
2197 2198 2199 2200 2201 2202 2203
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

2204 2205 2206 2207 2208 2209
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' \
2210
	    -e "s=@@INSTLIBDIR@@=$$INSTLIBDIR=g" \
2211 2212 2213
	    -e 's=@@PERLLIBDIR_REL@@=$(perllibdir_relative_SQ)=g' \
	    -e 's=@@GITEXECDIR_REL@@=$(gitexecdir_relative_SQ)=g' \
	    -e 's=@@LOCALEDIR_REL@@=$(localedir_relative_SQ)=g' \
2214 2215
	    $< >$@+ && \
	mv $@+ $@
2216

2217
.PHONY: perllibdir
2218 2219
perllibdir:
	@echo '$(perllibdir_SQ)'
2220 2221 2222 2223 2224

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

2225
git-instaweb: git-instaweb.sh GIT-SCRIPT-DEFINES
2226
	$(QUIET_GEN)$(cmd_munge_script) && \
2227
	chmod +x $@+ && \
2228
	mv $@+ $@
2229
else # NO_PERL
2230
$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh
2231 2232 2233 2234 2235 2236 2237
	$(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
2238

2239 2240 2241
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

2242
ifndef NO_PYTHON
F
Felipe Contreras 已提交
2243 2244
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
2245
	$(QUIET_GEN)$(RM) $@ $@+ && \
2246
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
2247
	    $< >$@+ && \
2248 2249 2250
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
2251
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
2252 2253 2254 2255 2256 2257 2258 2259
	$(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

2260 2261 2262 2263 2264 2265
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+

2266
configure: configure.ac GIT-VERSION-FILE
2267
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
2268

2269
ifdef AUTOCONFIGURED
2270 2271 2272 2273 2274 2275
# 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
2276
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
2277
	if test -f config.status; then \
2278 2279 2280 2281 2282 2283 2284 2285 2286
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

2287 2288 2289 2290 2291 2292
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
2293
XDIFF_OBJS += xdiff/xhistogram.o
2294 2295

VCSSVN_OBJS += vcs-svn/line_buffer.o
2296
VCSSVN_OBJS += vcs-svn/sliding_window.o
2297
VCSSVN_OBJS += vcs-svn/fast_export.o
2298
VCSSVN_OBJS += vcs-svn/svndiff.o
2299 2300
VCSSVN_OBJS += vcs-svn/svndump.o

2301
TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
2302 2303 2304
OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
	$(XDIFF_OBJS) \
	$(VCSSVN_OBJS) \
2305
	$(FUZZ_OBJS) \
2306
	common-main.o \
2307 2308 2309 2310
	git.o
ifndef NO_CURL
	OBJECTS += http.o http-walker.o remote-curl.o
endif
2311

2312
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
2313
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
2314

2315
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2316
$(dep_dirs):
2317
	@mkdir -p $@
2318 2319

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
2320
dep_file = $(dir $@).depend/$(notdir $@).d
2321
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
2322 2323
endif

2324
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2325 2326
dep_dirs =
missing_dep_dirs =
2327 2328 2329 2330 2331 2332 2333
dep_args =
endif

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

2334 2335
.SUFFIXES:

2336
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
2337
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2338
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
2339
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2340

2341
%.s: %.c GIT-CFLAGS FORCE
2342
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2343 2344

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
2345 2346
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
2347 2348 2349
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
2350 2351 2352 2353 2354
endif
else
# Dependencies on header files, for platforms that do not support
# the gcc -MMD option.
#
N
Nguyễn Thái Ngọc Duy 已提交
2355
# Dependencies on automatically generated headers such as command-list.h
2356 2357
# should _not_ be included here, since they are necessary even when
# building an object for the first time.
J
Jonathan Nieder 已提交
2358

2359
$(OBJECTS): $(LIB_H)
2360
endif
2361

2362 2363
exec-cmd.sp exec-cmd.s exec-cmd.o: GIT-PREFIX
exec-cmd.sp exec-cmd.s exec-cmd.o: EXTRA_CPPFLAGS = \
2364
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
2365
	'-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
2366
	'-DBINDIR="$(bindir_relative_SQ)"' \
2367
	'-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"'
2368

2369
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2370
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2371
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2372

2373
config.sp config.s config.o: GIT-PREFIX
2374 2375
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2376

2377
attr.sp attr.s attr.o: GIT-PREFIX
2378 2379
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2380

2381
gettext.sp gettext.s gettext.o: GIT-PREFIX
2382
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
2383
	-DGIT_LOCALE_PATH='"$(localedir_relative_SQ)"'
2384

2385
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SP_EXTRA_FLAGS += \
2386 2387
	-DCURL_DISABLE_TYPECHECK

2388
pack-revindex.sp: SP_EXTRA_FLAGS += -Wno-memcpy-max-count
2389

2390
ifdef NO_EXPAT
2391
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2392 2393
endif

2394
ifdef NO_REGEX
2395 2396
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2397 2398
endif

2399
ifdef USE_NED_ALLOCATOR
2400
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2401
	-DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
2402
compat/nedmalloc/nedmalloc.sp: SP_EXTRA_FLAGS += -Wno-non-pointer-null
2403 2404
endif

2405
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2406
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2407

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

2412
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2413
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2414
		$(CURL_LIBCURL) $(LIBS)
2415
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2416
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2417
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2418

2419 2420 2421 2422
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)

2423 2424 2425 2426 2427 2428
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

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

P
Petr Baudis 已提交
2433
$(LIB_FILE): $(LIB_OBJS)
2434
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2435

2436
$(XDIFF_LIB): $(XDIFF_OBJS)
2437
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2438

J
Jonathan Nieder 已提交
2439
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2440
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2441

2442 2443
export DEFAULT_EDITOR DEFAULT_PAGER

2444 2445
.PHONY: doc man man-perl html info pdf
doc: man-perl
P
Petr Baudis 已提交
2446 2447
	$(MAKE) -C Documentation all

2448
man: man-perl
2449 2450
	$(MAKE) -C Documentation man

2451 2452
man-perl: perl/build/man/man3/Git.3pm

2453 2454 2455
html:
	$(MAKE) -C Documentation html

2456 2457 2458
info:
	$(MAKE) -C Documentation info

2459 2460 2461
pdf:
	$(MAKE) -C Documentation pdf

2462 2463
XGETTEXT_FLAGS = \
	--force-po \
2464
	--add-comments=TRANSLATORS: \
2465 2466
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2467 2468
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2469 2470
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2471
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
2472
	--keyword=__ --keyword=N__ --keyword="__n:1,2"
2473
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2474 2475
LOCALIZED_SH = $(SCRIPT_SH)
LOCALIZED_SH += git-parse-remote.sh
2476
LOCALIZED_SH += git-rebase--preserve-merges.sh
2477
LOCALIZED_SH += git-sh-setup.sh
2478
LOCALIZED_PERL = $(SCRIPT_PERL)
2479 2480 2481 2482 2483 2484

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

2486 2487 2488 2489 2490 2491 2492 2493
## 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.

2494
po/git.pot: $(GENERATED_H) FORCE
2495 2496 2497 2498 2499 2500 2501 2502 2503 2504
	# 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

2505 2506 2507
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2508 2509
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2510 2511 2512

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

E
Elia Pinto 已提交
2515
.PHONY: pot
2516 2517
pot: po/git.pot

2518 2519 2520 2521 2522 2523 2524 2525 2526 2527
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 $@ $<

2528 2529
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))
2530 2531
LIB_CPAN := $(wildcard perl/FromCPAN/*.pm perl/FromCPAN/*/*.pm)
LIB_CPAN_GEN := $(patsubst perl/%.pm,perl/build/lib/%.pm,$(LIB_CPAN))
2532 2533

ifndef NO_PERL
2534
all:: $(LIB_PERL_GEN)
2535
ifndef NO_PERL_CPAN_FALLBACKS
2536
all:: $(LIB_CPAN_GEN)
2537
endif
2538
NO_PERL_CPAN_FALLBACKS_SQ = $(subst ','\'',$(NO_PERL_CPAN_FALLBACKS))
2539 2540
endif

2541
perl/build/lib/%.pm: perl/%.pm
2542
	$(QUIET_GEN)mkdir -p $(dir $@) && \
2543
	sed -e 's|@@LOCALEDIR@@|$(perl_localedir_SQ)|g' \
2544 2545
	    -e 's|@@NO_PERL_CPAN_FALLBACKS@@|$(NO_PERL_CPAN_FALLBACKS_SQ)|g' \
	< $< > $@
2546 2547 2548 2549 2550

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

J
Jeff King 已提交
2551
FIND_SOURCE_FILES = ( \
2552 2553
	git ls-files \
		'*.[hcS]' \
2554
		'*.sh' \
2555
		':!*[tp][0-9][0-9][0-9][0-9]*' \
2556
		':!contrib' \
2557
		2>/dev/null || \
J
Jeff King 已提交
2558 2559
	$(FIND) . \
		\( -name .git -type d -prune \) \
2560
		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
2561
		-o \( -name contrib -type d -prune \) \
2562 2563
		-o \( -name build -type d -prune \) \
		-o \( -name 'trash*' -type d -prune \) \
J
Jeff King 已提交
2564
		-o \( -name '*.[hcS]' -type f -print \) \
2565
		-o \( -name '*.sh' -type f -print \) \
J
Jeff King 已提交
2566
	)
2567

2568 2569
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2570
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2571

2572
tags: FORCE
2573
	$(RM) tags
2574
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2575

K
Kristof Provost 已提交
2576 2577
cscope:
	$(RM) cscope*
2578
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2579

2580
### Detect prefix changes
2581 2582 2583 2584 2585 2586
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 \
2587
		echo >&2 "    * new prefix flags"; \
2588 2589 2590 2591
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2593
GIT-CFLAGS: FORCE
2594 2595
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2596
		echo >&2 "    * new build flags"; \
2597 2598 2599
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2600 2601 2602 2603 2604
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2609 2610 2611
# 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".
2612
GIT-BUILD-OPTIONS: FORCE
2613
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@+
J
Jeff King 已提交
2614
	@echo TEST_SHELL_PATH=\''$(subst ','\'',$(TEST_SHELL_PATH_SQ))'\' >>$@+
2615 2616 2617 2618 2619
	@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)))'\' >>$@+
2620
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2621 2622
	@echo USE_LIBPCRE1=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE1)))'\' >>$@+
	@echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+
2623
	@echo NO_LIBPCRE1_JIT=\''$(subst ','\'',$(subst ','\'',$(NO_LIBPCRE1_JIT)))'\' >>$@+
2624
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
2625
	@echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+
2626 2627
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
2628
	@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
2629
	@echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
2630
	@echo X=\'$(X)\' >>$@+
2631
ifdef TEST_OUTPUT_DIRECTORY
2632
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2633
endif
2634
ifdef GIT_TEST_OPTS
2635
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2636
endif
2637
ifdef GIT_TEST_CMP
2638
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2639 2640
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2641
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2642
endif
2643
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
2644
ifdef GIT_PERF_REPEAT_COUNT
2645
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2646 2647
endif
ifdef GIT_PERF_REPO
2648
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2649 2650
endif
ifdef GIT_PERF_LARGE_REPO
2651
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2652 2653
endif
ifdef GIT_PERF_MAKE_OPTS
2654
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2655
endif
2656 2657 2658
ifdef GIT_PERF_MAKE_COMMAND
	@echo GIT_PERF_MAKE_COMMAND=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_COMMAND)))'\' >>$@+
endif
2659 2660 2661
ifdef GIT_INTEROP_MAKE_OPTS
	@echo GIT_INTEROP_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_INTEROP_MAKE_OPTS)))'\' >>$@+
endif
2662 2663
ifdef GIT_TEST_INDEX_VERSION
	@echo GIT_TEST_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_INDEX_VERSION)))'\' >>$@+
2664
endif
2665
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2666

2667 2668 2669
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2670

2671 2672
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2673
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2674
		echo >&2 "    * new Python interpreter location"; \
2675 2676 2677 2678
		echo "$$VARS" >$@; \
            fi
endif

2679 2680 2681
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2682
all:: $(NO_INSTALL)
2683 2684 2685 2686 2687

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)|' \
2688
	     -e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%,$(@F))|' < $< > $@ && \
2689
	chmod +x $@
2690

2691 2692 2693 2694
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2695
export NO_SVN_TESTS
2696
export TEST_NO_MALLOC_CHECK
2697

2698 2699
### Testing rules

2700
test: all
P
Petr Baudis 已提交
2701 2702
	$(MAKE) -C t/ all

2703 2704 2705 2706 2707
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

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

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

2712
.PRECIOUS: $(TEST_OBJS)
2713

2714 2715
t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))

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

2719
check-sha1:: t/helper/test-tool$X
2720
	t/helper/test-sha1.sh
2721

2722 2723 2724 2725
SP_OBJ = $(patsubst %.o,%.sp,$(C_OBJ))

$(SP_OBJ): %.sp: %.c GIT-CFLAGS FORCE
	$(QUIET_SP)cgcc -no-compile $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) \
2726
		$(SPARSE_FLAGS) $(SP_EXTRA_FLAGS) $<
2727 2728 2729 2730

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

R
Ramsay Jones 已提交
2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741
GEN_HDRS := command-list.h unicode-width.h
EXCEPT_HDRS := $(GEN_HDRS) compat% xdiff%
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)

2742 2743 2744 2745
.PHONY: style
style:
	git clang-format --style file --diff --extensions c,h

N
Nguyễn Thái Ngọc Duy 已提交
2746
check: command-list.h
2747
	@if sparse; \
2748
	then \
2749
		echo >&2 "Use 'make sparse' instead"; \
2750
		$(MAKE) --no-print-directory sparse; \
2751
	else \
2752
		echo >&2 "Did you mean 'make test'?"; \
2753 2754
		exit 1; \
	fi
P
Petr Baudis 已提交
2755

R
René Scharfe 已提交
2756
C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
2757 2758 2759 2760 2761 2762 2763
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 已提交
2764
	@echo '    ' SPATCH $<; \
2765
	ret=0; \
2766
	for f in $(COCCI_SOURCES); do \
2767 2768 2769 2770 2771 2772 2773 2774 2775
		$(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 已提交
2776 2777 2778 2779
	if test -s $@; \
	then \
		echo '    ' SPATCH result: $@; \
	fi
2780
coccicheck: $(addsuffix .patch,$(filter-out %.pending.cocci,$(wildcard contrib/coccinelle/*.cocci)))
R
René Scharfe 已提交
2781

2782 2783 2784 2785
# See contrib/coccinelle/README
coccicheck-pending: $(addsuffix .patch,$(wildcard contrib/coccinelle/*.pending.cocci))

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

P
Petr Baudis 已提交
2787 2788
### Installation rules

2789
ifneq ($(filter /%,$(firstword $(template_dir))),)
2790
template_instdir = $(template_dir)
2791 2792
else
template_instdir = $(prefix)/$(template_dir)
2793 2794 2795
endif
export template_instdir

2796
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2797
gitexec_instdir = $(gitexecdir)
2798 2799
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2800 2801 2802 2803
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2804 2805 2806 2807 2808 2809 2810
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2811 2812
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2813
.PHONY: profile-install profile-fast-install
2814 2815 2816 2817 2818 2819
profile-install: profile
	$(MAKE) install

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

2820
install: all
2821
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2822 2823
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2824
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2825
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2826
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2827
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2828
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2829 2830 2831 2832 2833
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
2834
ifndef NO_PERL
2835 2836 2837
	$(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 已提交
2838
	$(MAKE) -C gitweb install
2839
endif
E
Eygene Ryabinkin 已提交
2840
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2841
	$(MAKE) -C gitk-git install
2842
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2843
endif
2844
ifneq (,$X)
2845
	$(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';)
2846
endif
2847

2848
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2849
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2850
	destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e 's|[^/][^/]*|..|g') && \
2851
	{ test "$$bindir/" = "$$execdir/" || \
2852 2853
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
2854 2855 2856 2857 2858
		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; } \
2859 2860
	  done; \
	} && \
2861 2862
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
2863 2864 2865 2866 2867 2868
		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; } \
2869
	done && \
2870
	for p in $(BUILT_INS); do \
2871
		$(RM) "$$execdir/$$p" && \
2872 2873 2874 2875 2876 2877
		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; } \
2878
	done && \
2879 2880
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2881
		$(RM) "$$execdir/$$p" && \
2882 2883 2884 2885 2886 2887
		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; } \
2888
	done && \
2889
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2890

2891
.PHONY: install-gitweb install-doc install-man install-man-perl install-html install-info install-pdf
E
Elia Pinto 已提交
2892
.PHONY: quick-install-doc quick-install-man quick-install-html
2893 2894 2895
install-gitweb:
	$(MAKE) -C gitweb install

2896
install-doc: install-man-perl
P
Petr Baudis 已提交
2897 2898
	$(MAKE) -C Documentation install

2899
install-man: install-man-perl
2900 2901
	$(MAKE) -C Documentation install-man

2902
install-man-perl: man-perl
2903 2904 2905 2906
	$(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 -)

2907 2908 2909
install-html:
	$(MAKE) -C Documentation install-html

2910 2911 2912
install-info:
	$(MAKE) -C Documentation install-info

2913 2914 2915
install-pdf:
	$(MAKE) -C Documentation install-pdf

2916 2917
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2918

2919 2920 2921
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2922 2923 2924
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2925 2926 2927 2928


### Maintainer's dist rules

2929
GIT_TARNAME = git-$(GIT_VERSION)
2930
dist: git-archive$(X) configure
2931 2932
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2933
	@mkdir -p $(GIT_TARNAME)
2934
	@cp configure $(GIT_TARNAME)
2935
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2936
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2937
	$(TAR) rf $(GIT_TARNAME).tar \
2938
		$(GIT_TARNAME)/configure \
2939
		$(GIT_TARNAME)/version \
2940
		$(GIT_TARNAME)/git-gui/version
2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955
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
2956
	@$(RM) -r $(GIT_TARNAME)
2957
	gzip -f -9 $(GIT_TARNAME).tar
2958

2959 2960 2961 2962
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2963

2964 2965 2966 2967 2968 2969 2970 2971 2972 2973
artifacts-tar:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) \
		GIT-BUILD-OPTIONS $(TEST_PROGRAMS) $(test_bindir_programs) \
		$(NO_INSTALL) $(MOFILES)
	$(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

2974 2975
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
2976
.PHONY: dist-doc distclean
2977
dist-doc:
2978
	$(RM) -r .doc-tmp-dir
2979 2980 2981 2982 2983
	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
	:
2984
	$(RM) -r .doc-tmp-dir
2985
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2986
	$(MAKE) -C Documentation DESTDIR=./ \
2987
		man1dir=../.doc-tmp-dir/man1 \
2988
		man5dir=../.doc-tmp-dir/man5 \
2989
		man7dir=../.doc-tmp-dir/man7 \
2990 2991 2992
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2993
	$(RM) -r .doc-tmp-dir
2994

P
Petr Baudis 已提交
2995
### Cleaning rules
2996

2997 2998
distclean: clean
	$(RM) configure
2999 3000 3001
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
3002

3003 3004 3005 3006
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

3007 3008 3009 3010
cocciclean:
	$(RM) contrib/coccinelle/*.cocci.patch*

clean: profile-clean coverage-clean cocciclean
3011 3012
	$(RM) *.res
	$(RM) $(OBJECTS)
3013
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
3014
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
3015
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
3016
	$(RM) $(FUZZ_PROGRAMS)
3017
	$(RM) -r bin-wrappers $(dep_dirs)
3018
	$(RM) -r po/build/
N
Nguyễn Thái Ngọc Duy 已提交
3019
	$(RM) *.pyc *.pyo */*.pyc */*.pyo command-list.h $(ETAGS_TARGET) tags cscope*
3020 3021 3022
	$(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
3023
	$(MAKE) -C Documentation/ clean
3024
ifndef NO_PERL
3025
	$(MAKE) -C gitweb clean
3026
	$(RM) -r perl/build/
3027
endif
P
Petr Baudis 已提交
3028
	$(MAKE) -C templates/ clean
3029
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
3030
ifndef NO_TCLTK
J
Junio C Hamano 已提交
3031
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
3032 3033
	$(MAKE) -C git-gui clean
endif
3034
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
3035
	$(RM) GIT-USER-AGENT GIT-PREFIX
3036
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PERL-HEADER GIT-PYTHON-VARS
3037

3038
.PHONY: all install profile-clean cocciclean clean strip
3039
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
3040
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
3041

J
Junio C Hamano 已提交
3042 3043
### Check documentation
#
J
Jeff King 已提交
3044 3045 3046 3047
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
3048
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
3049 3050

.PHONY: check-docs
J
Junio C Hamano 已提交
3051
check-docs::
3052
	$(MAKE) -C Documentation lint-docs
J
Jeff King 已提交
3053
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
3054 3055 3056
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
3057
		git-merge-resolve | git-merge-subtree | \
3058
		git-fsck-objects | git-init-db | \
3059
		git-remote-* | git-stage | \
3060
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
3061 3062 3063
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
3064
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
3065
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
3066 3067 3068 3069
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
3070 3071
	done; \
	( \
3072 3073
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
3074
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
3075
		    -e 's/^/listed /' command-list.txt; \
3076 3077
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
3078 3079 3080 3081
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
3082
		case " $(ALL_COMMANDS) " in \
3083 3084 3085 3086
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
3087 3088 3089 3090 3091

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

3093 3094
### Test suite coverage testing
#
3095
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
3096
.PHONY: coverage-untested-functions cover_db cover_db_html
3097
.PHONY: coverage-clean-results
3098 3099

coverage:
3100
	$(MAKE) coverage-test
3101
	$(MAKE) coverage-untested-functions
3102

3103
object_dirs := $(sort $(dir $(OBJECTS)))
3104
coverage-clean-results:
3105 3106 3107
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
3108
	$(RM) -r cover_db/
3109
	$(RM) -r cover_db_html/
3110

3111 3112 3113
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

3114 3115
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
3116
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
3117

3118
coverage-compile:
3119
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
3120 3121

coverage-test: coverage-clean-results coverage-compile
3122
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
3123
		DEFAULT_TEST_TARGET=test -j1 test
3124

3125 3126 3127 3128 3129
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

3130
coverage-report:
3131
	$(QUIET_GCOV)for dir in $(object_dirs); do \
3132
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
3133
	done
3134 3135

coverage-untested-functions: coverage-report
3136 3137
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
3138
		> coverage-untested-functions
3139 3140 3141

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
3142 3143 3144

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

3146 3147 3148 3149 3150 3151 3152 3153 3154 3155

### 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++ \
3156
#      CFLAGS="-fsanitize-coverage=trace-pc-guard -fsanitize=address" \
3157 3158 3159
#      LIB_FUZZING_ENGINE=/usr/lib/llvm-4.0/lib/libFuzzer.a \
#      fuzz-all
#
3160 3161
FUZZ_CXXFLAGS ?= $(CFLAGS)

3162 3163 3164
.PHONY: fuzz-all

$(FUZZ_PROGRAMS): all
3165
	$(QUIET_LINK)$(CXX) $(FUZZ_CXXFLAGS) $(LIB_OBJS) $(BUILTIN_OBJS) \
3166 3167 3168
		$(XDIFF_OBJS) $(EXTLIBS) git.o $@.o $(LIB_FUZZING_ENGINE) -o $@

fuzz-all: $(FUZZ_PROGRAMS)