Makefile 94.3 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
# 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).
192
#
193
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
194
#
J
Joachim Schmitz 已提交
195 196
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
J
Justin Lebar 已提交
197
# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t.
J
Joachim Schmitz 已提交
198 199 200
#
# Define NO_UINTMAX_T if you don't have uintmax_t.
#
201 202 203
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
204 205 206 207
# 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.
#
208 209
# Define NO_MMAP if you want to avoid mmap.
#
210 211 212
# Define MMAP_PREVENTS_DELETE if a file that is currently mmapped cannot be
# deleted or cannot be replaced using rename().
#
213 214
# Define NO_POLL_H if you don't have poll.h.
#
215 216 217
# 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().
218
# This also implies NO_POLL_H and NO_SYS_POLL_H.
219
#
220 221 222
# 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.
223
#
J
Junio C Hamano 已提交
224 225
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
226
# Define NO_PREAD if you have a problem with pread() system call (e.g.
227
# cygwin1.dll before v1.5.22).
228
#
229 230 231 232 233
# 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
#
234 235 236
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
237 238 239
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
# the executable mode bit, but doesn't really do so.
#
240 241 242 243
# 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).
#
244 245
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
#
246 247
# Define NO_UNIX_SOCKETS if your system does not offer unix sockets.
#
248 249 250
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
251 252
# Define NO_ICONV if your libc does not properly support iconv.
#
253 254 255
# Define OLD_ICONV if your library has an old iconv(), where the second
# (input buffer pointer) parameter is declared with type (const char **).
#
256 257
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
#
258 259 260
# 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.
261
#
J
Junio C Hamano 已提交
262 263 264
# 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)
#
265
# Define USE_NSEC below if you want git to care about sub-second file mtimes
266 267 268 269 270
# 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.
271
#
272 273 274
# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
# "st_ctim"
#
275 276 277
# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
# available.  This automatically turns USE_NSEC off.
#
278
# Define USE_STDEV below if you want git to care about the underlying device
279
# change being considered an inode change from the update-index perspective.
280
#
281 282 283
# 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.
#
284 285 286
# 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 已提交
287 288
# Define ASCIIDOC_ROFF if your DocBook XSL does not escape raw roff directives
# (versions 1.68.1 through v1.72).
289
#
T
Thomas Rast 已提交
290 291 292 293
# 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.
#
294 295 296 297 298 299
# 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.
#
300 301
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
302 303
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
304 305 306 307 308 309
# 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.
#
310 311 312
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
# but /usr/bin/python2.7 on some platforms).
#
313 314
# Define NO_PYTHON if you do not want Python scripts or libraries at all.
#
E
Eygene Ryabinkin 已提交
315 316
# Define NO_TCLTK if you do not want Tcl/Tk GUI.
#
317 318 319
# 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.
#
320 321 322 323 324
# 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.
325 326 327
# 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).
#
328 329 330 331
# 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 已提交
332 333 334
# Define HAVE_ISO_QSORT_S if your platform provides a qsort_s() that's
# compatible with the one described in C11 Annex K.
#
335 336 337
# 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.
338
#
339 340
# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
# when hardlinking a file to another name and unlinking the original file right
341
# away (some NTFS drivers seem to zero the contents in that scenario).
342
#
343 344 345 346 347 348 349
# 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.
#
350 351
# 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.
352
#
J
Junio C Hamano 已提交
353 354 355
# 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.
#
356 357
# Define USE_NED_ALLOCATOR if you want to replace the platforms default
# memory allocators with the nedmalloc allocator written by Niall Douglas.
358
#
359 360 361 362 363
# 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.
#
364 365
# Define NO_REGEX if your C library lacks regex support with REG_STARTEND
# feature.
366
#
J
Jeff King 已提交
367 368 369
# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
# user.
#
370 371
# Define JSMIN to point to JavaScript minifier that functions as
# a filter to have gitweb.js minified.
J
Junio C Hamano 已提交
372
#
373 374 375
# Define CSSMIN to point to a CSS minifier in order to generate a minified
# version of gitweb.css
#
376 377 378 379
# 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.
#
380 381 382 383 384 385 386
# 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'
387
#
388 389 390 391 392 393
# 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.
#
394
# Define NATIVE_CRLF if your platform uses CRLF for line endings.
395
#
J
Jeff King 已提交
396 397
# Define GIT_USER_AGENT if you want to change how git identifies itself during
# network interactions.  The default is "git/$(GIT_VERSION)".
398
#
399 400 401
# 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.
402
#
403
# Define GIT_TEST_INDEX_VERSION to 2, 3 or 4 to run the test suite
404 405
# with a different indexfile format version.  If it isn't set the index
# file format used is index-v[23].
406
#
407 408
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
409
#
410
# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
411
#
412 413 414 415
# 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.
416
#
417 418 419 420 421 422 423 424
# 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 已提交
425
#
426
# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
427 428
#
# Define HAVE_GETDELIM if your system has the getdelim() function.
429 430 431 432 433 434 435 436
#
# 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".
437
#
J
Jeff King 已提交
438 439 440
# 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).
441
#
442 443
# When cross-compiling, define HOST_CPU as the canonical name of the CPU on
# which the built Git will run (for instance "x86_64").
444 445 446 447 448 449 450
#
# 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.
451 452 453 454 455 456 457 458 459 460 461 462
#
# 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.
463 464 465 466
#
# 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).
467
#
468 469 470
# 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)
471 472 473 474 475 476 477 478 479 480
#
# 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.
481 482 483 484 485 486
#
#    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.
487 488 489 490 491
#
#    pedantic:
#
#        Enable -pedantic compilation. This also disables
#        USE_PARENS_AROUND_GETTEXT_N to produce only relevant warnings.
492

493
GIT-VERSION-FILE: FORCE
494
	@$(SHELL_PATH) ./GIT-VERSION-GEN
495
-include GIT-VERSION-FILE
496

J
Junio C Hamano 已提交
497
# CFLAGS and LDFLAGS are for the users to override from the command line.
498

499
CFLAGS = -g -O2 -Wall
J
Junio C Hamano 已提交
500
LDFLAGS =
501
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
502
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
503
STRIP ?= strip
504

505 506 507
# Create as necessary, replace existing, make ranlib unneeded.
ARFLAGS = rcs

508 509 510
# Among the variables below, these:
#   gitexecdir
#   template_dir
511
#   sysconfdir
512 513
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
514
# runtime figures out where they are based on the path to the executable.
515 516 517 518 519
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
520 521
#   localedir
#   perllibdir
522 523
# This can help installing the suite in a relocatable way.

524
prefix = $(HOME)
525
bindir = $(prefix)/bin
526 527
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
528
gitexecdir = libexec/git-core
529
mergetoolsdir = $(gitexecdir)/mergetools
530
sharedir = $(prefix)/share
531
gitwebdir = $(sharedir)/gitweb
532
perllibdir = $(sharedir)/perl5
533
localedir = $(sharedir)/locale
534
template_dir = share/git-core/templates
535
htmldir = $(prefix)/share/doc/git-doc
536
ETC_GITCONFIG = $(sysconfdir)/gitconfig
537
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
538
lib = lib
539
# DESTDIR =
540
pathsep = :
541

542
bindir_relative = $(patsubst $(prefix)/%,%,$(bindir))
543 544
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
545
gitexecdir_relative = $(patsubst $(prefix)/%,%,$(gitexecdir))
546
localedir_relative = $(patsubst $(prefix)/%,%,$(localedir))
547
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))
548
perllibdir_relative = $(patsubst $(prefix)/%,%,$(perllibdir))
549

550
export prefix bindir sharedir sysconfdir gitwebdir perllibdir localedir
551

552
CC = cc
553
AR = ar
554
RM = rm -f
555
DIFF = diff
556
TAR = tar
557
FIND = find
558
INSTALL = install
559
TCL_PATH = tclsh
560
TCLTK_PATH = wish
561
XGETTEXT = xgettext
562
MSGFMT = msgfmt
563
CURL_CONFIG = curl-config
564
PTHREAD_LIBS = -lpthread
565
PTHREAD_CFLAGS =
566
GCOV = gcov
R
René Scharfe 已提交
567
SPATCH = spatch
568

569 570
export TCL_PATH TCLTK_PATH

571
SPARSE_FLAGS =
572
SPATCH_FLAGS = --all-includes --patch .
573

P
Petr Baudis 已提交
574 575 576 577


### --- END CONFIGURATION SECTION ---

578
# Those must not be GNU-specific; they are shared with perl/ which may
P
Petr Baudis 已提交
579 580
# be built by a different compiler. (Note that this is an artifact now
# but it still might be nice to keep that distinction.)
581
BASIC_CFLAGS = -I.
P
Petr Baudis 已提交
582
BASIC_LDFLAGS =
583

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

J
Jonathan Nieder 已提交
605 606 607 608 609 610
# 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

611
SCRIPT_SH += git-bisect.sh
612
SCRIPT_SH += git-difftool--helper.sh
613 614 615 616 617 618
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
619
SCRIPT_SH += git-legacy-rebase.sh
620
SCRIPT_SH += git-remote-testgit.sh
621 622 623 624 625
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

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

635 636 637 638 639 640 641
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
642

P
Pete Wyckoff 已提交
643
SCRIPT_PYTHON += git-p4.py
644

645
NO_INSTALL += git-remote-testgit
646

647 648 649 650 651
# 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))

652 653 654 655
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))

656 657 658 659 660 661 662 663 664
# 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
665
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
666
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
667
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
668
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
669
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
670
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
671 672 673 674 675 676 677 678 679

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

680 681 682
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
683
	  git-instaweb
684

685 686
ETAGS_TARGET = TAGS

687
FUZZ_OBJS += fuzz-pack-headers.o
688
FUZZ_OBJS += fuzz-pack-idx.o
689 690 691 692 693 694

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

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

695 696
# Empty...
EXTRA_PROGRAMS =
697

698 699
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
700

701
PROGRAM_OBJS += credential-store.o
702
PROGRAM_OBJS += daemon.o
703
PROGRAM_OBJS += fast-import.o
704
PROGRAM_OBJS += http-backend.o
705
PROGRAM_OBJS += imap-send.o
706
PROGRAM_OBJS += sh-i18n--envsubst.o
707
PROGRAM_OBJS += shell.o
708
PROGRAM_OBJS += remote-testsvn.o
709

710 711 712
# Binary suffix, set to .exe for Windows builds
X =

713
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
714

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

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

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

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

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

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

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

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

BINDIR_PROGRAMS_NO_X += git-cvsserver

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

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

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

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

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

823 824 825 826 827
LIB_H = $(shell $(FIND) . \
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
	-name '*.h' -print)
828

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

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

1138
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
1139
EXTLIBS =
1140

J
Jeff King 已提交
1141 1142
GIT_USER_AGENT = git/$(GIT_VERSION)

1143 1144 1145 1146
ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/sha1.h)
DC_SHA1_SUBMODULE = auto
endif

1147
include config.mak.uname
1148
-include config.mak.autogen
1149
-include config.mak
1150

1151
ifdef DEVELOPER
1152
include config.mak.dev
1153 1154
endif

1155 1156 1157 1158
comma := ,
empty :=
space := $(empty) $(empty)

1159
ifdef SANITIZE
1160
SANITIZERS := $(foreach flag,$(subst $(comma),$(space),$(SANITIZE)),$(flag))
1161
BASIC_CFLAGS += -fsanitize=$(SANITIZE) -fno-sanitize-recover=$(SANITIZE)
1162
BASIC_CFLAGS += -fno-omit-frame-pointer
1163
ifneq ($(filter undefined,$(SANITIZERS)),)
1164 1165
BASIC_CFLAGS += -DNO_UNALIGNED_LOADS
endif
1166 1167 1168
ifneq ($(filter leak,$(SANITIZERS)),)
BASIC_CFLAGS += -DSUPPRESS_ANNOTATED_LEAKS
endif
1169 1170
endif

1171 1172 1173 1174 1175 1176 1177 1178
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

1179
ifndef COMPUTE_HEADER_DEPENDENCIES
1180 1181 1182 1183
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
1184
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
1185 1186
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
1187
	echo $$?)
1188
ifeq ($(dep_check),0)
1189 1190 1191
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1192
endif
1193 1194
endif

1195
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1196
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1197 1198 1199 1200 1201
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1202 1203
endif

1204
ifdef SANE_TOOL_PATH
1205 1206
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1207 1208
PATH := $(SANE_TOOL_PATH):${PATH}
else
1209
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1210 1211
endif

1212 1213 1214 1215 1216 1217
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 已提交
1218 1219 1220 1221
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1222 1223 1224 1225
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1226 1227 1228 1229 1230 1231 1232 1233
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

1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
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
1247
	ifndef NO_APPLE_COMMON_CRYPTO
1248
		NO_OPENSSL = YesPlease
1249 1250 1251
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1252
	NO_REGEX = YesPlease
1253
	PTHREAD_LIBS =
1254 1255
endif

1256 1257 1258 1259 1260 1261 1262 1263
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
1264 1265
endif

1266 1267 1268 1269 1270
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

1271
USE_LIBPCRE2 ?= $(USE_LIBPCRE)
1272

1273 1274 1275
ifneq (,$(USE_LIBPCRE2))
	ifdef USE_LIBPCRE1
$(error Only set USE_LIBPCRE2 (or its alias USE_LIBPCRE) or USE_LIBPCRE1, not both!)
M
Michał Kiedrowicz 已提交
1276
	endif
1277

1278 1279 1280 1281 1282
	BASIC_CFLAGS += -DUSE_LIBPCRE2
	EXTLIBS += -lpcre2-8
endif

ifdef USE_LIBPCRE1
1283
	BASIC_CFLAGS += -DUSE_LIBPCRE1
M
Michał Kiedrowicz 已提交
1284
	EXTLIBS += -lpcre
1285 1286 1287 1288

ifdef NO_LIBPCRE1_JIT
	BASIC_CFLAGS += -DNO_LIBPCRE1_JIT
endif
M
Michał Kiedrowicz 已提交
1289 1290
endif

1291 1292 1293
ifdef LIBPCREDIR
	BASIC_CFLAGS += -I$(LIBPCREDIR)/include
	EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
M
Michał Kiedrowicz 已提交
1294 1295
endif

K
Kirill Smelkov 已提交
1296 1297 1298 1299
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1300
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1301
IMAP_SEND_LDFLAGS =
1302

D
Daniel Barkalow 已提交
1303 1304
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1305 1306 1307
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1308
else
1309
	ifdef CURLDIR
1310 1311
		# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
		BASIC_CFLAGS += -I$(CURLDIR)/include
1312
		CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib)
1313
	else
1314
		CURL_LIBCURL =
1315
	endif
1316

1317 1318 1319 1320 1321 1322
ifdef CURL_LDFLAGS
	CURL_LIBCURL += $(CURL_LDFLAGS)
else
	CURL_LIBCURL += $(shell $(CURL_CONFIG) --libs)
endif

1323 1324 1325
	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)
1326 1327
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1328
	curl_check := $(shell (echo 070908; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1329 1330
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1331
			PROGRAM_OBJS += http-push.o
1332
		endif
1333
	endif
1334
	curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1335 1336 1337 1338 1339 1340 1341 1342
	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
1343
	ifndef NO_EXPAT
1344 1345 1346 1347 1348 1349
		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 已提交
1350 1351 1352
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1353
	endif
1354
endif
R
Remi Pommarel 已提交
1355
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
1356

1357 1358
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1359
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1360 1361 1362
endif
EXTLIBS += -lz

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

1581
ifdef NO_ICONV
1582
	BASIC_CFLAGS += -DNO_ICONV
1583 1584
endif

1585 1586 1587 1588
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1589 1590 1591 1592
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1593 1594 1595 1596
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1597 1598 1599 1600 1601
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

1602 1603 1604
ifdef OPENSSL_SHA1
	EXTLIBS += $(LIB_4_CRYPTO)
	BASIC_CFLAGS += -DSHA1_OPENSSL
J
Jeff King 已提交
1605
else
1606 1607
ifdef BLK_SHA1
	LIB_OBJS += block-sha1/sha1.o
1608
	BASIC_CFLAGS += -DSHA1_BLK
1609
else
1610 1611
ifdef PPC_SHA1
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1612
	BASIC_CFLAGS += -DSHA1_PPC
1613 1614 1615
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
1616
	BASIC_CFLAGS += -DSHA1_APPLE
1617
else
1618
	DC_SHA1 := YesPlease
1619 1620
	BASIC_CFLAGS += -DSHA1_DC
	LIB_OBJS += sha1dc_git.o
1621 1622
ifdef DC_SHA1_EXTERNAL
	ifdef DC_SHA1_SUBMODULE
1623
		ifneq ($(DC_SHA1_SUBMODULE),auto)
1624
$(error Only set DC_SHA1_EXTERNAL or DC_SHA1_SUBMODULE, not both)
1625
		endif
1626 1627 1628 1629
	endif
	BASIC_CFLAGS += -DDC_SHA1_EXTERNAL
	EXTLIBS += -lsha1detectcoll
else
1630 1631 1632 1633 1634
ifdef DC_SHA1_SUBMODULE
	LIB_OBJS += sha1collisiondetection/lib/sha1.o
	LIB_OBJS += sha1collisiondetection/lib/ubc_check.o
	BASIC_CFLAGS += -DDC_SHA1_SUBMODULE
else
1635 1636
	LIB_OBJS += sha1dc/sha1.o
	LIB_OBJS += sha1dc/ubc_check.o
1637
endif
1638 1639 1640 1641 1642
	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\""
1643 1644 1645
endif
endif
endif
1646
endif
1647
endif
1648

1649 1650 1651 1652
ifdef SHA1_MAX_BLOCK_SIZE
	LIB_OBJS += compat/sha1-chunked.o
	BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
1653 1654 1655 1656
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1657 1658 1659 1660
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1661 1662 1663
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1664 1665 1666 1667
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
R
René Scharfe 已提交
1668 1669 1670 1671 1672
ifdef HAVE_ISO_QSORT_S
	COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S
else
	COMPAT_OBJS += compat/qsort_s.o
endif
1673 1674 1675
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1676

J
Junio C Hamano 已提交
1677 1678 1679
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1680
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1681
	EXTLIBS += $(PTHREAD_LIBS)
N
Nicolas Pitre 已提交
1682
endif
1683

1684 1685 1686 1687
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1688 1689
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1690
	EXTLIBS += $(CHARSET_LIB)
1691 1692
endif

1693 1694 1695 1696
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1697 1698 1699 1700
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1701 1702 1703
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1704 1705 1706
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1707 1708 1709 1710
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1711 1712 1713
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1714

1715
ifdef USE_NED_ALLOCATOR
1716 1717 1718 1719 1720 1721 1722 1723
	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
1724 1725
endif

1726 1727 1728 1729
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1730 1731 1732 1733
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1734 1735 1736 1737 1738
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1739 1740 1741 1742
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1743 1744 1745 1746
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1747 1748 1749 1750
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1751 1752 1753 1754
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1755 1756 1757 1758
ifdef HAVE_BSD_KERN_PROC_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_KERN_PROC_SYSCTL
endif

1759 1760 1761 1762
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1763 1764 1765 1766 1767 1768 1769 1770 1771
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

1772 1773 1774 1775
ifdef HAVE_WPGMPTR
	BASIC_CFLAGS += -DHAVE_WPGMPTR
endif

1776
ifeq ($(TCLTK_PATH),)
1777
NO_TCLTK = NoThanks
1778 1779
endif

1780
ifeq ($(PERL_PATH),)
1781
NO_PERL = NoThanks
1782 1783
endif

1784
ifeq ($(PYTHON_PATH),)
1785
NO_PYTHON = NoThanks
1786 1787
endif

1788 1789 1790 1791
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1792
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1793 1794
QUIET_SUBDIR1  =

1795
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1796 1797 1798 1799 1800
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1801
ifneq ($(findstring s,$(MAKEFLAGS)),s)
S
Shawn O. Pearce 已提交
1802
ifndef V
A
Alex Riesen 已提交
1803
	QUIET_CC       = @echo '   ' CC $@;
1804 1805 1806 1807
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1808
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1809
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1810
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1811
	QUIET_GCOV     = @echo '   ' GCOV $@;
1812
	QUIET_SP       = @echo '   ' SP $<;
R
Ramsay Jones 已提交
1813
	QUIET_HDR      = @echo '   ' HDR $<;
1814
	QUIET_RC       = @echo '   ' RC $@;
1815
	QUIET_SUBDIR0  = +@subdir=
1816 1817
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1818
	export V
A
Alex Riesen 已提交
1819
	export QUIET_GEN
1820 1821
	export QUIET_BUILT_IN
endif
1822
endif
1823

J
Junio C Hamano 已提交
1824 1825 1826 1827
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1828 1829 1830 1831 1832 1833 1834
### profile feedback build
#

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

1835
ifeq ("$(PROFILE)","GEN")
1836
	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
1837
	EXTLIBS += -lgcov
1838 1839
	export CCACHE_DISABLE = t
	V = 1
1840 1841
else
ifneq ("$(PROFILE)","")
1842
	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1843 1844
	export CCACHE_DISABLE = t
	V = 1
1845
endif
1846
endif
1847

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

1850
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1851
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1852 1853 1854

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1855
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1856
mandir_SQ = $(subst ','\'',$(mandir))
1857 1858
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1859
perllibdir_SQ = $(subst ','\'',$(perllibdir))
1860
localedir_SQ = $(subst ','\'',$(localedir))
1861
localedir_relative_SQ = $(subst ','\'',$(localedir_relative))
1862
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
1863
gitexecdir_relative_SQ = $(subst ','\'',$(gitexecdir_relative))
1864
template_dir_SQ = $(subst ','\'',$(template_dir))
1865
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1866
prefix_SQ = $(subst ','\'',$(prefix))
1867
perllibdir_relative_SQ = $(subst ','\'',$(perllibdir_relative))
1868
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1869 1870

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
J
Jeff King 已提交
1871
TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
1872
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1873
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1874
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1875
DIFF_SQ = $(subst ','\'',$(DIFF))
1876
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1877

1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902
# 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

1903 1904 1905 1906 1907 1908 1909 1910 1911
# 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)
1912

1913
BASIC_CFLAGS += $(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1914
LIB_OBJS += $(COMPAT_OBJS)
1915

1916 1917 1918 1919 1920 1921 1922 1923 1924
# 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

1925 1926 1927 1928 1929 1930 1931
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

1932 1933 1934 1935 1936 1937 1938
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 已提交
1939 1940 1941
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))
1942 1943 1944 1945
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 已提交
1946

1947 1948 1949 1950
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1951 1952 1953 1954 1955
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)'

1956 1957 1958
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1959
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1960 1961


P
Petr Baudis 已提交
1962 1963
### Build rules

1964 1965
SHELL = $(SHELL_PATH)

1966 1967 1968
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
1969 1970 1971 1972
all:: profile
endif

profile:: profile-clean
1973 1974
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
1975 1976 1977 1978 1979
	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
		$(MAKE) PROFILE=GEN -j1 perf; \
	else \
		echo "Skipping profile of perf tests..."; \
	fi
1980 1981 1982 1983 1984 1985 1986
	$(MAKE) PROFILE=USE all

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

1987 1988

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
1989
ifneq (,$X)
1990
	$(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';)
1991
endif
1992

1993
all::
E
Eygene Ryabinkin 已提交
1994
ifndef NO_TCLTK
1995
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1996
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
1997
endif
1998
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1999

2000 2001 2002 2003 2004
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 已提交
2005
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
2006
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
2007

2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040
### 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.

2041
git.sp git.s git.o: GIT-PREFIX
2042
git.sp git.s git.o: EXTRA_CPPFLAGS = \
2043 2044 2045
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
2046

2047
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
2048 2049
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
		$(filter %.o,$^) $(LIBS)
2050

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

N
Nguyễn Thái Ngọc Duy 已提交
2053
builtin/help.sp builtin/help.s builtin/help.o: command-list.h GIT-PREFIX
2054
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
2055 2056 2057
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
2058

2059
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
2060
version.sp version.s version.o: EXTRA_CPPFLAGS = \
2061
	'-DGIT_VERSION="$(GIT_VERSION)"' \
2062
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)' \
2063 2064 2065
	'-DGIT_BUILT_FROM_COMMIT="$(shell \
		GIT_CEILING_DIRECTORIES="$(CURDIR)/.." \
		git rev-parse -q --verify HEAD 2>/dev/null)"'
2066

J
Junio C Hamano 已提交
2067
$(BUILT_INS): git$X
2068
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
2069 2070 2071
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
2072

2073
command-list.h: generate-cmdlist.sh command-list.txt
2074

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

2078
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
2079
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
2080 2081
	$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV):\
	$(perllibdir_SQ)
2082 2083 2084 2085
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
2086
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
2087
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
2088
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
2089
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
2090
    -e $(BROKEN_PATH_FIX) \
2091 2092
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
2093
    -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
2094
    -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
2095 2096 2097
    $@.sh >$@+
endef

2098 2099 2100
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
2101
		echo >&2 "    * new script parameters"; \
2102 2103 2104 2105
		echo "$$FLAGS" >$@; \
            fi


2106
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
2107
	$(QUIET_GEN)$(cmd_munge_script) && \
2108
	chmod +x $@+ && \
2109
	mv $@+ $@
2110

2111
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
2112 2113 2114
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

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

2121
# This makes sure we depend on the NO_PERL setting itself.
2122
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
2123

2124 2125 2126
# Used for substitution in Perl modules. Disabled when using RUNTIME_PREFIX
# since the locale directory is injected.
perl_localedir_SQ = $(localedir_SQ)
2127

2128
ifndef NO_PERL
2129
PERL_HEADER_TEMPLATE = perl/header_templates/fixed_prefix.template.pl
2130
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ):$(perllibdir_SQ)
2131

2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148
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)

2149
$(SCRIPT_PERL_GEN): % : %.perl GIT-PERL-DEFINES GIT-PERL-HEADER GIT-VERSION-FILE
2150
	$(QUIET_GEN)$(RM) $@ $@+ && \
2151 2152
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
2153
	    -e '	r GIT-PERL-HEADER' \
2154
	    -e '	G' \
2155
	    -e '}' \
2156
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
2157
	    $< >$@+ && \
2158
	chmod +x $@+ && \
2159
	mv $@+ $@
2160

2161
PERL_DEFINES := $(subst $(space),:,$(PERL_DEFINES))
2162 2163 2164 2165 2166 2167 2168
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

2169 2170 2171 2172 2173 2174
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' \
2175
	    -e "s=@@INSTLIBDIR@@=$$INSTLIBDIR=g" \
2176 2177 2178
	    -e 's=@@PERLLIBDIR_REL@@=$(perllibdir_relative_SQ)=g' \
	    -e 's=@@GITEXECDIR_REL@@=$(gitexecdir_relative_SQ)=g' \
	    -e 's=@@LOCALEDIR_REL@@=$(localedir_relative_SQ)=g' \
2179 2180
	    $< >$@+ && \
	mv $@+ $@
2181

2182
.PHONY: perllibdir
2183 2184
perllibdir:
	@echo '$(perllibdir_SQ)'
2185 2186 2187 2188 2189

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

2190
git-instaweb: git-instaweb.sh GIT-SCRIPT-DEFINES
2191
	$(QUIET_GEN)$(cmd_munge_script) && \
2192
	chmod +x $@+ && \
2193
	mv $@+ $@
2194
else # NO_PERL
2195
$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh
2196 2197 2198 2199 2200 2201 2202
	$(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
2203

2204 2205 2206
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

2207
ifndef NO_PYTHON
F
Felipe Contreras 已提交
2208 2209
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
2210
	$(QUIET_GEN)$(RM) $@ $@+ && \
2211
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
2212
	    $< >$@+ && \
2213 2214 2215
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
2216
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
2217 2218 2219 2220 2221 2222 2223 2224
	$(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

2225 2226 2227 2228 2229 2230
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+

2231
configure: configure.ac GIT-VERSION-FILE
2232
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
2233

2234
ifdef AUTOCONFIGURED
2235 2236 2237 2238 2239 2240
# 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
2241
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
2242
	if test -f config.status; then \
2243 2244 2245 2246 2247 2248 2249 2250 2251
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

2252 2253 2254 2255 2256 2257
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
2258
XDIFF_OBJS += xdiff/xhistogram.o
2259 2260

VCSSVN_OBJS += vcs-svn/line_buffer.o
2261
VCSSVN_OBJS += vcs-svn/sliding_window.o
2262
VCSSVN_OBJS += vcs-svn/fast_export.o
2263
VCSSVN_OBJS += vcs-svn/svndiff.o
2264 2265
VCSSVN_OBJS += vcs-svn/svndump.o

2266
TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
2267 2268 2269
OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
	$(XDIFF_OBJS) \
	$(VCSSVN_OBJS) \
2270
	$(FUZZ_OBJS) \
2271
	common-main.o \
2272 2273 2274 2275
	git.o
ifndef NO_CURL
	OBJECTS += http.o http-walker.o remote-curl.o
endif
2276

2277
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
2278
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
2279

2280
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2281
$(dep_dirs):
2282
	@mkdir -p $@
2283 2284

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
2285
dep_file = $(dir $@).depend/$(notdir $@).d
2286
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
2287 2288
endif

2289
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2290 2291
dep_dirs =
missing_dep_dirs =
2292 2293 2294 2295 2296 2297 2298
dep_args =
endif

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

2299 2300
.SUFFIXES:

2301
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
2302
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2303
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
2304
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2305

2306
%.s: %.c GIT-CFLAGS FORCE
2307
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2308 2309

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
2310 2311
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
2312 2313 2314
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
2315 2316 2317 2318 2319
endif
else
# Dependencies on header files, for platforms that do not support
# the gcc -MMD option.
#
N
Nguyễn Thái Ngọc Duy 已提交
2320
# Dependencies on automatically generated headers such as command-list.h
2321 2322
# should _not_ be included here, since they are necessary even when
# building an object for the first time.
J
Jonathan Nieder 已提交
2323

2324
$(OBJECTS): $(LIB_H)
2325
endif
2326

2327 2328
exec-cmd.sp exec-cmd.s exec-cmd.o: GIT-PREFIX
exec-cmd.sp exec-cmd.s exec-cmd.o: EXTRA_CPPFLAGS = \
2329
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
2330
	'-DGIT_LOCALE_PATH="$(localedir_relative_SQ)"' \
2331
	'-DBINDIR="$(bindir_relative_SQ)"' \
2332
	'-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"'
2333

2334
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2335
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2336
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2337

2338
config.sp config.s config.o: GIT-PREFIX
2339 2340
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2341

2342
attr.sp attr.s attr.o: GIT-PREFIX
2343 2344
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2345

2346
gettext.sp gettext.s gettext.o: GIT-PREFIX
2347
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
2348
	-DGIT_LOCALE_PATH='"$(localedir_relative_SQ)"'
2349

2350
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SPARSE_FLAGS += \
2351 2352
	-DCURL_DISABLE_TYPECHECK

2353 2354
pack-revindex.sp: SPARSE_FLAGS += -Wno-memcpy-max-count

2355
ifdef NO_EXPAT
2356
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2357 2358
endif

2359
ifdef NO_REGEX
2360 2361
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2362 2363
endif

2364
ifdef USE_NED_ALLOCATOR
2365
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2366
	-DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
2367
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2368 2369
endif

2370
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2371
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2372

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

2377
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2378
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2379
		$(CURL_LIBCURL) $(LIBS)
2380
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2381
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2382
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2383

2384 2385 2386 2387
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)

2388 2389 2390 2391 2392 2393
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

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

P
Petr Baudis 已提交
2398
$(LIB_FILE): $(LIB_OBJS)
2399
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2400

2401
$(XDIFF_LIB): $(XDIFF_OBJS)
2402
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2403

J
Jonathan Nieder 已提交
2404
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2405
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2406

2407 2408
export DEFAULT_EDITOR DEFAULT_PAGER

2409 2410
.PHONY: doc man man-perl html info pdf
doc: man-perl
P
Petr Baudis 已提交
2411 2412
	$(MAKE) -C Documentation all

2413
man: man-perl
2414 2415
	$(MAKE) -C Documentation man

2416 2417
man-perl: perl/build/man/man3/Git.3pm

2418 2419 2420
html:
	$(MAKE) -C Documentation html

2421 2422 2423
info:
	$(MAKE) -C Documentation info

2424 2425 2426
pdf:
	$(MAKE) -C Documentation pdf

2427 2428
XGETTEXT_FLAGS = \
	--force-po \
2429
	--add-comments=TRANSLATORS: \
2430 2431
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2432 2433
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2434 2435
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2436
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
2437
	--keyword=__ --keyword=N__ --keyword="__n:1,2"
2438
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2439 2440
LOCALIZED_SH = $(SCRIPT_SH)
LOCALIZED_SH += git-parse-remote.sh
2441
LOCALIZED_SH += git-rebase--preserve-merges.sh
2442
LOCALIZED_SH += git-sh-setup.sh
2443
LOCALIZED_PERL = $(SCRIPT_PERL)
2444 2445 2446 2447 2448 2449

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

2451 2452 2453 2454 2455 2456 2457 2458
## 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.

2459
po/git.pot: $(GENERATED_H) FORCE
2460 2461 2462 2463 2464 2465 2466 2467 2468 2469
	# 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

2470 2471 2472
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2473 2474
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2475 2476 2477

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

E
Elia Pinto 已提交
2480
.PHONY: pot
2481 2482
pot: po/git.pot

2483 2484 2485 2486 2487 2488 2489 2490 2491 2492
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 $@ $<

2493 2494
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))
2495 2496
LIB_CPAN := $(wildcard perl/FromCPAN/*.pm perl/FromCPAN/*/*.pm)
LIB_CPAN_GEN := $(patsubst perl/%.pm,perl/build/lib/%.pm,$(LIB_CPAN))
2497 2498

ifndef NO_PERL
2499
all:: $(LIB_PERL_GEN)
2500
ifndef NO_PERL_CPAN_FALLBACKS
2501
all:: $(LIB_CPAN_GEN)
2502
endif
2503
NO_PERL_CPAN_FALLBACKS_SQ = $(subst ','\'',$(NO_PERL_CPAN_FALLBACKS))
2504 2505
endif

2506
perl/build/lib/%.pm: perl/%.pm
2507
	$(QUIET_GEN)mkdir -p $(dir $@) && \
2508
	sed -e 's|@@LOCALEDIR@@|$(perl_localedir_SQ)|g' \
2509 2510
	    -e 's|@@NO_PERL_CPAN_FALLBACKS@@|$(NO_PERL_CPAN_FALLBACKS_SQ)|g' \
	< $< > $@
2511 2512 2513 2514 2515

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

J
Jeff King 已提交
2516
FIND_SOURCE_FILES = ( \
2517 2518
	git ls-files \
		'*.[hcS]' \
2519
		'*.sh' \
2520
		':!*[tp][0-9][0-9][0-9][0-9]*' \
2521
		':!contrib' \
2522
		2>/dev/null || \
J
Jeff King 已提交
2523 2524
	$(FIND) . \
		\( -name .git -type d -prune \) \
2525
		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
2526
		-o \( -name contrib -type d -prune \) \
2527 2528
		-o \( -name build -type d -prune \) \
		-o \( -name 'trash*' -type d -prune \) \
J
Jeff King 已提交
2529
		-o \( -name '*.[hcS]' -type f -print \) \
2530
		-o \( -name '*.sh' -type f -print \) \
J
Jeff King 已提交
2531
	)
2532

2533 2534
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2535
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2536

2537
tags: FORCE
2538
	$(RM) tags
2539
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2540

K
Kristof Provost 已提交
2541 2542
cscope:
	$(RM) cscope*
2543
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2544

2545
### Detect prefix changes
2546 2547 2548 2549 2550 2551
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 \
2552
		echo >&2 "    * new prefix flags"; \
2553 2554 2555 2556
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2558
GIT-CFLAGS: FORCE
2559 2560
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2561
		echo >&2 "    * new build flags"; \
2562 2563 2564
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2565 2566 2567 2568 2569
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2574 2575 2576
# 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".
2577
GIT-BUILD-OPTIONS: FORCE
2578
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@+
J
Jeff King 已提交
2579
	@echo TEST_SHELL_PATH=\''$(subst ','\'',$(TEST_SHELL_PATH_SQ))'\' >>$@+
2580 2581 2582 2583 2584
	@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)))'\' >>$@+
2585
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2586 2587
	@echo USE_LIBPCRE1=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE1)))'\' >>$@+
	@echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+
2588
	@echo NO_LIBPCRE1_JIT=\''$(subst ','\'',$(subst ','\'',$(NO_LIBPCRE1_JIT)))'\' >>$@+
2589
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
2590
	@echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+
2591 2592
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
2593
	@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
2594
	@echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
2595
	@echo X=\'$(X)\' >>$@+
2596
ifdef TEST_OUTPUT_DIRECTORY
2597
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2598
endif
2599
ifdef GIT_TEST_OPTS
2600
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2601
endif
2602
ifdef GIT_TEST_CMP
2603
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2604 2605
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2606
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2607
endif
2608
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
2609
ifdef GIT_PERF_REPEAT_COUNT
2610
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2611 2612
endif
ifdef GIT_PERF_REPO
2613
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2614 2615
endif
ifdef GIT_PERF_LARGE_REPO
2616
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2617 2618
endif
ifdef GIT_PERF_MAKE_OPTS
2619
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2620
endif
2621 2622 2623
ifdef GIT_PERF_MAKE_COMMAND
	@echo GIT_PERF_MAKE_COMMAND=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_COMMAND)))'\' >>$@+
endif
2624 2625 2626
ifdef GIT_INTEROP_MAKE_OPTS
	@echo GIT_INTEROP_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_INTEROP_MAKE_OPTS)))'\' >>$@+
endif
2627 2628
ifdef GIT_TEST_INDEX_VERSION
	@echo GIT_TEST_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_INDEX_VERSION)))'\' >>$@+
2629
endif
2630
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2631

2632 2633 2634
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2635

2636 2637
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2638
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2639
		echo >&2 "    * new Python interpreter location"; \
2640 2641 2642 2643
		echo "$$VARS" >$@; \
            fi
endif

2644 2645 2646
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2647
all:: $(NO_INSTALL)
2648 2649 2650 2651 2652

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

2656 2657 2658 2659
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2660
export NO_SVN_TESTS
2661
export TEST_NO_MALLOC_CHECK
2662

2663 2664
### Testing rules

2665
test: all
P
Petr Baudis 已提交
2666 2667
	$(MAKE) -C t/ all

2668 2669 2670 2671 2672
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

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

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

2677
.PRECIOUS: $(TEST_OBJS)
2678

2679 2680
t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))

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

2684
check-sha1:: t/helper/test-tool$X
2685
	t/helper/test-sha1.sh
2686

2687 2688 2689 2690 2691 2692 2693 2694 2695
SP_OBJ = $(patsubst %.o,%.sp,$(C_OBJ))

$(SP_OBJ): %.sp: %.c GIT-CFLAGS FORCE
	$(QUIET_SP)cgcc -no-compile $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) \
		$(SPARSE_FLAGS) $<

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

R
Ramsay Jones 已提交
2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706
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)

2707 2708 2709 2710
.PHONY: style
style:
	git clang-format --style file --diff --extensions c,h

N
Nguyễn Thái Ngọc Duy 已提交
2711
check: command-list.h
2712
	@if sparse; \
2713
	then \
2714
		echo >&2 "Use 'make sparse' instead"; \
2715
		$(MAKE) --no-print-directory sparse; \
2716
	else \
2717
		echo >&2 "Did you mean 'make test'?"; \
2718 2719
		exit 1; \
	fi
P
Petr Baudis 已提交
2720

R
René Scharfe 已提交
2721
C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
2722 2723 2724 2725 2726 2727 2728
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 已提交
2729
	@echo '    ' SPATCH $<; \
2730
	ret=0; \
2731
	for f in $(COCCI_SOURCES); do \
2732 2733 2734 2735 2736 2737 2738 2739 2740
		$(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 已提交
2741 2742 2743 2744
	if test -s $@; \
	then \
		echo '    ' SPATCH result: $@; \
	fi
2745
coccicheck: $(addsuffix .patch,$(filter-out %.pending.cocci,$(wildcard contrib/coccinelle/*.cocci)))
R
René Scharfe 已提交
2746

2747 2748 2749 2750
# See contrib/coccinelle/README
coccicheck-pending: $(addsuffix .patch,$(wildcard contrib/coccinelle/*.pending.cocci))

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

P
Petr Baudis 已提交
2752 2753
### Installation rules

2754
ifneq ($(filter /%,$(firstword $(template_dir))),)
2755
template_instdir = $(template_dir)
2756 2757
else
template_instdir = $(prefix)/$(template_dir)
2758 2759 2760
endif
export template_instdir

2761
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2762
gitexec_instdir = $(gitexecdir)
2763 2764
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2765 2766 2767 2768
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2769 2770 2771 2772 2773 2774 2775
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2776 2777
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2778
.PHONY: profile-install profile-fast-install
2779 2780 2781 2782 2783 2784
profile-install: profile
	$(MAKE) install

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

2785
install: all
2786
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2787 2788
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2789
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2790
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2791
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2792
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2793
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2794 2795 2796 2797 2798
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
2799
ifndef NO_PERL
2800 2801 2802
	$(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 已提交
2803
	$(MAKE) -C gitweb install
2804
endif
E
Eygene Ryabinkin 已提交
2805
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2806
	$(MAKE) -C gitk-git install
2807
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2808
endif
2809
ifneq (,$X)
2810
	$(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';)
2811
endif
2812

2813
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2814
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2815
	destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e 's|[^/][^/]*|..|g') && \
2816
	{ test "$$bindir/" = "$$execdir/" || \
2817 2818
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
2819 2820 2821 2822 2823
		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; } \
2824 2825
	  done; \
	} && \
2826 2827
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
2828 2829 2830 2831 2832 2833
		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; } \
2834
	done && \
2835
	for p in $(BUILT_INS); do \
2836
		$(RM) "$$execdir/$$p" && \
2837 2838 2839 2840 2841 2842
		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; } \
2843
	done && \
2844 2845
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2846
		$(RM) "$$execdir/$$p" && \
2847 2848 2849 2850 2851 2852
		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; } \
2853
	done && \
2854
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2855

2856
.PHONY: install-gitweb install-doc install-man install-man-perl install-html install-info install-pdf
E
Elia Pinto 已提交
2857
.PHONY: quick-install-doc quick-install-man quick-install-html
2858 2859 2860
install-gitweb:
	$(MAKE) -C gitweb install

2861
install-doc: install-man-perl
P
Petr Baudis 已提交
2862 2863
	$(MAKE) -C Documentation install

2864
install-man: install-man-perl
2865 2866
	$(MAKE) -C Documentation install-man

2867
install-man-perl: man-perl
2868 2869 2870 2871
	$(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 -)

2872 2873 2874
install-html:
	$(MAKE) -C Documentation install-html

2875 2876 2877
install-info:
	$(MAKE) -C Documentation install-info

2878 2879 2880
install-pdf:
	$(MAKE) -C Documentation install-pdf

2881 2882
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2883

2884 2885 2886
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2887 2888 2889
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2890 2891 2892 2893


### Maintainer's dist rules

2894
GIT_TARNAME = git-$(GIT_VERSION)
2895
dist: git-archive$(X) configure
2896 2897
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2898
	@mkdir -p $(GIT_TARNAME)
2899
	@cp configure $(GIT_TARNAME)
2900
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2901
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2902
	$(TAR) rf $(GIT_TARNAME).tar \
2903
		$(GIT_TARNAME)/configure \
2904
		$(GIT_TARNAME)/version \
2905
		$(GIT_TARNAME)/git-gui/version
2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920
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
2921
	@$(RM) -r $(GIT_TARNAME)
2922
	gzip -f -9 $(GIT_TARNAME).tar
2923

2924 2925 2926 2927
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2928

2929 2930
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
2931
.PHONY: dist-doc distclean
2932
dist-doc:
2933
	$(RM) -r .doc-tmp-dir
2934 2935 2936 2937 2938
	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
	:
2939
	$(RM) -r .doc-tmp-dir
2940
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2941
	$(MAKE) -C Documentation DESTDIR=./ \
2942
		man1dir=../.doc-tmp-dir/man1 \
2943
		man5dir=../.doc-tmp-dir/man5 \
2944
		man7dir=../.doc-tmp-dir/man7 \
2945 2946 2947
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2948
	$(RM) -r .doc-tmp-dir
2949

P
Petr Baudis 已提交
2950
### Cleaning rules
2951

2952 2953
distclean: clean
	$(RM) configure
2954 2955 2956
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2957

2958 2959 2960 2961
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

2962 2963 2964 2965
cocciclean:
	$(RM) contrib/coccinelle/*.cocci.patch*

clean: profile-clean coverage-clean cocciclean
2966 2967
	$(RM) *.res
	$(RM) $(OBJECTS)
2968
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2969
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2970
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
2971
	$(RM) $(FUZZ_PROGRAMS)
2972
	$(RM) -r bin-wrappers $(dep_dirs)
2973
	$(RM) -r po/build/
N
Nguyễn Thái Ngọc Duy 已提交
2974
	$(RM) *.pyc *.pyo */*.pyc */*.pyo command-list.h $(ETAGS_TARGET) tags cscope*
2975 2976 2977
	$(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
2978
	$(MAKE) -C Documentation/ clean
2979
ifndef NO_PERL
2980
	$(MAKE) -C gitweb clean
2981
	$(RM) -r perl/build/
2982
endif
P
Petr Baudis 已提交
2983
	$(MAKE) -C templates/ clean
2984
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2985
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2986
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2987 2988
	$(MAKE) -C git-gui clean
endif
2989
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2990
	$(RM) GIT-USER-AGENT GIT-PREFIX
2991
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PERL-HEADER GIT-PYTHON-VARS
2992

2993
.PHONY: all install profile-clean cocciclean clean strip
2994
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2995
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2996

J
Junio C Hamano 已提交
2997 2998
### Check documentation
#
J
Jeff King 已提交
2999 3000 3001 3002
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
3003
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
3004 3005

.PHONY: check-docs
J
Junio C Hamano 已提交
3006
check-docs::
3007
	$(MAKE) -C Documentation lint-docs
J
Jeff King 已提交
3008
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
3009 3010 3011
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
3012
		git-merge-resolve | git-merge-subtree | \
3013
		git-fsck-objects | git-init-db | \
3014
		git-remote-* | git-stage | \
3015
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
3016 3017 3018
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
3019
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
3020
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
3021 3022 3023 3024
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
3025 3026
	done; \
	( \
3027 3028
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
3029
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
3030
		    -e 's/^/listed /' command-list.txt; \
3031 3032
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
3033 3034 3035 3036
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
3037
		case " $(ALL_COMMANDS) " in \
3038 3039 3040 3041
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
3042 3043 3044 3045 3046

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

3048 3049
### Test suite coverage testing
#
3050
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
3051
.PHONY: coverage-untested-functions cover_db cover_db_html
3052
.PHONY: coverage-clean-results
3053 3054

coverage:
3055
	$(MAKE) coverage-test
3056
	$(MAKE) coverage-untested-functions
3057

3058
object_dirs := $(sort $(dir $(OBJECTS)))
3059
coverage-clean-results:
3060 3061 3062
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
3063
	$(RM) -r cover_db/
3064
	$(RM) -r cover_db_html/
3065

3066 3067 3068
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

3069 3070
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
3071
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
3072

3073
coverage-compile:
3074
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
3075 3076

coverage-test: coverage-clean-results coverage-compile
3077
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
3078
		DEFAULT_TEST_TARGET=test -j1 test
3079 3080

coverage-report:
3081
	$(QUIET_GCOV)for dir in $(object_dirs); do \
3082
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
3083
	done
3084 3085

coverage-untested-functions: coverage-report
3086 3087
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
3088
		> coverage-untested-functions
3089 3090 3091

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
3092 3093 3094

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

3096 3097 3098 3099 3100 3101 3102 3103 3104 3105

### 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++ \
3106
#      FUZZ_CXXFLAGS="-fsanitize-coverage=trace-pc-guard -fsanitize=address" \
3107 3108 3109
#      LIB_FUZZING_ENGINE=/usr/lib/llvm-4.0/lib/libFuzzer.a \
#      fuzz-all
#
3110 3111
FUZZ_CXXFLAGS ?= $(CFLAGS)

3112 3113 3114
.PHONY: fuzz-all

$(FUZZ_PROGRAMS): all
3115
	$(QUIET_LINK)$(CXX) $(FUZZ_CXXFLAGS) $(LIB_OBJS) $(BUILTIN_OBJS) \
3116 3117 3118
		$(XDIFF_OBJS) $(EXTLIBS) git.o $@.o $(LIB_FUZZING_ENGINE) -o $@

fuzz-all: $(FUZZ_PROGRAMS)