Makefile 82.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
# This also implies BLK_SHA1.
27
#
28 29 30 31
# 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 已提交
32
#
33 34 35 36 37
# Currently USE_LIBPCRE is a synonym for USE_LIBPCRE1, define
# USE_LIBPCRE2 instead if you'd like to use version 2 of the PCRE
# library. The USE_LIBPCRE flag will likely be changed to mean v2 by
# default in future releases.
#
38 39 40 41 42 43 44 45
# 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.
#
46 47 48 49
# 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 已提交
50
#
K
Kirill Smelkov 已提交
51 52
# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
#
53
# Define NO_CURL if you do not have libcurl installed.  git-http-fetch and
54
# git-http-push are not built, and you cannot use http:// and https://
55
# transports (neither smart nor dumb).
56
#
P
Patrick Mauritz 已提交
57
# Define CURLDIR=/foo/bar if your curl header and library files are in
58
# /foo/bar/include and /foo/bar/lib directories.
P
Patrick Mauritz 已提交
59
#
60 61 62
# Define CURL_CONFIG to curl's configuration program that prints information
# about the library (e.g., its version number).  The default is 'curl-config'.
#
63
# Define NO_EXPAT if you do not have expat installed.  git-http-push is
64
# not built, and you cannot push using http:// and https:// transports (dumb).
65
#
66 67 68
# Define EXPATDIR=/foo/bar if your expat header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
M
Matt Kraai 已提交
69 70 71
# 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.
#
72 73 74 75
# 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.
#
76 77 78
# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust
# the installed gettext translation of the shell scripts output.
#
79 80 81 82 83 84
# 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.
#
85
# Define CHARSET_LIB to the library you need to link with in order to
86
# use locale_charset() function.  On some platforms this needs to set to
87
# -lcharset, on others to -liconv .
88
#
89 90 91 92 93 94
# 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
#
95 96 97
# Define HAVE_PATHS_H if you have paths.h and want to use the default PATH
# it specifies.
#
98
# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
99
# d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
100
#
101 102
# Define HAVE_STRINGS_H if you have strings.h and need it for strcasecmp.
#
103 104
# Define NO_STRCASESTR if you don't have strcasestr.
#
R
René Scharfe 已提交
105 106
# Define NO_MEMMEM if you don't have memmem.
#
M
Matt Kraai 已提交
107 108
# Define NO_GETPAGESIZE if you don't have getpagesize.
#
109 110
# Define NO_STRLCPY if you don't have strlcpy.
#
111 112
# 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
113 114
# strtoull, define NO_STRTOULL.
#
J
Jason Riedy 已提交
115 116
# Define NO_SETENV if you don't have setenv in the C library.
#
117 118
# Define NO_UNSETENV if you don't have unsetenv in the C library.
#
119 120
# Define NO_MKDTEMP if you don't have mkdtemp in the C library.
#
121 122
# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
#
123 124 125
# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
# in the C library.
#
126 127
# Define NO_LIBGEN_H if you don't have libgen.h.
#
128 129
# Define NEEDS_LIBGEN if your libgen needs -lgen when linking
#
130 131
# Define NO_SYS_SELECT_H if you don't have sys/select.h.
#
132 133
# 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.
134
#
P
Pavel Roskin 已提交
135
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
E
Eric Wong 已提交
136 137 138
# 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.
#
139 140 141 142 143 144 145 146 147 148 149 150
# 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.
#
151 152 153 154
# 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.
#
155 156
# Define BLK_SHA1 environment variable to make use of the bundled
# optimized C SHA1 routine.
157
#
158 159
# Define PPC_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for PowerPC.
160
#
J
Jeff King 已提交
161 162 163 164
# 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.
#
165 166 167 168 169 170
# 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.
#
171 172 173
# Define OPENSSL_SHA1 environment variable when running make to link
# with the SHA1 routine from openssl library.
#
174 175 176 177
# 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.
#
178 179 180
# 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).
181
#
182
# Define NEEDS_SSL_WITH_CURL if you need -lssl with -lcurl (Minix).
183
#
184
# Define NEEDS_IDN_WITH_CURL if you need -lidn when using -lcurl (Minix).
185
#
186
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
187
#
J
Joachim Schmitz 已提交
188 189
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
J
Justin Lebar 已提交
190
# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t.
J
Joachim Schmitz 已提交
191 192 193
#
# Define NO_UINTMAX_T if you don't have uintmax_t.
#
194 195 196
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
197 198 199 200
# 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.
#
201 202
# Define NO_MMAP if you want to avoid mmap.
#
203 204 205 206 207
# 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().
# This also implies NO_SYS_POLL_H.
#
208 209 210
# 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.
211
#
J
Junio C Hamano 已提交
212 213
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
214
# Define NO_PREAD if you have a problem with pread() system call (e.g.
215
# cygwin1.dll before v1.5.22).
216
#
217 218 219 220 221
# 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
#
222 223 224
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
225 226 227
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
# the executable mode bit, but doesn't really do so.
#
228 229 230 231
# 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).
#
232 233
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
#
234 235
# Define NO_UNIX_SOCKETS if your system does not offer unix sockets.
#
236 237 238
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
239 240
# Define NO_ICONV if your libc does not properly support iconv.
#
241 242 243
# Define OLD_ICONV if your library has an old iconv(), where the second
# (input buffer pointer) parameter is declared with type (const char **).
#
244 245
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
#
246 247 248
# 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.
249
#
J
Junio C Hamano 已提交
250 251 252
# 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)
#
253
# Define USE_NSEC below if you want git to care about sub-second file mtimes
254 255 256 257 258
# 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.
259
#
260 261 262
# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
# "st_ctim"
#
263 264 265
# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
# available.  This automatically turns USE_NSEC off.
#
266
# Define USE_STDEV below if you want git to care about the underlying device
267
# change being considered an inode change from the update-index perspective.
268
#
269 270 271
# 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.
#
272 273 274
# 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 已提交
275 276
# Define ASCIIDOC_ROFF if your DocBook XSL does not escape raw roff directives
# (versions 1.68.1 through v1.72).
277
#
T
Thomas Rast 已提交
278 279 280 281
# 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.
#
282 283 284 285 286 287
# 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.
#
288 289
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
290 291 292
# Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
# MakeMaker (e.g. using ActiveState under Cygwin).
#
293 294
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
295 296 297
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
# but /usr/bin/python2.7 on some platforms).
#
298 299
# Define NO_PYTHON if you do not want Python scripts or libraries at all.
#
E
Eygene Ryabinkin 已提交
300 301
# Define NO_TCLTK if you do not want Tcl/Tk GUI.
#
302 303 304
# 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.
#
305 306 307 308 309
# 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.
310 311 312
# 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).
#
313 314 315 316
# 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 已提交
317 318 319
# Define HAVE_ISO_QSORT_S if your platform provides a qsort_s() that's
# compatible with the one described in C11 Annex K.
#
320 321 322
# 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.
323
#
324 325
# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
# when hardlinking a file to another name and unlinking the original file right
326
# away (some NTFS drivers seem to zero the contents in that scenario).
327
#
328 329
# 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.
330
#
J
Junio C Hamano 已提交
331 332 333
# 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.
#
334 335
# Define USE_NED_ALLOCATOR if you want to replace the platforms default
# memory allocators with the nedmalloc allocator written by Niall Douglas.
336
#
337 338 339 340 341
# 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.
#
342 343
# Define NO_REGEX if your C library lacks regex support with REG_STARTEND
# feature.
344
#
J
Jeff King 已提交
345 346 347
# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
# user.
#
348
# Define GETTEXT_POISON if you are debugging the choice of strings marked
349 350 351
# for translation.  In a GETTEXT_POISON build, you can turn all strings marked
# for translation into gibberish by setting the GIT_GETTEXT_POISON variable
# (to any value) in your environment.
352
#
353 354
# Define JSMIN to point to JavaScript minifier that functions as
# a filter to have gitweb.js minified.
J
Junio C Hamano 已提交
355
#
356 357 358
# Define CSSMIN to point to a CSS minifier in order to generate a minified
# version of gitweb.css
#
359 360 361 362
# 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.
#
363 364 365 366 367 368 369
# 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'
370
#
371 372 373 374 375 376
# 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.
#
377
# Define NATIVE_CRLF if your platform uses CRLF for line endings.
378
#
J
Jeff King 已提交
379 380
# Define GIT_USER_AGENT if you want to change how git identifies itself during
# network interactions.  The default is "git/$(GIT_VERSION)".
381
#
382 383 384
# 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.
385 386 387 388
#
# Define TEST_GIT_INDEX_VERSION to 2, 3 or 4 to run the test suite
# with a different indexfile format version.  If it isn't set the index
# file format used is index-v[23].
389
#
390 391
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
392
#
393
# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
394
#
395 396 397 398
# 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.
399
#
400 401 402 403 404 405 406 407
# 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 已提交
408
#
409
# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
410 411
#
# Define HAVE_GETDELIM if your system has the getdelim() function.
412 413 414 415 416 417 418 419
#
# 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".
420

421
GIT-VERSION-FILE: FORCE
422
	@$(SHELL_PATH) ./GIT-VERSION-GEN
423
-include GIT-VERSION-FILE
424

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

427
CFLAGS = -g -O2 -Wall
428
DEVELOPER_CFLAGS = -Werror \
429 430 431 432 433 434 435 436
	-Wdeclaration-after-statement \
	-Wno-format-zero-length \
	-Wold-style-definition \
	-Woverflow \
	-Wpointer-arith \
	-Wstrict-prototypes \
	-Wunused \
	-Wvla
J
Junio C Hamano 已提交
437
LDFLAGS =
438
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
439
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
440
STRIP ?= strip
441

442 443 444
# Create as necessary, replace existing, make ranlib unneeded.
ARFLAGS = rcs

445 446 447
# Among the variables below, these:
#   gitexecdir
#   template_dir
448
#   sysconfdir
449 450
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
451
# runtime figures out where they are based on the path to the executable.
452 453 454 455 456
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
457 458
# This can help installing the suite in a relocatable way.

459
prefix = $(HOME)
460 461
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
462 463
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
464
gitexecdir = libexec/git-core
465
mergetoolsdir = $(gitexecdir)/mergetools
466
sharedir = $(prefix)/share
467
gitwebdir = $(sharedir)/gitweb
468
localedir = $(sharedir)/locale
469
template_dir = share/git-core/templates
470
htmldir = $(prefix)/share/doc/git-doc
471
ETC_GITCONFIG = $(sysconfdir)/gitconfig
472
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
473
lib = lib
474
# DESTDIR =
475
pathsep = :
476

477 478 479 480
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

481
export prefix bindir sharedir sysconfdir gitwebdir localedir
482

483
CC = cc
484
AR = ar
485
RM = rm -f
486
DIFF = diff
487
TAR = tar
488
FIND = find
489
INSTALL = install
490
TCL_PATH = tclsh
491
TCLTK_PATH = wish
492
XGETTEXT = xgettext
493
MSGFMT = msgfmt
494
CURL_CONFIG = curl-config
495
PTHREAD_LIBS = -lpthread
496
PTHREAD_CFLAGS =
497
GCOV = gcov
R
René Scharfe 已提交
498
SPATCH = spatch
499

500 501
export TCL_PATH TCLTK_PATH

502
SPARSE_FLAGS =
503
SPATCH_FLAGS = --all-includes
504

P
Petr Baudis 已提交
505 506 507 508


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

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

515 516 517 518 519
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
520 521
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
522
GENERATED_H =
523
EXTRA_CPPFLAGS =
524
LIB_OBJS =
525
PROGRAM_OBJS =
526 527
PROGRAMS =
SCRIPT_PERL =
528
SCRIPT_PYTHON =
529
SCRIPT_SH =
530
SCRIPT_LIB =
531
TEST_PROGRAMS_NEED_X =
532

J
Jonathan Nieder 已提交
533 534 535 536 537 538
# 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

539
SCRIPT_SH += git-bisect.sh
540
SCRIPT_SH += git-difftool--helper.sh
541 542 543 544 545 546 547
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
SCRIPT_SH += git-rebase.sh
548
SCRIPT_SH += git-remote-testgit.sh
549 550 551 552 553
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

554 555
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
556 557 558
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
559
SCRIPT_LIB += git-sh-setup
560
SCRIPT_LIB += git-sh-i18n
561

562 563 564 565 566 567 568
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
569

P
Pete Wyckoff 已提交
570
SCRIPT_PYTHON += git-p4.py
571

572
NO_INSTALL += git-remote-testgit
573

574 575 576 577 578
# 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))

579 580 581 582
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))

583 584 585 586 587 588 589 590 591
# 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
592
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
593
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
594
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
595
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
596
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
597
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
598 599 600 601 602 603 604 605 606

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

607 608 609
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
610
	  git-instaweb
611

612 613
ETAGS_TARGET = TAGS

614 615
# Empty...
EXTRA_PROGRAMS =
616

617 618
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
619

620
PROGRAM_OBJS += credential-store.o
621
PROGRAM_OBJS += daemon.o
622
PROGRAM_OBJS += fast-import.o
623
PROGRAM_OBJS += http-backend.o
624
PROGRAM_OBJS += imap-send.o
625
PROGRAM_OBJS += sh-i18n--envsubst.o
626 627 628
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
629
PROGRAM_OBJS += remote-testsvn.o
630

631 632 633
# Binary suffix, set to .exe for Windows builds
X =

634
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
635

636 637
TEST_PROGRAMS_NEED_X += test-chmtime
TEST_PROGRAMS_NEED_X += test-ctype
638
TEST_PROGRAMS_NEED_X += test-config
639 640 641
TEST_PROGRAMS_NEED_X += test-date
TEST_PROGRAMS_NEED_X += test-delta
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
642
TEST_PROGRAMS_NEED_X += test-dump-split-index
643
TEST_PROGRAMS_NEED_X += test-dump-untracked-cache
J
Johannes Schindelin 已提交
644
TEST_PROGRAMS_NEED_X += test-fake-ssh
645
TEST_PROGRAMS_NEED_X += test-genrandom
646
TEST_PROGRAMS_NEED_X += test-hashmap
J
Jeff King 已提交
647
TEST_PROGRAMS_NEED_X += test-index-version
648
TEST_PROGRAMS_NEED_X += test-lazy-init-name-hash
D
David Barr 已提交
649
TEST_PROGRAMS_NEED_X += test-line-buffer
650
TEST_PROGRAMS_NEED_X += test-match-trees
R
René Scharfe 已提交
651
TEST_PROGRAMS_NEED_X += test-mergesort
J
Jeff King 已提交
652
TEST_PROGRAMS_NEED_X += test-mktemp
653
TEST_PROGRAMS_NEED_X += test-online-cpus
654 655
TEST_PROGRAMS_NEED_X += test-parse-options
TEST_PROGRAMS_NEED_X += test-path-utils
656
TEST_PROGRAMS_NEED_X += test-prio-queue
657
TEST_PROGRAMS_NEED_X += test-read-cache
658
TEST_PROGRAMS_NEED_X += test-ref-store
659
TEST_PROGRAMS_NEED_X += test-regex
660
TEST_PROGRAMS_NEED_X += test-revision-walking
661
TEST_PROGRAMS_NEED_X += test-run-command
662
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
663
TEST_PROGRAMS_NEED_X += test-sha1
664
TEST_PROGRAMS_NEED_X += test-sha1-array
665
TEST_PROGRAMS_NEED_X += test-sigchain
666
TEST_PROGRAMS_NEED_X += test-strcmp-offset
667
TEST_PROGRAMS_NEED_X += test-string-list
668
TEST_PROGRAMS_NEED_X += test-submodule-config
669
TEST_PROGRAMS_NEED_X += test-subprocess
D
David Barr 已提交
670
TEST_PROGRAMS_NEED_X += test-svn-fe
671
TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
672
TEST_PROGRAMS_NEED_X += test-wildmatch
673

674
TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
675

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

BUILT_INS += git-cherry$X
681
BUILT_INS += git-cherry-pick$X
682 683 684 685 686
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 已提交
687
BUILT_INS += git-stage$X
688 689
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
690

691 692
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
693
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
694

E
Eygene Ryabinkin 已提交
695
# what 'all' will build but not install in gitexecdir
696
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
697

698 699 700 701 702 703 704 705 706
# 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

707 708 709 710 711 712 713
# 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
714 715 716
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
717

L
Luben Tuikov 已提交
718
export PERL_PATH
719
export PYTHON_PATH
L
Luben Tuikov 已提交
720

721 722 723
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
724

J
Jeff King 已提交
725
GENERATED_H += common-cmds.h
726

727 728 729 730 731
LIB_H = $(shell $(FIND) . \
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
	-name '*.h' -print)
732

733
LIB_OBJS += abspath.o
734
LIB_OBJS += advice.o
735 736
LIB_OBJS += alias.o
LIB_OBJS += alloc.o
737
LIB_OBJS += apply.o
738 739 740
LIB_OBJS += archive.o
LIB_OBJS += archive-tar.o
LIB_OBJS += archive-zip.o
741
LIB_OBJS += argv-array.o
742 743
LIB_OBJS += attr.o
LIB_OBJS += base85.o
744
LIB_OBJS += bisect.o
745
LIB_OBJS += blame.o
746 747
LIB_OBJS += blob.o
LIB_OBJS += branch.o
748
LIB_OBJS += bulk-checkin.o
749 750 751
LIB_OBJS += bundle.o
LIB_OBJS += cache-tree.o
LIB_OBJS += color.o
752
LIB_OBJS += column.o
753 754
LIB_OBJS += combine-diff.o
LIB_OBJS += commit.o
755
LIB_OBJS += compat/obstack.o
J
Jeff King 已提交
756
LIB_OBJS += compat/terminal.o
757 758
LIB_OBJS += config.o
LIB_OBJS += connect.o
759
LIB_OBJS += connected.o
760 761
LIB_OBJS += convert.o
LIB_OBJS += copy.o
J
Jeff King 已提交
762
LIB_OBJS += credential.o
763 764 765 766 767 768 769 770 771 772 773
LIB_OBJS += csum-file.o
LIB_OBJS += ctype.o
LIB_OBJS += date.o
LIB_OBJS += decorate.o
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
774
LIB_OBJS += diff-no-index.o
775 776
LIB_OBJS += diff.o
LIB_OBJS += dir.o
777
LIB_OBJS += dir-iterator.o
778
LIB_OBJS += editor.o
779 780
LIB_OBJS += entry.o
LIB_OBJS += environment.o
781 782 783 784
LIB_OBJS += ewah/bitmap.o
LIB_OBJS += ewah/ewah_bitmap.o
LIB_OBJS += ewah/ewah_io.o
LIB_OBJS += ewah/ewah_rlw.o
785
LIB_OBJS += exec_cmd.o
786
LIB_OBJS += fetch-pack.o
787
LIB_OBJS += fsck.o
788
LIB_OBJS += gettext.o
789
LIB_OBJS += gpg-interface.o
A
Adam Simpkins 已提交
790
LIB_OBJS += graph.o
791
LIB_OBJS += grep.o
792
LIB_OBJS += hashmap.o
793
LIB_OBJS += help.o
L
Linus Torvalds 已提交
794
LIB_OBJS += hex.o
795
LIB_OBJS += ident.o
F
Fredrik Kuivinen 已提交
796
LIB_OBJS += kwset.o
797
LIB_OBJS += levenshtein.o
798
LIB_OBJS += line-log.o
B
Bo Yang 已提交
799
LIB_OBJS += line-range.o
800 801 802 803
LIB_OBJS += list-objects.o
LIB_OBJS += ll-merge.o
LIB_OBJS += lockfile.o
LIB_OBJS += log-tree.o
J
Junio C Hamano 已提交
804
LIB_OBJS += mailinfo.o
805 806
LIB_OBJS += mailmap.o
LIB_OBJS += match-trees.o
807
LIB_OBJS += merge.o
808
LIB_OBJS += merge-blobs.o
809
LIB_OBJS += merge-recursive.o
R
René Scharfe 已提交
810
LIB_OBJS += mergesort.o
J
Jeff King 已提交
811
LIB_OBJS += mru.o
812
LIB_OBJS += name-hash.o
J
Johannes Schindelin 已提交
813
LIB_OBJS += notes.o
J
Jeff King 已提交
814
LIB_OBJS += notes-cache.o
815
LIB_OBJS += notes-merge.o
816
LIB_OBJS += notes-utils.o
817
LIB_OBJS += object.o
J
Jeff King 已提交
818
LIB_OBJS += oidset.o
819
LIB_OBJS += pack-bitmap.o
820
LIB_OBJS += pack-bitmap-write.o
821
LIB_OBJS += pack-check.o
822
LIB_OBJS += pack-objects.o
823 824 825 826
LIB_OBJS += pack-revindex.o
LIB_OBJS += pack-write.o
LIB_OBJS += pager.o
LIB_OBJS += parse-options.o
827
LIB_OBJS += parse-options-cb.o
828 829 830
LIB_OBJS += patch-delta.o
LIB_OBJS += patch-ids.o
LIB_OBJS += path.o
831
LIB_OBJS += pathspec.o
832
LIB_OBJS += pkt-line.o
833
LIB_OBJS += preload-index.o
834
LIB_OBJS += pretty.o
835
LIB_OBJS += prio-queue.o
836
LIB_OBJS += progress.o
837
LIB_OBJS += prompt.o
838 839 840 841 842
LIB_OBJS += quote.o
LIB_OBJS += reachable.o
LIB_OBJS += read-cache.o
LIB_OBJS += reflog-walk.o
LIB_OBJS += refs.o
843
LIB_OBJS += refs/files-backend.o
844
LIB_OBJS += refs/iterator.o
845
LIB_OBJS += refs/ref-cache.o
846
LIB_OBJS += ref-filter.o
847
LIB_OBJS += remote.o
848
LIB_OBJS += replace_object.o
849
LIB_OBJS += repository.o
850
LIB_OBJS += rerere.o
851
LIB_OBJS += resolve-undo.o
852 853
LIB_OBJS += revision.o
LIB_OBJS += run-command.o
854
LIB_OBJS += send-pack.o
855
LIB_OBJS += sequencer.o
856 857
LIB_OBJS += server-info.o
LIB_OBJS += setup.o
858
LIB_OBJS += sha1-array.o
859
LIB_OBJS += sha1-lookup.o
860
LIB_OBJS += sha1_file.o
861 862 863
LIB_OBJS += sha1_name.o
LIB_OBJS += shallow.o
LIB_OBJS += sideband.o
864
LIB_OBJS += sigchain.o
865
LIB_OBJS += split-index.o
866
LIB_OBJS += strbuf.o
867
LIB_OBJS += streaming.o
868
LIB_OBJS += string-list.o
869
LIB_OBJS += submodule.o
870
LIB_OBJS += submodule-config.o
871
LIB_OBJS += sub-process.o
872 873
LIB_OBJS += symlinks.o
LIB_OBJS += tag.o
874
LIB_OBJS += tempfile.o
875
LIB_OBJS += tmp-objdir.o
876
LIB_OBJS += trace.o
877
LIB_OBJS += trailer.o
878
LIB_OBJS += transport.o
879
LIB_OBJS += transport-helper.o
880 881 882 883
LIB_OBJS += tree-diff.o
LIB_OBJS += tree.o
LIB_OBJS += tree-walk.o
LIB_OBJS += unpack-trees.o
J
Jeff King 已提交
884
LIB_OBJS += url.o
885
LIB_OBJS += urlmatch.o
886
LIB_OBJS += usage.o
887
LIB_OBJS += userdiff.o
888
LIB_OBJS += utf8.o
889
LIB_OBJS += varint.o
890
LIB_OBJS += version.o
891
LIB_OBJS += versioncmp.o
892
LIB_OBJS += walker.o
893
LIB_OBJS += wildmatch.o
894
LIB_OBJS += worktree.o
895
LIB_OBJS += wrapper.o
896 897 898 899
LIB_OBJS += write_or_die.o
LIB_OBJS += ws.o
LIB_OBJS += wt-status.o
LIB_OBJS += xdiff-interface.o
900
LIB_OBJS += zlib.o
901

902
BUILTIN_OBJS += builtin/add.o
903
BUILTIN_OBJS += builtin/am.o
904 905 906 907 908 909 910 911 912
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 已提交
913
BUILTIN_OBJS += builtin/check-ignore.o
914
BUILTIN_OBJS += builtin/check-mailmap.o
915 916 917 918 919
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
920
BUILTIN_OBJS += builtin/column.o
921 922 923 924
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
925
BUILTIN_OBJS += builtin/credential.o
926 927 928 929 930
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
931
BUILTIN_OBJS += builtin/difftool.o
932 933 934 935 936 937 938
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
939
BUILTIN_OBJS += builtin/get-tar-commit-id.o
940 941 942 943 944
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
945
BUILTIN_OBJS += builtin/interpret-trailers.o
946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962
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
BUILTIN_OBJS += builtin/mv.o
BUILTIN_OBJS += builtin/name-rev.o
J
Junio C Hamano 已提交
963
BUILTIN_OBJS += builtin/notes.o
964 965 966 967 968 969
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 已提交
970
BUILTIN_OBJS += builtin/pull.o
971 972
BUILTIN_OBJS += builtin/push.o
BUILTIN_OBJS += builtin/read-tree.o
973
BUILTIN_OBJS += builtin/rebase--helper.o
974 975 976
BUILTIN_OBJS += builtin/receive-pack.o
BUILTIN_OBJS += builtin/reflog.o
BUILTIN_OBJS += builtin/remote.o
I
Ilari Liusvaara 已提交
977
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
978
BUILTIN_OBJS += builtin/remote-fd.o
979
BUILTIN_OBJS += builtin/repack.o
980 981 982 983 984 985 986 987 988 989 990 991
BUILTIN_OBJS += builtin/replace.o
BUILTIN_OBJS += builtin/rerere.o
BUILTIN_OBJS += builtin/reset.o
BUILTIN_OBJS += builtin/rev-list.o
BUILTIN_OBJS += builtin/rev-parse.o
BUILTIN_OBJS += builtin/revert.o
BUILTIN_OBJS += builtin/rm.o
BUILTIN_OBJS += builtin/send-pack.o
BUILTIN_OBJS += builtin/shortlog.o
BUILTIN_OBJS += builtin/show-branch.o
BUILTIN_OBJS += builtin/show-ref.o
BUILTIN_OBJS += builtin/stripspace.o
992
BUILTIN_OBJS += builtin/submodule--helper.o
993 994 995 996 997 998 999 1000 1001
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
BUILTIN_OBJS += builtin/var.o
1002
BUILTIN_OBJS += builtin/verify-commit.o
1003 1004
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
1005
BUILTIN_OBJS += builtin/worktree.o
1006
BUILTIN_OBJS += builtin/write-tree.o
1007

1008
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
1009
EXTLIBS =
1010

J
Jeff King 已提交
1011 1012
GIT_USER_AGENT = git/$(GIT_VERSION)

1013 1014 1015 1016
ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/sha1.h)
DC_SHA1_SUBMODULE = auto
endif

1017
include config.mak.uname
1018
-include config.mak.autogen
1019
-include config.mak
1020

1021
ifdef DEVELOPER
1022
CFLAGS += $(DEVELOPER_CFLAGS)
1023 1024
endif

1025 1026 1027 1028
comma := ,
empty :=
space := $(empty) $(empty)

1029
ifdef SANITIZE
1030
SANITIZERS := $(foreach flag,$(subst $(comma),$(space),$(SANITIZE)),$(flag))
1031
BASIC_CFLAGS += -fsanitize=$(SANITIZE) -fno-sanitize-recover=$(SANITIZE)
1032
BASIC_CFLAGS += -fno-omit-frame-pointer
1033
ifneq ($(filter undefined,$(SANITIZERS)),)
1034 1035
BASIC_CFLAGS += -DNO_UNALIGNED_LOADS
endif
1036 1037
endif

1038 1039 1040 1041 1042 1043 1044 1045
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

1046
ifndef COMPUTE_HEADER_DEPENDENCIES
1047 1048 1049 1050
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
1051
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
1052 1053
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
1054
	echo $$?)
1055
ifeq ($(dep_check),0)
1056 1057 1058
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1059
endif
1060 1061
endif

1062
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1063
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1064 1065 1066 1067 1068
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1069 1070
endif

1071
ifdef SANE_TOOL_PATH
1072 1073
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1074 1075
PATH := $(SANE_TOOL_PATH):${PATH}
else
1076
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1077 1078
endif

G
Gary V. Vaughan 已提交
1079 1080 1081 1082
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1083 1084 1085 1086
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1087 1088 1089 1090 1091 1092 1093 1094
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

1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107
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
1108
	ifndef NO_APPLE_COMMON_CRYPTO
1109
		NO_OPENSSL = YesPlease
1110 1111 1112
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1113
	NO_REGEX = YesPlease
1114
	PTHREAD_LIBS =
1115 1116
endif

1117 1118 1119 1120 1121 1122 1123 1124
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
1125 1126
endif

1127 1128 1129 1130 1131
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

1132 1133 1134 1135 1136
USE_LIBPCRE1 ?= $(USE_LIBPCRE)

ifneq (,$(USE_LIBPCRE1))
	ifdef USE_LIBPCRE2
$(error Only set USE_LIBPCRE1 (or its alias USE_LIBPCRE) or USE_LIBPCRE2, not both!)
M
Michał Kiedrowicz 已提交
1137
	endif
1138 1139

	BASIC_CFLAGS += -DUSE_LIBPCRE1
M
Michał Kiedrowicz 已提交
1140
	EXTLIBS += -lpcre
1141 1142 1143 1144

ifdef NO_LIBPCRE1_JIT
	BASIC_CFLAGS += -DNO_LIBPCRE1_JIT
endif
M
Michał Kiedrowicz 已提交
1145 1146
endif

1147 1148 1149 1150 1151 1152 1153 1154
ifdef USE_LIBPCRE2
	BASIC_CFLAGS += -DUSE_LIBPCRE2
	EXTLIBS += -lpcre2-8
endif

ifdef LIBPCREDIR
	BASIC_CFLAGS += -I$(LIBPCREDIR)/include
	EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
M
Michał Kiedrowicz 已提交
1155 1156
endif

K
Kirill Smelkov 已提交
1157 1158 1159 1160
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1161
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1162
IMAP_SEND_LDFLAGS =
1163

D
Daniel Barkalow 已提交
1164 1165
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1166 1167 1168
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1169
else
1170
	ifdef CURLDIR
1171 1172 1173
		# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
		BASIC_CFLAGS += -I$(CURLDIR)/include
		CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib) -lcurl
1174
	else
1175
		CURL_LIBCURL = -lcurl
1176
	endif
1177 1178 1179 1180
	ifdef NEEDS_SSL_WITH_CURL
		CURL_LIBCURL += -lssl
		ifdef NEEDS_CRYPTO_WITH_SSL
			CURL_LIBCURL += -lcrypto
1181 1182
		endif
	endif
1183 1184 1185
	ifdef NEEDS_IDN_WITH_CURL
		CURL_LIBCURL += -lidn
	endif
1186

1187 1188 1189
	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)
1190 1191
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1192
	curl_check := $(shell (echo 070908; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1193 1194
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1195
			PROGRAM_OBJS += http-push.o
1196
		endif
1197
	endif
1198
	curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1199 1200 1201 1202 1203 1204 1205 1206
	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
1207
	ifndef NO_EXPAT
1208 1209 1210 1211 1212 1213
		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 已提交
1214 1215 1216
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1217
	endif
1218
endif
R
Remi Pommarel 已提交
1219
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
1220

1221 1222
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1223
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1224 1225 1226
endif
EXTLIBS += -lz

P
Petr Baudis 已提交
1227
ifndef NO_OPENSSL
J
Junio C Hamano 已提交
1228
	OPENSSL_LIBSSL = -lssl
J
Junio C Hamano 已提交
1229
	ifdef OPENSSLDIR
1230
		BASIC_CFLAGS += -I$(OPENSSLDIR)/include
1231
		OPENSSL_LINK = -L$(OPENSSLDIR)/$(lib) $(CC_LD_DYNPATH)$(OPENSSLDIR)/$(lib)
J
Junio C Hamano 已提交
1232 1233 1234
	else
		OPENSSL_LINK =
	endif
1235
	ifdef NEEDS_CRYPTO_WITH_SSL
1236
		OPENSSL_LIBSSL += -lcrypto
1237
	endif
P
Petr Baudis 已提交
1238
else
1239
	BASIC_CFLAGS += -DNO_OPENSSL
1240
	BLK_SHA1 = 1
J
Junio C Hamano 已提交
1241
	OPENSSL_LIBSSL =
P
Petr Baudis 已提交
1242
endif
1243 1244 1245
ifdef NO_OPENSSL
	LIB_4_CRYPTO =
else
1246
ifdef NEEDS_SSL_WITH_CRYPTO
J
Junio C Hamano 已提交
1247
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -lssl
1248
else
J
Junio C Hamano 已提交
1249
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto
1250
endif
1251 1252 1253
ifdef APPLE_COMMON_CRYPTO
	LIB_4_CRYPTO += -framework Security -framework CoreFoundation
endif
1254
endif
1255
ifdef NEEDS_LIBICONV
J
Junio C Hamano 已提交
1256
	ifdef ICONVDIR
1257
		BASIC_CFLAGS += -I$(ICONVDIR)/include
1258
		ICONV_LINK = -L$(ICONVDIR)/$(lib) $(CC_LD_DYNPATH)$(ICONVDIR)/$(lib)
J
Junio C Hamano 已提交
1259 1260 1261
	else
		ICONV_LINK =
	endif
J
Joachim Schmitz 已提交
1262 1263 1264
	ifdef NEEDS_LIBINTL_BEFORE_LIBICONV
		ICONV_LINK += -lintl
	endif
1265
	EXTLIBS += $(ICONV_LINK) -liconv
1266
endif
1267 1268 1269
ifdef NEEDS_LIBGEN
	EXTLIBS += -lgen
endif
1270 1271 1272 1273 1274
ifndef NO_GETTEXT
ifndef LIBC_CONTAINS_LIBINTL
	EXTLIBS += -lintl
endif
endif
1275
ifdef NEEDS_SOCKET
1276
	EXTLIBS += -lsocket
1277
endif
1278
ifdef NEEDS_NSL
1279
	EXTLIBS += -lnsl
1280
endif
1281 1282 1283
ifdef NEEDS_RESOLV
	EXTLIBS += -lresolv
endif
1284
ifdef NO_D_TYPE_IN_DIRENT
1285
	BASIC_CFLAGS += -DNO_D_TYPE_IN_DIRENT
1286
endif
1287 1288 1289
ifdef NO_GECOS_IN_PWENT
	BASIC_CFLAGS += -DNO_GECOS_IN_PWENT
endif
1290 1291 1292
ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
	BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT
endif
1293 1294 1295
ifdef USE_NSEC
	BASIC_CFLAGS += -DUSE_NSEC
endif
1296 1297 1298
ifdef USE_ST_TIMESPEC
	BASIC_CFLAGS += -DUSE_ST_TIMESPEC
endif
J
Junio C Hamano 已提交
1299 1300 1301
ifdef NO_NORETURN
	BASIC_CFLAGS += -DNO_NORETURN
endif
1302 1303 1304
ifdef NO_NSEC
	BASIC_CFLAGS += -DNO_NSEC
endif
1305 1306 1307 1308
ifdef SNPRINTF_RETURNS_BOGUS
	COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS
	COMPAT_OBJS += compat/snprintf.o
endif
1309 1310 1311 1312
ifdef FREAD_READS_DIRECTORIES
	COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES
	COMPAT_OBJS += compat/fopen.o
endif
1313
ifdef NO_SYMLINK_HEAD
1314
	BASIC_CFLAGS += -DNO_SYMLINK_HEAD
1315
endif
1316 1317 1318
ifdef GETTEXT_POISON
	BASIC_CFLAGS += -DGETTEXT_POISON
endif
1319 1320
ifdef NO_GETTEXT
	BASIC_CFLAGS += -DNO_GETTEXT
1321
	USE_GETTEXT_SCHEME ?= fallthrough
1322
endif
1323 1324 1325 1326 1327
ifdef NO_POLL
	NO_SYS_POLL_H = YesPlease
	COMPAT_CFLAGS += -DNO_POLL -Icompat/poll
	COMPAT_OBJS += compat/poll/poll.o
endif
1328
ifdef NO_STRCASESTR
1329
	COMPAT_CFLAGS += -DNO_STRCASESTR
J
Jason Riedy 已提交
1330 1331
	COMPAT_OBJS += compat/strcasestr.o
endif
1332 1333 1334 1335
ifdef NO_STRLCPY
	COMPAT_CFLAGS += -DNO_STRLCPY
	COMPAT_OBJS += compat/strlcpy.o
endif
1336 1337
ifdef NO_STRTOUMAX
	COMPAT_CFLAGS += -DNO_STRTOUMAX
1338
	COMPAT_OBJS += compat/strtoumax.o compat/strtoimax.o
1339 1340 1341 1342
endif
ifdef NO_STRTOULL
	COMPAT_CFLAGS += -DNO_STRTOULL
endif
J
Jason Riedy 已提交
1343
ifdef NO_SETENV
1344
	COMPAT_CFLAGS += -DNO_SETENV
J
Jason Riedy 已提交
1345
	COMPAT_OBJS += compat/setenv.o
1346
endif
1347 1348 1349 1350
ifdef NO_MKDTEMP
	COMPAT_CFLAGS += -DNO_MKDTEMP
	COMPAT_OBJS += compat/mkdtemp.o
endif
1351 1352 1353 1354
ifdef MKDIR_WO_TRAILING_SLASH
	COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH
	COMPAT_OBJS += compat/mkdir.o
endif
J
Johannes Schindelin 已提交
1355
ifdef NO_UNSETENV
J
Jason Riedy 已提交
1356 1357 1358
	COMPAT_CFLAGS += -DNO_UNSETENV
	COMPAT_OBJS += compat/unsetenv.o
endif
1359 1360 1361
ifdef NO_SYS_SELECT_H
	BASIC_CFLAGS += -DNO_SYS_SELECT_H
endif
1362 1363 1364
ifdef NO_SYS_POLL_H
	BASIC_CFLAGS += -DNO_SYS_POLL_H
endif
1365 1366
ifdef NEEDS_SYS_PARAM_H
	BASIC_CFLAGS += -DNEEDS_SYS_PARAM_H
1367
endif
1368 1369 1370 1371 1372 1373
ifdef NO_INTTYPES_H
	BASIC_CFLAGS += -DNO_INTTYPES_H
endif
ifdef NO_INITGROUPS
	BASIC_CFLAGS += -DNO_INITGROUPS
endif
1374
ifdef NO_MMAP
1375
	COMPAT_CFLAGS += -DNO_MMAP
J
Jason Riedy 已提交
1376
	COMPAT_OBJS += compat/mmap.o
J
Janos Laube 已提交
1377 1378 1379 1380 1381
else
	ifdef USE_WIN32_MMAP
		COMPAT_CFLAGS += -DUSE_WIN32_MMAP
		COMPAT_OBJS += compat/win32mmap.o
	endif
1382
endif
1383 1384
ifdef OBJECT_CREATION_USES_RENAMES
	COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1
1385
endif
1386 1387
ifdef NO_STRUCT_ITIMERVAL
	COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL
1388
	NO_SETITIMER = YesPlease
1389 1390 1391 1392
endif
ifdef NO_SETITIMER
	COMPAT_CFLAGS += -DNO_SETITIMER
endif
1393 1394 1395 1396
ifdef NO_PREAD
	COMPAT_CFLAGS += -DNO_PREAD
	COMPAT_OBJS += compat/pread.o
endif
1397 1398 1399
ifdef NO_FAST_WORKING_DIRECTORY
	BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
endif
1400 1401 1402
ifdef NO_TRUSTABLE_FILEMODE
	BASIC_CFLAGS += -DNO_TRUSTABLE_FILEMODE
endif
1403 1404 1405 1406
ifdef NEEDS_MODE_TRANSLATION
	COMPAT_CFLAGS += -DNEEDS_MODE_TRANSLATION
	COMPAT_OBJS += compat/stat.o
endif
1407
ifdef NO_IPV6
1408
	BASIC_CFLAGS += -DNO_IPV6
1409
endif
J
Joachim Schmitz 已提交
1410 1411 1412
ifdef NO_INTPTR_T
	COMPAT_CFLAGS += -DNO_INTPTR_T
endif
1413 1414 1415
ifdef NO_UINTMAX_T
	BASIC_CFLAGS += -Duintmax_t=uint32_t
endif
1416 1417
ifdef NO_SOCKADDR_STORAGE
ifdef NO_IPV6
1418
	BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in
1419
else
1420
	BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in6
1421
endif
1422
endif
1423 1424
ifdef NO_INET_NTOP
	LIB_OBJS += compat/inet_ntop.o
1425
	BASIC_CFLAGS += -DNO_INET_NTOP
1426
endif
1427 1428
ifdef NO_INET_PTON
	LIB_OBJS += compat/inet_pton.o
1429
	BASIC_CFLAGS += -DNO_INET_PTON
1430
endif
1431 1432 1433 1434 1435
ifndef NO_UNIX_SOCKETS
	LIB_OBJS += unix-socket.o
	PROGRAM_OBJS += credential-cache.o
	PROGRAM_OBJS += credential-cache--daemon.o
endif
1436

1437
ifdef NO_ICONV
1438
	BASIC_CFLAGS += -DNO_ICONV
1439 1440
endif

1441 1442 1443 1444
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1445 1446 1447 1448
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1449 1450 1451 1452
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1453 1454 1455 1456 1457
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

1458 1459 1460
ifdef OPENSSL_SHA1
	EXTLIBS += $(LIB_4_CRYPTO)
	BASIC_CFLAGS += -DSHA1_OPENSSL
J
Jeff King 已提交
1461
else
1462 1463
ifdef BLK_SHA1
	LIB_OBJS += block-sha1/sha1.o
1464
	BASIC_CFLAGS += -DSHA1_BLK
1465
else
1466 1467
ifdef PPC_SHA1
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1468
	BASIC_CFLAGS += -DSHA1_PPC
1469 1470 1471
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
1472
	BASIC_CFLAGS += -DSHA1_APPLE
1473
else
1474
	DC_SHA1 := YesPlease
1475 1476 1477 1478 1479
ifdef DC_SHA1_SUBMODULE
	LIB_OBJS += sha1collisiondetection/lib/sha1.o
	LIB_OBJS += sha1collisiondetection/lib/ubc_check.o
	BASIC_CFLAGS += -DDC_SHA1_SUBMODULE
else
1480 1481
	LIB_OBJS += sha1dc/sha1.o
	LIB_OBJS += sha1dc/ubc_check.o
1482
endif
1483 1484 1485 1486 1487 1488 1489 1490
	BASIC_CFLAGS += \
		-DSHA1_DC \
		-DSHA1DC_NO_STANDARD_INCLUDES \
		-DSHA1DC_INIT_SAFE_HASH_DEFAULT=0 \
		-DSHA1DC_CUSTOM_INCLUDE_SHA1_C="\"cache.h\"" \
		-DSHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_C="\"sha1dc_git.c\"" \
		-DSHA1DC_CUSTOM_TRAILING_INCLUDE_SHA1_H="\"sha1dc_git.h\"" \
		-DSHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C="\"git-compat-util.h\""
1491 1492 1493
endif
endif
endif
1494 1495
endif

1496 1497 1498 1499
ifdef SHA1_MAX_BLOCK_SIZE
	LIB_OBJS += compat/sha1-chunked.o
	BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
1500 1501 1502
ifdef NO_PERL_MAKEMAKER
	export NO_PERL_MAKEMAKER
endif
1503 1504 1505 1506
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1507 1508 1509 1510
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1511 1512 1513
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1514 1515 1516 1517
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
R
René Scharfe 已提交
1518 1519 1520 1521 1522
ifdef HAVE_ISO_QSORT_S
	COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S
else
	COMPAT_OBJS += compat/qsort_s.o
endif
1523 1524 1525
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1526

J
Junio C Hamano 已提交
1527 1528 1529
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1530
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1531
	EXTLIBS += $(PTHREAD_LIBS)
1532
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1533
endif
1534

1535 1536 1537 1538
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1539 1540
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1541
	EXTLIBS += $(CHARSET_LIB)
1542 1543
endif

1544 1545 1546 1547
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1548 1549 1550 1551
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1552 1553 1554
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1555 1556 1557
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1558 1559 1560 1561
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1562 1563 1564
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1565

1566
ifdef USE_NED_ALLOCATOR
1567 1568 1569 1570 1571 1572 1573 1574
	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
1575 1576
endif

1577 1578 1579 1580
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1581 1582 1583 1584
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1585 1586 1587 1588 1589
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1590 1591 1592 1593
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1594 1595 1596 1597
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1598 1599 1600 1601
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1602 1603 1604 1605
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1606 1607 1608 1609
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1610
ifeq ($(TCLTK_PATH),)
1611
NO_TCLTK = NoThanks
1612 1613
endif

1614
ifeq ($(PERL_PATH),)
1615
NO_PERL = NoThanks
1616 1617
endif

1618
ifeq ($(PYTHON_PATH),)
1619
NO_PYTHON = NoThanks
1620 1621
endif

1622 1623 1624 1625
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1626
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1627 1628
QUIET_SUBDIR1  =

1629
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1630 1631 1632 1633 1634
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1635
ifneq ($(findstring s,$(MAKEFLAGS)),s)
S
Shawn O. Pearce 已提交
1636
ifndef V
A
Alex Riesen 已提交
1637
	QUIET_CC       = @echo '   ' CC $@;
1638 1639 1640 1641
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1642
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1643
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1644
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1645
	QUIET_GCOV     = @echo '   ' GCOV $@;
1646
	QUIET_SP       = @echo '   ' SP $<;
1647
	QUIET_RC       = @echo '   ' RC $@;
1648
	QUIET_SUBDIR0  = +@subdir=
1649 1650
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1651
	export V
A
Alex Riesen 已提交
1652
	export QUIET_GEN
1653 1654
	export QUIET_BUILT_IN
endif
1655
endif
1656

J
Junio C Hamano 已提交
1657 1658 1659 1660
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1661 1662 1663 1664 1665 1666 1667
### profile feedback build
#

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

1668
ifeq ("$(PROFILE)","GEN")
1669
	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
1670
	EXTLIBS += -lgcov
1671 1672
	export CCACHE_DISABLE = t
	V = 1
1673 1674
else
ifneq ("$(PROFILE)","")
1675
	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1676 1677
	export CCACHE_DISABLE = t
	V = 1
1678
endif
1679
endif
1680

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

1683
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1684
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1685 1686 1687

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1688
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1689 1690
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1691
localedir_SQ = $(subst ','\'',$(localedir))
1692 1693
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
1694
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1695
prefix_SQ = $(subst ','\'',$(prefix))
1696
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1697 1698 1699

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1700
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1701
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1702
DIFF_SQ = $(subst ','\'',$(DIFF))
1703
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1704

1705 1706 1707 1708 1709 1710 1711 1712 1713
# 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)
1714

1715
BASIC_CFLAGS += $(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1716
LIB_OBJS += $(COMPAT_OBJS)
1717

1718 1719 1720 1721 1722 1723 1724 1725 1726
# 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

1727 1728 1729 1730 1731 1732 1733
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

1734 1735 1736 1737 1738 1739 1740
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 已提交
1741 1742 1743
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))
1744 1745 1746 1747
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 已提交
1748

1749 1750 1751 1752
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1753 1754 1755 1756 1757
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)'

1758 1759 1760
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1761
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1762 1763


P
Petr Baudis 已提交
1764 1765
### Build rules

1766 1767
SHELL = $(SHELL_PATH)

1768 1769 1770
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
1771 1772 1773 1774
all:: profile
endif

profile:: profile-clean
1775 1776
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
1777 1778 1779 1780 1781
	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
		$(MAKE) PROFILE=GEN -j1 perf; \
	else \
		echo "Skipping profile of perf tests..."; \
	fi
1782 1783 1784 1785 1786 1787 1788
	$(MAKE) PROFILE=USE all

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

1789 1790

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
1791
ifneq (,$X)
1792
	$(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';)
1793
endif
1794

1795
all::
E
Eygene Ryabinkin 已提交
1796
ifndef NO_TCLTK
1797
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1798
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
E
Eygene Ryabinkin 已提交
1799
endif
1800
ifndef NO_PERL
1801
	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' localedir='$(localedir_SQ)' all
1802
endif
1803
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1804

1805 1806 1807 1808 1809
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 已提交
1810
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
1811
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
1812

1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845
### 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.

1846
git.sp git.s git.o: GIT-PREFIX
1847
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1848 1849 1850
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1851

1852
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1853 1854
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
		$(filter %.o,$^) $(LIBS)
1855

1856
help.sp help.s help.o: common-cmds.h
1857

1858
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1859
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1860 1861 1862
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1863

1864
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1865
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1866 1867
	'-DGIT_VERSION="$(GIT_VERSION)"' \
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
1868

J
Junio C Hamano 已提交
1869
$(BUILT_INS): git$X
1870
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
1871 1872 1873
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
1874

1875
common-cmds.h: generate-cmdlist.sh command-list.txt
1876

J
Junio C Hamano 已提交
1877
common-cmds.h: $(wildcard Documentation/git-*.txt)
1878
	$(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh command-list.txt >$@+ && mv $@+ $@
F
Fredrik Kuivinen 已提交
1879

1880
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
1881
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
1882
	$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV)
1883 1884 1885 1886
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
1887
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
1888
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
1889
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
1890
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
1891
    -e $(BROKEN_PATH_FIX) \
1892 1893
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
1894
    -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
1895
    -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
1896 1897 1898
    $@.sh >$@+
endef

1899 1900 1901
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
1902
		echo >&2 "    * new script parameters"; \
1903 1904 1905 1906
		echo "$$FLAGS" >$@; \
            fi


1907
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
1908
	$(QUIET_GEN)$(cmd_munge_script) && \
1909
	chmod +x $@+ && \
1910
	mv $@+ $@
1911

1912
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1913 1914 1915
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1916
git.res: git.rc GIT-VERSION-FILE
1917
	$(QUIET_RC)$(RC) \
1918
	  $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
S
Steven Penny 已提交
1919
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
1920

1921
# This makes sure we depend on the NO_PERL setting itself.
1922
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
1923

1924
ifndef NO_PERL
1925
$(SCRIPT_PERL_GEN): perl/perl.mak
1926

1927 1928 1929
perl/perl.mak: perl/PM.stamp

perl/PM.stamp: FORCE
1930
	@$(FIND) perl -type f -name '*.pm' | sort >$@+ && \
1931
	$(PERL_PATH) -V >>$@+ && \
1932 1933 1934
	{ cmp $@+ $@ >/dev/null 2>/dev/null || mv $@+ $@; } && \
	$(RM) $@+

1935
perl/perl.mak: GIT-CFLAGS GIT-PREFIX perl/Makefile perl/Makefile.PL
A
Alex Riesen 已提交
1936
	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' $(@F)
1937

1938
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ)
1939
$(SCRIPT_PERL_GEN): % : %.perl perl/perl.mak GIT-PERL-DEFINES GIT-VERSION-FILE
1940
	$(QUIET_GEN)$(RM) $@ $@+ && \
1941
	INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
1942 1943
	INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \
	INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \
1944 1945 1946
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
	    -e '	h' \
1947
	    -e '	s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'"));=' \
1948 1949 1950
	    -e '	H' \
	    -e '	x' \
	    -e '}' \
1951
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
1952
	    $< >$@+ && \
1953
	chmod +x $@+ && \
1954
	mv $@+ $@
1955

1956 1957 1958 1959 1960 1961 1962
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

1963 1964 1965 1966 1967

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

1968
git-instaweb: git-instaweb.sh GIT-SCRIPT-DEFINES
1969
	$(QUIET_GEN)$(cmd_munge_script) && \
1970
	chmod +x $@+ && \
1971
	mv $@+ $@
1972
else # NO_PERL
1973
$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh
1974 1975 1976 1977 1978 1979 1980
	$(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
1981

1982 1983 1984
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

1985
ifndef NO_PYTHON
F
Felipe Contreras 已提交
1986 1987
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
1988
	$(QUIET_GEN)$(RM) $@ $@+ && \
1989
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
1990
	    $< >$@+ && \
1991 1992 1993
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
1994
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
1995 1996 1997 1998 1999 2000 2001 2002
	$(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

2003 2004 2005 2006 2007 2008
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+

2009
configure: configure.ac GIT-VERSION-FILE
2010
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
2011

2012
ifdef AUTOCONFIGURED
2013 2014 2015 2016 2017 2018
# 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
2019
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
2020
	if test -f config.status; then \
2021 2022 2023 2024 2025 2026 2027 2028 2029
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

2030 2031 2032 2033 2034 2035
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
2036
XDIFF_OBJS += xdiff/xhistogram.o
2037 2038

VCSSVN_OBJS += vcs-svn/line_buffer.o
2039
VCSSVN_OBJS += vcs-svn/sliding_window.o
2040 2041
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
2042
VCSSVN_OBJS += vcs-svn/svndiff.o
2043 2044
VCSSVN_OBJS += vcs-svn/svndump.o

2045
TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS))
2046 2047 2048
OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
	$(XDIFF_OBJS) \
	$(VCSSVN_OBJS) \
2049
	common-main.o \
2050 2051 2052 2053
	git.o
ifndef NO_CURL
	OBJECTS += http.o http-walker.o remote-curl.o
endif
2054

2055
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
2056
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
2057

2058
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2059
$(dep_dirs):
2060
	@mkdir -p $@
2061 2062

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
2063
dep_file = $(dir $@).depend/$(notdir $@).d
2064
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
2065 2066
endif

2067
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2068 2069
dep_dirs =
missing_dep_dirs =
2070 2071 2072 2073 2074 2075 2076
dep_args =
endif

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

2077 2078
.SUFFIXES:

2079
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
2080
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2081
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
2082
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2083

2084
%.s: %.c GIT-CFLAGS FORCE
2085
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2086 2087

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
2088 2089
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
2090 2091 2092
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
2093 2094 2095 2096 2097 2098 2099 2100
endif
else
# Dependencies on header files, for platforms that do not support
# the gcc -MMD option.
#
# Dependencies on automatically generated headers such as common-cmds.h
# should _not_ be included here, since they are necessary even when
# building an object for the first time.
J
Jonathan Nieder 已提交
2101

2102
$(OBJECTS): $(LIB_H)
2103
endif
2104

2105
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
2106
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
2107 2108 2109
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
2110

2111
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2112
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2113
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2114

2115
config.sp config.s config.o: GIT-PREFIX
2116 2117
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2118

2119
attr.sp attr.s attr.o: GIT-PREFIX
2120 2121
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2122

2123
gettext.sp gettext.s gettext.o: GIT-PREFIX
2124 2125 2126
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2127
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SPARSE_FLAGS += \
2128 2129
	-DCURL_DISABLE_TYPECHECK

2130
ifdef NO_EXPAT
2131
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2132 2133
endif

2134
ifdef NO_REGEX
2135 2136
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2137 2138
endif

2139
ifdef USE_NED_ALLOCATOR
2140
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2141
	-DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
2142
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2143 2144
endif

2145
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2146
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2147

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

2152
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2153
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2154
		$(CURL_LIBCURL) $(LIBS)
2155
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2156
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2157
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2158

2159 2160 2161 2162
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)

2163 2164 2165 2166 2167 2168
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

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

P
Petr Baudis 已提交
2173
$(LIB_FILE): $(LIB_OBJS)
2174
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2175

2176
$(XDIFF_LIB): $(XDIFF_OBJS)
2177
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2178

J
Jonathan Nieder 已提交
2179
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2180
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2181

2182 2183
export DEFAULT_EDITOR DEFAULT_PAGER

E
Elia Pinto 已提交
2184
.PHONY: doc man html info pdf
P
Petr Baudis 已提交
2185 2186 2187
doc:
	$(MAKE) -C Documentation all

2188 2189 2190 2191 2192 2193
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

2194 2195 2196
info:
	$(MAKE) -C Documentation info

2197 2198 2199
pdf:
	$(MAKE) -C Documentation pdf

2200 2201
XGETTEXT_FLAGS = \
	--force-po \
2202
	--add-comments=TRANSLATORS: \
2203 2204
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2205 2206
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2207 2208
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2209
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
2210
	--keyword=__ --keyword=N__ --keyword="__n:1,2"
2211
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2212 2213
LOCALIZED_SH = $(SCRIPT_SH)
LOCALIZED_SH += git-parse-remote.sh
2214
LOCALIZED_SH += git-rebase--interactive.sh
2215
LOCALIZED_SH += git-sh-setup.sh
2216
LOCALIZED_PERL = $(SCRIPT_PERL)
2217 2218 2219 2220 2221 2222

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

2224 2225 2226 2227 2228 2229 2230 2231
## 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.

2232
po/git.pot: $(GENERATED_H) FORCE
2233 2234 2235 2236 2237 2238 2239 2240 2241 2242
	# 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

2243 2244 2245
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2246 2247
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2248 2249 2250

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

E
Elia Pinto 已提交
2253
.PHONY: pot
2254 2255
pot: po/git.pot

2256 2257 2258 2259 2260 2261 2262 2263 2264 2265
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 $@ $<

J
Jeff King 已提交
2266
FIND_SOURCE_FILES = ( \
2267 2268
	git ls-files \
		'*.[hcS]' \
2269
		'*.sh' \
2270
		':!*[tp][0-9][0-9][0-9][0-9]*' \
2271
		':!contrib' \
2272
		2>/dev/null || \
J
Jeff King 已提交
2273 2274
	$(FIND) . \
		\( -name .git -type d -prune \) \
2275
		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
2276
		-o \( -name contrib -type d -prune \) \
2277 2278
		-o \( -name build -type d -prune \) \
		-o \( -name 'trash*' -type d -prune \) \
J
Jeff King 已提交
2279
		-o \( -name '*.[hcS]' -type f -print \) \
2280
		-o \( -name '*.sh' -type f -print \) \
J
Jeff King 已提交
2281
	)
2282

2283 2284
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2285
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2286

2287
tags: FORCE
2288
	$(RM) tags
2289
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2290

K
Kristof Provost 已提交
2291 2292
cscope:
	$(RM) cscope*
2293
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2294

2295
### Detect prefix changes
2296 2297 2298 2299 2300 2301
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 \
2302
		echo >&2 "    * new prefix flags"; \
2303 2304 2305 2306
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2308
GIT-CFLAGS: FORCE
2309 2310
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2311
		echo >&2 "    * new build flags"; \
2312 2313 2314
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2315 2316 2317 2318 2319
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2324 2325 2326
# 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".
2327
GIT-BUILD-OPTIONS: FORCE
2328 2329 2330 2331 2332 2333
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@+
	@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)))'\' >>$@+
2334
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2335 2336
	@echo USE_LIBPCRE1=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE1)))'\' >>$@+
	@echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+
2337
	@echo NO_LIBPCRE1_JIT=\''$(subst ','\'',$(subst ','\'',$(NO_LIBPCRE1_JIT)))'\' >>$@+
2338
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
2339
	@echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+
2340 2341
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
2342
	@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
2343
	@echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
2344
ifdef TEST_OUTPUT_DIRECTORY
2345
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2346
endif
2347
ifdef GIT_TEST_OPTS
2348
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2349
endif
2350
ifdef GIT_TEST_CMP
2351
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2352 2353
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2354
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2355
endif
2356 2357
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@+
2358
ifdef GIT_PERF_REPEAT_COUNT
2359
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2360 2361
endif
ifdef GIT_PERF_REPO
2362
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2363 2364
endif
ifdef GIT_PERF_LARGE_REPO
2365
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2366 2367
endif
ifdef GIT_PERF_MAKE_OPTS
2368
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2369
endif
2370 2371 2372
ifdef GIT_PERF_MAKE_COMMAND
	@echo GIT_PERF_MAKE_COMMAND=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_COMMAND)))'\' >>$@+
endif
2373 2374 2375
ifdef GIT_INTEROP_MAKE_OPTS
	@echo GIT_INTEROP_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_INTEROP_MAKE_OPTS)))'\' >>$@+
endif
2376
ifdef TEST_GIT_INDEX_VERSION
2377
	@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
2378
endif
2379
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2380

2381 2382 2383
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2384

2385 2386
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2387
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2388
		echo >&2 "    * new Python interpreter location"; \
2389 2390 2391 2392
		echo "$$VARS" >$@; \
            fi
endif

2393 2394 2395
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2396
all:: $(NO_INSTALL)
2397 2398 2399 2400 2401

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

2405 2406 2407 2408
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2409
export NO_SVN_TESTS
2410
export TEST_NO_MALLOC_CHECK
2411

2412 2413
### Testing rules

2414
test: all
P
Petr Baudis 已提交
2415 2416
	$(MAKE) -C t/ all

2417 2418 2419 2420 2421
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

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

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

2426
.PRECIOUS: $(TEST_OBJS)
2427

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

2431 2432
check-sha1:: t/helper/test-sha1$X
	t/helper/test-sha1.sh
2433

2434 2435 2436 2437 2438 2439 2440 2441 2442
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)

2443
check: common-cmds.h
2444
	@if sparse; \
2445
	then \
2446
		echo >&2 "Use 'make sparse' instead"; \
2447
		$(MAKE) --no-print-directory sparse; \
2448
	else \
2449
		echo >&2 "Did you mean 'make test'?"; \
2450 2451
		exit 1; \
	fi
P
Petr Baudis 已提交
2452

R
René Scharfe 已提交
2453 2454 2455
C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
%.cocci.patch: %.cocci $(C_SOURCES)
	@echo '    ' SPATCH $<; \
2456
	ret=0; \
R
René Scharfe 已提交
2457
	for f in $(C_SOURCES); do \
2458 2459 2460 2461 2462 2463 2464 2465 2466
		$(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 已提交
2467 2468 2469 2470 2471 2472
	if test -s $@; \
	then \
		echo '    ' SPATCH result: $@; \
	fi
coccicheck: $(patsubst %.cocci,%.cocci.patch,$(wildcard contrib/coccinelle/*.cocci))

P
Petr Baudis 已提交
2473 2474
### Installation rules

2475
ifneq ($(filter /%,$(firstword $(template_dir))),)
2476
template_instdir = $(template_dir)
2477 2478
else
template_instdir = $(prefix)/$(template_dir)
2479 2480 2481
endif
export template_instdir

2482
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2483
gitexec_instdir = $(gitexecdir)
2484 2485
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2486 2487 2488 2489
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2490 2491 2492 2493 2494 2495 2496
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2497 2498
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2499
.PHONY: profile-install profile-fast-install
2500 2501 2502 2503 2504 2505
profile-install: profile
	$(MAKE) install

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

2506
install: all
2507
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2508 2509
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2510
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2511
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2512
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2513
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2514
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2515 2516 2517 2518 2519
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
2520
ifndef NO_PERL
2521
	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
J
Junio C Hamano 已提交
2522
	$(MAKE) -C gitweb install
2523
endif
E
Eygene Ryabinkin 已提交
2524
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2525
	$(MAKE) -C gitk-git install
2526
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2527
endif
2528
ifneq (,$X)
2529
	$(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';)
2530
endif
2531

2532
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2533
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2534
	{ test "$$bindir/" = "$$execdir/" || \
2535 2536
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2537
		test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
2538 2539 2540 2541
		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
	  done; \
	} && \
2542 2543
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
J
Junio C Hamano 已提交
2544
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2545 2546 2547 2548
		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; \
	done && \
2549
	for p in $(BUILT_INS); do \
2550
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2551
		test -z "$(NO_INSTALL_HARDLINKS)" && \
J
Jeff King 已提交
2552 2553 2554
		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; \
2555
	done && \
2556 2557
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2558
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2559
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2560 2561 2562
		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; \
2563
	done && \
2564
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2565

E
Elia Pinto 已提交
2566 2567
.PHONY: install-gitweb install-doc install-man install-html install-info install-pdf
.PHONY: quick-install-doc quick-install-man quick-install-html
2568 2569 2570
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2571 2572 2573
install-doc:
	$(MAKE) -C Documentation install

2574 2575 2576
install-man:
	$(MAKE) -C Documentation install-man

2577 2578 2579
install-html:
	$(MAKE) -C Documentation install-html

2580 2581 2582
install-info:
	$(MAKE) -C Documentation install-info

2583 2584 2585
install-pdf:
	$(MAKE) -C Documentation install-pdf

2586 2587
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2588

2589 2590 2591
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2592 2593 2594
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2595 2596 2597 2598


### Maintainer's dist rules

2599
GIT_TARNAME = git-$(GIT_VERSION)
2600
dist: git-archive$(X) configure
2601 2602
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2603
	@mkdir -p $(GIT_TARNAME)
2604
	@cp configure $(GIT_TARNAME)
2605
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2606
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2607
	$(TAR) rf $(GIT_TARNAME).tar \
2608
		$(GIT_TARNAME)/configure \
2609
		$(GIT_TARNAME)/version \
2610
		$(GIT_TARNAME)/git-gui/version
2611
	@$(RM) -r $(GIT_TARNAME)
2612
	gzip -f -9 $(GIT_TARNAME).tar
2613

2614 2615 2616 2617
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2618

2619 2620
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
2621
.PHONY: dist-doc distclean
2622
dist-doc:
2623
	$(RM) -r .doc-tmp-dir
2624 2625 2626 2627 2628
	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
	:
2629
	$(RM) -r .doc-tmp-dir
2630
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2631
	$(MAKE) -C Documentation DESTDIR=./ \
2632
		man1dir=../.doc-tmp-dir/man1 \
2633
		man5dir=../.doc-tmp-dir/man5 \
2634
		man7dir=../.doc-tmp-dir/man7 \
2635 2636 2637
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2638
	$(RM) -r .doc-tmp-dir
2639

P
Petr Baudis 已提交
2640
### Cleaning rules
2641

2642 2643
distclean: clean
	$(RM) configure
2644 2645 2646
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2647

2648 2649 2650 2651
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

2652
clean: profile-clean coverage-clean
2653 2654
	$(RM) *.res
	$(RM) $(OBJECTS)
2655
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2656
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2657
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
2658
	$(RM) -r bin-wrappers $(dep_dirs)
2659
	$(RM) -r po/build/
2660
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
2661 2662 2663
	$(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
R
René Scharfe 已提交
2664
	$(RM) contrib/coccinelle/*.cocci.patch*
2665
	$(MAKE) -C Documentation/ clean
2666
ifndef NO_PERL
2667
	$(MAKE) -C gitweb clean
2668
	$(MAKE) -C perl clean
2669
endif
P
Petr Baudis 已提交
2670
	$(MAKE) -C templates/ clean
2671
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2672
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2673
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2674 2675
	$(MAKE) -C git-gui clean
endif
2676
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2677 2678
	$(RM) GIT-USER-AGENT GIT-PREFIX
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PYTHON-VARS
2679

2680
.PHONY: all install profile-clean clean strip
2681
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2682
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2683

J
Junio C Hamano 已提交
2684 2685
### Check documentation
#
J
Jeff King 已提交
2686 2687 2688 2689
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2690
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
2691 2692

.PHONY: check-docs
J
Junio C Hamano 已提交
2693
check-docs::
2694
	$(MAKE) -C Documentation lint-docs
J
Jeff King 已提交
2695
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2696 2697 2698
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2699
		git-merge-resolve | git-merge-subtree | \
2700
		git-fsck-objects | git-init-db | \
2701
		git-remote-* | git-stage | \
2702
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2703 2704 2705
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
2706
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
2707
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2708 2709 2710 2711
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2712 2713
	done; \
	( \
2714 2715
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
2716
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2717
		    -e 's/^/listed /' command-list.txt; \
2718 2719
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2720 2721 2722 2723
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2724
		case " $(ALL_COMMANDS) " in \
2725 2726 2727 2728
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2729 2730 2731 2732 2733

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

2735 2736
### Test suite coverage testing
#
2737
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
2738
.PHONY: coverage-untested-functions cover_db cover_db_html
2739
.PHONY: coverage-clean-results
2740 2741

coverage:
2742
	$(MAKE) coverage-test
2743
	$(MAKE) coverage-untested-functions
2744

2745
object_dirs := $(sort $(dir $(OBJECTS)))
2746
coverage-clean-results:
2747 2748 2749
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2750
	$(RM) -r cover_db/
2751
	$(RM) -r cover_db_html/
2752

2753 2754 2755
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2756 2757
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2758
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2759

2760
coverage-compile:
2761
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2762 2763

coverage-test: coverage-clean-results coverage-compile
2764
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2765
		DEFAULT_TEST_TARGET=test -j1 test
2766 2767

coverage-report:
2768
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2769
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2770
	done
2771 2772

coverage-untested-functions: coverage-report
2773 2774
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2775
		> coverage-untested-functions
2776 2777 2778

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2779 2780 2781

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