Makefile 94.4 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
BUILTIN_OBJS += builtin/show-ref.o
J
Joel Teichroeb 已提交
1120
BUILTIN_OBJS += builtin/stash--helper.o
1121
BUILTIN_OBJS += builtin/stripspace.o
1122
BUILTIN_OBJS += builtin/submodule--helper.o
1123 1124 1125 1126 1127 1128 1129 1130
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
1131
BUILTIN_OBJS += builtin/upload-pack.o
1132
BUILTIN_OBJS += builtin/var.o
1133
BUILTIN_OBJS += builtin/verify-commit.o
1134 1135
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
1136
BUILTIN_OBJS += builtin/worktree.o
1137
BUILTIN_OBJS += builtin/write-tree.o
1138

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

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

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

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

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

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

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

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

1180
ifndef COMPUTE_HEADER_DEPENDENCIES
1181 1182 1183 1184
COMPUTE_HEADER_DEPENDENCIES = auto
endif

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

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

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

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

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

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

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

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

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

1272
USE_LIBPCRE2 ?= $(USE_LIBPCRE)
1273

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1727 1728 1729 1730
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
J
Jeff King 已提交
1872
TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
1873
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1874
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1875
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1876
DIFF_SQ = $(subst ','\'',$(DIFF))
1877
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
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 1903
# 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

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

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

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

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

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

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

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

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

1960
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1961 1962


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

1965 1966
SHELL = $(SHELL_PATH)

1967 1968 1969
all:: shell_compatibility_test

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

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

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

1988 1989

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2300 2301
.SUFFIXES:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2408 2409
export DEFAULT_EDITOR DEFAULT_PAGER

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2661
export NO_SVN_TESTS
2662
export TEST_NO_MALLOC_CHECK
2663

2664 2665
### Testing rules

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

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

.PHONY: test perf

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

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

2678
.PRECIOUS: $(TEST_OBJS)
2679

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

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

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

2688 2689 2690 2691 2692 2693 2694 2695 2696
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 已提交
2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707
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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

P
Petr Baudis 已提交
2891 2892 2893 2894


### Maintainer's dist rules

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3097 3098 3099 3100 3101 3102 3103 3104 3105 3106

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

3113 3114 3115
.PHONY: fuzz-all

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

fuzz-all: $(FUZZ_PROGRAMS)