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

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

438
GIT-VERSION-FILE: FORCE
439
	@$(SHELL_PATH) ./GIT-VERSION-GEN
440
-include GIT-VERSION-FILE
441

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

444
CFLAGS = -g -O2 -Wall
445
DEVELOPER_CFLAGS = -Werror \
446 447 448 449 450 451 452 453
	-Wdeclaration-after-statement \
	-Wno-format-zero-length \
	-Wold-style-definition \
	-Woverflow \
	-Wpointer-arith \
	-Wstrict-prototypes \
	-Wunused \
	-Wvla
J
Junio C Hamano 已提交
454
LDFLAGS =
455
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
456
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
457
STRIP ?= strip
458

459 460 461
# Create as necessary, replace existing, make ranlib unneeded.
ARFLAGS = rcs

462 463 464
# Among the variables below, these:
#   gitexecdir
#   template_dir
465
#   sysconfdir
466 467
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
468
# runtime figures out where they are based on the path to the executable.
469 470 471 472 473
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
474 475
# This can help installing the suite in a relocatable way.

476
prefix = $(HOME)
477 478
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
479 480
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
481
gitexecdir = libexec/git-core
482
mergetoolsdir = $(gitexecdir)/mergetools
483
sharedir = $(prefix)/share
484
gitwebdir = $(sharedir)/gitweb
485
perllibdir = $(sharedir)/perl5
486
localedir = $(sharedir)/locale
487
template_dir = share/git-core/templates
488
htmldir = $(prefix)/share/doc/git-doc
489
ETC_GITCONFIG = $(sysconfdir)/gitconfig
490
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
491
lib = lib
492
# DESTDIR =
493
pathsep = :
494

495 496 497 498
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

499
export prefix bindir sharedir sysconfdir gitwebdir perllibdir localedir
500

501
CC = cc
502
AR = ar
503
RM = rm -f
504
DIFF = diff
505
TAR = tar
506
FIND = find
507
INSTALL = install
508
TCL_PATH = tclsh
509
TCLTK_PATH = wish
510
XGETTEXT = xgettext
511
MSGFMT = msgfmt
512
CURL_CONFIG = curl-config
513
PTHREAD_LIBS = -lpthread
514
PTHREAD_CFLAGS =
515
GCOV = gcov
R
René Scharfe 已提交
516
SPATCH = spatch
517

518 519
export TCL_PATH TCLTK_PATH

520
SPARSE_FLAGS =
521
SPATCH_FLAGS = --all-includes
522

P
Petr Baudis 已提交
523 524 525 526


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

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

533 534 535 536 537
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
538 539
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
540
GENERATED_H =
541
EXTRA_CPPFLAGS =
542
LIB_OBJS =
543
PROGRAM_OBJS =
544 545
PROGRAMS =
SCRIPT_PERL =
546
SCRIPT_PYTHON =
547
SCRIPT_SH =
548
SCRIPT_LIB =
549
TEST_BUILTINS_OBJS =
550
TEST_PROGRAMS_NEED_X =
551

J
Jonathan Nieder 已提交
552 553 554 555 556 557
# 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

558
SCRIPT_SH += git-bisect.sh
559
SCRIPT_SH += git-difftool--helper.sh
560 561 562 563 564 565 566
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
567
SCRIPT_SH += git-remote-testgit.sh
568 569 570 571 572
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

573 574
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
575 576 577
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
578
SCRIPT_LIB += git-sh-setup
579
SCRIPT_LIB += git-sh-i18n
580

581 582 583 584 585 586 587
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
588

P
Pete Wyckoff 已提交
589
SCRIPT_PYTHON += git-p4.py
590

591
NO_INSTALL += git-remote-testgit
592

593 594 595 596 597
# 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))

598 599 600 601
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))

602 603 604 605 606 607 608 609 610
# 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
611
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
612
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
613
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
614
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
615
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
616
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
617 618 619 620 621 622 623 624 625

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

626 627 628
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
629
	  git-instaweb
630

631 632
ETAGS_TARGET = TAGS

633 634
# Empty...
EXTRA_PROGRAMS =
635

636 637
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
638

639
PROGRAM_OBJS += credential-store.o
640
PROGRAM_OBJS += daemon.o
641
PROGRAM_OBJS += fast-import.o
642
PROGRAM_OBJS += http-backend.o
643
PROGRAM_OBJS += imap-send.o
644
PROGRAM_OBJS += sh-i18n--envsubst.o
645 646 647
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
648
PROGRAM_OBJS += remote-testsvn.o
649

650 651 652
# Binary suffix, set to .exe for Windows builds
X =

653
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
654

655
TEST_BUILTINS_OBJS += test-chmtime.o
656
TEST_BUILTINS_OBJS += test-config.o
657
TEST_BUILTINS_OBJS += test-ctype.o
658
TEST_BUILTINS_OBJS += test-date.o
659
TEST_BUILTINS_OBJS += test-delta.o
660
TEST_BUILTINS_OBJS += test-drop-caches.o
661
TEST_BUILTINS_OBJS += test-dump-cache-tree.o
662
TEST_BUILTINS_OBJS += test-dump-split-index.o
663
TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
664
TEST_BUILTINS_OBJS += test-sha1.o
665

666
TEST_PROGRAMS_NEED_X += test-dump-fsmonitor
667
TEST_PROGRAMS_NEED_X += test-dump-untracked-cache
J
Jonathan Tan 已提交
668
TEST_PROGRAMS_NEED_X += test-example-decorate
J
Johannes Schindelin 已提交
669
TEST_PROGRAMS_NEED_X += test-fake-ssh
670
TEST_PROGRAMS_NEED_X += test-genrandom
671
TEST_PROGRAMS_NEED_X += test-hashmap
J
Jeff King 已提交
672
TEST_PROGRAMS_NEED_X += test-index-version
D
David Barr 已提交
673
TEST_PROGRAMS_NEED_X += test-line-buffer
674
TEST_PROGRAMS_NEED_X += test-match-trees
R
René Scharfe 已提交
675
TEST_PROGRAMS_NEED_X += test-mergesort
J
Jeff King 已提交
676
TEST_PROGRAMS_NEED_X += test-mktemp
677
TEST_PROGRAMS_NEED_X += test-online-cpus
678 679
TEST_PROGRAMS_NEED_X += test-parse-options
TEST_PROGRAMS_NEED_X += test-path-utils
680
TEST_PROGRAMS_NEED_X += test-prio-queue
681
TEST_PROGRAMS_NEED_X += test-read-cache
682
TEST_PROGRAMS_NEED_X += test-write-cache
683
TEST_PROGRAMS_NEED_X += test-ref-store
684
TEST_PROGRAMS_NEED_X += test-regex
685
TEST_PROGRAMS_NEED_X += test-revision-walking
686
TEST_PROGRAMS_NEED_X += test-run-command
687
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
688
TEST_PROGRAMS_NEED_X += test-sha1-array
689
TEST_PROGRAMS_NEED_X += test-sigchain
690
TEST_PROGRAMS_NEED_X += test-strcmp-offset
691
TEST_PROGRAMS_NEED_X += test-string-list
692
TEST_PROGRAMS_NEED_X += test-submodule-config
693
TEST_PROGRAMS_NEED_X += test-subprocess
D
David Barr 已提交
694
TEST_PROGRAMS_NEED_X += test-svn-fe
695
TEST_PROGRAMS_NEED_X += test-tool
696
TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
697
TEST_PROGRAMS_NEED_X += test-wildmatch
698

699
TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
700

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

BUILT_INS += git-cherry$X
706
BUILT_INS += git-cherry-pick$X
707 708 709 710 711
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 已提交
712
BUILT_INS += git-stage$X
713 714
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
715

716 717
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
718
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
719

E
Eygene Ryabinkin 已提交
720
# what 'all' will build but not install in gitexecdir
721
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
722

723 724 725 726 727 728 729 730 731
# 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

732 733 734 735 736 737 738
# 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
739 740 741
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
742

L
Luben Tuikov 已提交
743
export PERL_PATH
744
export PYTHON_PATH
L
Luben Tuikov 已提交
745

J
Jeff King 已提交
746 747
TEST_SHELL_PATH = $(SHELL_PATH)

748 749 750
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
751

J
Jeff King 已提交
752
GENERATED_H += common-cmds.h
753

754 755 756 757 758
LIB_H = $(shell $(FIND) . \
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
	-name '*.h' -print)
759

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

937
BUILTIN_OBJS += builtin/add.o
938
BUILTIN_OBJS += builtin/am.o
939 940 941 942 943 944 945 946 947
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 已提交
948
BUILTIN_OBJS += builtin/check-ignore.o
949
BUILTIN_OBJS += builtin/check-mailmap.o
950 951 952 953 954
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
955
BUILTIN_OBJS += builtin/column.o
956 957 958 959
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
960
BUILTIN_OBJS += builtin/credential.o
961 962 963 964 965
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
966
BUILTIN_OBJS += builtin/difftool.o
967 968 969 970 971 972 973
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
974
BUILTIN_OBJS += builtin/get-tar-commit-id.o
975 976 977 978 979
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
980
BUILTIN_OBJS += builtin/interpret-trailers.o
981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
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 已提交
998
BUILTIN_OBJS += builtin/notes.o
999 1000 1001 1002 1003 1004
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 已提交
1005
BUILTIN_OBJS += builtin/pull.o
1006 1007
BUILTIN_OBJS += builtin/push.o
BUILTIN_OBJS += builtin/read-tree.o
1008
BUILTIN_OBJS += builtin/rebase--helper.o
1009 1010 1011
BUILTIN_OBJS += builtin/receive-pack.o
BUILTIN_OBJS += builtin/reflog.o
BUILTIN_OBJS += builtin/remote.o
I
Ilari Liusvaara 已提交
1012
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
1013
BUILTIN_OBJS += builtin/remote-fd.o
1014
BUILTIN_OBJS += builtin/repack.o
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
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
1027
BUILTIN_OBJS += builtin/submodule--helper.o
1028 1029 1030 1031 1032 1033 1034 1035 1036
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
1037
BUILTIN_OBJS += builtin/verify-commit.o
1038 1039
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
1040
BUILTIN_OBJS += builtin/worktree.o
1041
BUILTIN_OBJS += builtin/write-tree.o
1042

1043
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
1044
EXTLIBS =
1045

J
Jeff King 已提交
1046 1047
GIT_USER_AGENT = git/$(GIT_VERSION)

1048 1049 1050 1051
ifeq ($(wildcard sha1collisiondetection/lib/sha1.h),sha1collisiondetection/lib/sha1.h)
DC_SHA1_SUBMODULE = auto
endif

1052
include config.mak.uname
1053
-include config.mak.autogen
1054
-include config.mak
1055

1056
ifdef DEVELOPER
1057
CFLAGS += $(DEVELOPER_CFLAGS)
1058 1059
endif

1060 1061 1062 1063
comma := ,
empty :=
space := $(empty) $(empty)

1064
ifdef SANITIZE
1065
SANITIZERS := $(foreach flag,$(subst $(comma),$(space),$(SANITIZE)),$(flag))
1066
BASIC_CFLAGS += -fsanitize=$(SANITIZE) -fno-sanitize-recover=$(SANITIZE)
1067
BASIC_CFLAGS += -fno-omit-frame-pointer
1068
ifneq ($(filter undefined,$(SANITIZERS)),)
1069 1070
BASIC_CFLAGS += -DNO_UNALIGNED_LOADS
endif
1071 1072 1073
ifneq ($(filter leak,$(SANITIZERS)),)
BASIC_CFLAGS += -DSUPPRESS_ANNOTATED_LEAKS
endif
1074 1075
endif

1076 1077 1078 1079 1080 1081 1082 1083
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

1084
ifndef COMPUTE_HEADER_DEPENDENCIES
1085 1086 1087 1088
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
1089
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
1090 1091
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
1092
	echo $$?)
1093
ifeq ($(dep_check),0)
1094 1095 1096
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1097
endif
1098 1099
endif

1100
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1101
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1102 1103 1104 1105 1106
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1107 1108
endif

1109
ifdef SANE_TOOL_PATH
1110 1111
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1112 1113
PATH := $(SANE_TOOL_PATH):${PATH}
else
1114
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1115 1116
endif

1117 1118 1119 1120 1121 1122
ifeq (,$(HOST_CPU))
	BASIC_CFLAGS += -DGIT_HOST_CPU="\"$(firstword $(subst -, ,$(uname_M)))\""
else
	BASIC_CFLAGS += -DGIT_HOST_CPU="\"$(HOST_CPU)\""
endif

G
Gary V. Vaughan 已提交
1123 1124 1125 1126
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1127 1128 1129 1130
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1131 1132 1133 1134 1135 1136 1137 1138
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

1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151
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
1152
	ifndef NO_APPLE_COMMON_CRYPTO
1153
		NO_OPENSSL = YesPlease
1154 1155 1156
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1157
	NO_REGEX = YesPlease
1158
	PTHREAD_LIBS =
1159 1160
endif

1161 1162 1163 1164 1165 1166 1167 1168
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
1169 1170
endif

1171 1172 1173 1174 1175
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

1176 1177 1178 1179 1180
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 已提交
1181
	endif
1182 1183

	BASIC_CFLAGS += -DUSE_LIBPCRE1
M
Michał Kiedrowicz 已提交
1184
	EXTLIBS += -lpcre
1185 1186 1187 1188

ifdef NO_LIBPCRE1_JIT
	BASIC_CFLAGS += -DNO_LIBPCRE1_JIT
endif
M
Michał Kiedrowicz 已提交
1189 1190
endif

1191 1192 1193 1194 1195 1196 1197 1198
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 已提交
1199 1200
endif

K
Kirill Smelkov 已提交
1201 1202 1203 1204
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1205
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1206
IMAP_SEND_LDFLAGS =
1207

D
Daniel Barkalow 已提交
1208 1209
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1210 1211 1212
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1213
else
1214
	ifdef CURLDIR
1215 1216 1217
		# 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
1218
	else
1219
		CURL_LIBCURL = -lcurl
1220
	endif
1221 1222 1223 1224
	ifdef NEEDS_SSL_WITH_CURL
		CURL_LIBCURL += -lssl
		ifdef NEEDS_CRYPTO_WITH_SSL
			CURL_LIBCURL += -lcrypto
1225 1226
		endif
	endif
1227 1228 1229
	ifdef NEEDS_IDN_WITH_CURL
		CURL_LIBCURL += -lidn
	endif
1230

1231 1232 1233
	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)
1234 1235
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1236
	curl_check := $(shell (echo 070908; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1237 1238
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1239
			PROGRAM_OBJS += http-push.o
1240
		endif
1241
	endif
1242
	curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1243 1244 1245 1246 1247 1248 1249 1250
	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
1251
	ifndef NO_EXPAT
1252 1253 1254 1255 1256 1257
		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 已提交
1258 1259 1260
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1261
	endif
1262
endif
R
Remi Pommarel 已提交
1263
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
1264

1265 1266
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1267
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1268 1269 1270
endif
EXTLIBS += -lz

P
Petr Baudis 已提交
1271
ifndef NO_OPENSSL
J
Junio C Hamano 已提交
1272
	OPENSSL_LIBSSL = -lssl
J
Junio C Hamano 已提交
1273
	ifdef OPENSSLDIR
1274
		BASIC_CFLAGS += -I$(OPENSSLDIR)/include
1275
		OPENSSL_LINK = -L$(OPENSSLDIR)/$(lib) $(CC_LD_DYNPATH)$(OPENSSLDIR)/$(lib)
J
Junio C Hamano 已提交
1276 1277 1278
	else
		OPENSSL_LINK =
	endif
1279
	ifdef NEEDS_CRYPTO_WITH_SSL
1280
		OPENSSL_LIBSSL += -lcrypto
1281
	endif
P
Petr Baudis 已提交
1282
else
1283
	BASIC_CFLAGS += -DNO_OPENSSL
J
Junio C Hamano 已提交
1284
	OPENSSL_LIBSSL =
P
Petr Baudis 已提交
1285
endif
1286 1287 1288
ifdef NO_OPENSSL
	LIB_4_CRYPTO =
else
1289
ifdef NEEDS_SSL_WITH_CRYPTO
J
Junio C Hamano 已提交
1290
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -lssl
1291
else
J
Junio C Hamano 已提交
1292
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto
1293
endif
1294 1295 1296
ifdef APPLE_COMMON_CRYPTO
	LIB_4_CRYPTO += -framework Security -framework CoreFoundation
endif
1297
endif
1298
ifdef NEEDS_LIBICONV
J
Junio C Hamano 已提交
1299
	ifdef ICONVDIR
1300
		BASIC_CFLAGS += -I$(ICONVDIR)/include
1301
		ICONV_LINK = -L$(ICONVDIR)/$(lib) $(CC_LD_DYNPATH)$(ICONVDIR)/$(lib)
J
Junio C Hamano 已提交
1302 1303 1304
	else
		ICONV_LINK =
	endif
J
Joachim Schmitz 已提交
1305 1306 1307
	ifdef NEEDS_LIBINTL_BEFORE_LIBICONV
		ICONV_LINK += -lintl
	endif
1308
	EXTLIBS += $(ICONV_LINK) -liconv
1309
endif
1310 1311 1312
ifdef NEEDS_LIBGEN
	EXTLIBS += -lgen
endif
1313 1314 1315 1316 1317
ifndef NO_GETTEXT
ifndef LIBC_CONTAINS_LIBINTL
	EXTLIBS += -lintl
endif
endif
1318
ifdef NEEDS_SOCKET
1319
	EXTLIBS += -lsocket
1320
endif
1321
ifdef NEEDS_NSL
1322
	EXTLIBS += -lnsl
1323
endif
1324 1325 1326
ifdef NEEDS_RESOLV
	EXTLIBS += -lresolv
endif
1327
ifdef NO_D_TYPE_IN_DIRENT
1328
	BASIC_CFLAGS += -DNO_D_TYPE_IN_DIRENT
1329
endif
1330 1331 1332
ifdef NO_GECOS_IN_PWENT
	BASIC_CFLAGS += -DNO_GECOS_IN_PWENT
endif
1333 1334 1335
ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
	BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT
endif
1336 1337 1338
ifdef USE_NSEC
	BASIC_CFLAGS += -DUSE_NSEC
endif
1339 1340 1341
ifdef USE_ST_TIMESPEC
	BASIC_CFLAGS += -DUSE_ST_TIMESPEC
endif
J
Junio C Hamano 已提交
1342 1343 1344
ifdef NO_NORETURN
	BASIC_CFLAGS += -DNO_NORETURN
endif
1345 1346 1347
ifdef NO_NSEC
	BASIC_CFLAGS += -DNO_NSEC
endif
1348 1349 1350 1351
ifdef SNPRINTF_RETURNS_BOGUS
	COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS
	COMPAT_OBJS += compat/snprintf.o
endif
1352 1353 1354 1355
ifdef FREAD_READS_DIRECTORIES
	COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES
	COMPAT_OBJS += compat/fopen.o
endif
1356
ifdef NO_SYMLINK_HEAD
1357
	BASIC_CFLAGS += -DNO_SYMLINK_HEAD
1358
endif
1359 1360 1361
ifdef GETTEXT_POISON
	BASIC_CFLAGS += -DGETTEXT_POISON
endif
1362 1363
ifdef NO_GETTEXT
	BASIC_CFLAGS += -DNO_GETTEXT
1364
	USE_GETTEXT_SCHEME ?= fallthrough
1365
endif
1366 1367 1368 1369 1370
ifdef NO_POLL
	NO_SYS_POLL_H = YesPlease
	COMPAT_CFLAGS += -DNO_POLL -Icompat/poll
	COMPAT_OBJS += compat/poll/poll.o
endif
1371
ifdef NO_STRCASESTR
1372
	COMPAT_CFLAGS += -DNO_STRCASESTR
J
Jason Riedy 已提交
1373 1374
	COMPAT_OBJS += compat/strcasestr.o
endif
1375 1376 1377 1378
ifdef NO_STRLCPY
	COMPAT_CFLAGS += -DNO_STRLCPY
	COMPAT_OBJS += compat/strlcpy.o
endif
1379 1380
ifdef NO_STRTOUMAX
	COMPAT_CFLAGS += -DNO_STRTOUMAX
1381
	COMPAT_OBJS += compat/strtoumax.o compat/strtoimax.o
1382 1383 1384 1385
endif
ifdef NO_STRTOULL
	COMPAT_CFLAGS += -DNO_STRTOULL
endif
J
Jason Riedy 已提交
1386
ifdef NO_SETENV
1387
	COMPAT_CFLAGS += -DNO_SETENV
J
Jason Riedy 已提交
1388
	COMPAT_OBJS += compat/setenv.o
1389
endif
1390 1391 1392 1393
ifdef NO_MKDTEMP
	COMPAT_CFLAGS += -DNO_MKDTEMP
	COMPAT_OBJS += compat/mkdtemp.o
endif
1394 1395 1396 1397
ifdef MKDIR_WO_TRAILING_SLASH
	COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH
	COMPAT_OBJS += compat/mkdir.o
endif
J
Johannes Schindelin 已提交
1398
ifdef NO_UNSETENV
J
Jason Riedy 已提交
1399 1400 1401
	COMPAT_CFLAGS += -DNO_UNSETENV
	COMPAT_OBJS += compat/unsetenv.o
endif
1402 1403 1404
ifdef NO_SYS_SELECT_H
	BASIC_CFLAGS += -DNO_SYS_SELECT_H
endif
1405 1406 1407
ifdef NO_SYS_POLL_H
	BASIC_CFLAGS += -DNO_SYS_POLL_H
endif
1408 1409
ifdef NEEDS_SYS_PARAM_H
	BASIC_CFLAGS += -DNEEDS_SYS_PARAM_H
1410
endif
1411 1412 1413 1414 1415 1416
ifdef NO_INTTYPES_H
	BASIC_CFLAGS += -DNO_INTTYPES_H
endif
ifdef NO_INITGROUPS
	BASIC_CFLAGS += -DNO_INITGROUPS
endif
1417
ifdef NO_MMAP
1418
	COMPAT_CFLAGS += -DNO_MMAP
J
Jason Riedy 已提交
1419
	COMPAT_OBJS += compat/mmap.o
J
Janos Laube 已提交
1420 1421 1422 1423 1424
else
	ifdef USE_WIN32_MMAP
		COMPAT_CFLAGS += -DUSE_WIN32_MMAP
		COMPAT_OBJS += compat/win32mmap.o
	endif
1425
endif
1426 1427 1428
ifdef MMAP_PREVENTS_DELETE
	BASIC_CFLAGS += -DMMAP_PREVENTS_DELETE
endif
1429 1430
ifdef OBJECT_CREATION_USES_RENAMES
	COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1
1431
endif
1432 1433
ifdef NO_STRUCT_ITIMERVAL
	COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL
1434
	NO_SETITIMER = YesPlease
1435 1436 1437 1438
endif
ifdef NO_SETITIMER
	COMPAT_CFLAGS += -DNO_SETITIMER
endif
1439 1440 1441 1442
ifdef NO_PREAD
	COMPAT_CFLAGS += -DNO_PREAD
	COMPAT_OBJS += compat/pread.o
endif
1443 1444 1445
ifdef NO_FAST_WORKING_DIRECTORY
	BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
endif
1446 1447 1448
ifdef NO_TRUSTABLE_FILEMODE
	BASIC_CFLAGS += -DNO_TRUSTABLE_FILEMODE
endif
1449 1450 1451 1452
ifdef NEEDS_MODE_TRANSLATION
	COMPAT_CFLAGS += -DNEEDS_MODE_TRANSLATION
	COMPAT_OBJS += compat/stat.o
endif
1453
ifdef NO_IPV6
1454
	BASIC_CFLAGS += -DNO_IPV6
1455
endif
J
Joachim Schmitz 已提交
1456 1457 1458
ifdef NO_INTPTR_T
	COMPAT_CFLAGS += -DNO_INTPTR_T
endif
1459 1460 1461
ifdef NO_UINTMAX_T
	BASIC_CFLAGS += -Duintmax_t=uint32_t
endif
1462 1463
ifdef NO_SOCKADDR_STORAGE
ifdef NO_IPV6
1464
	BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in
1465
else
1466
	BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in6
1467
endif
1468
endif
1469 1470
ifdef NO_INET_NTOP
	LIB_OBJS += compat/inet_ntop.o
1471
	BASIC_CFLAGS += -DNO_INET_NTOP
1472
endif
1473 1474
ifdef NO_INET_PTON
	LIB_OBJS += compat/inet_pton.o
1475
	BASIC_CFLAGS += -DNO_INET_PTON
1476
endif
1477 1478 1479 1480 1481
ifndef NO_UNIX_SOCKETS
	LIB_OBJS += unix-socket.o
	PROGRAM_OBJS += credential-cache.o
	PROGRAM_OBJS += credential-cache--daemon.o
endif
1482

1483
ifdef NO_ICONV
1484
	BASIC_CFLAGS += -DNO_ICONV
1485 1486
endif

1487 1488 1489 1490
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1491 1492 1493 1494
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1495 1496 1497 1498
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1499 1500 1501 1502 1503
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

1504 1505 1506
ifdef OPENSSL_SHA1
	EXTLIBS += $(LIB_4_CRYPTO)
	BASIC_CFLAGS += -DSHA1_OPENSSL
J
Jeff King 已提交
1507
else
1508 1509
ifdef BLK_SHA1
	LIB_OBJS += block-sha1/sha1.o
1510
	BASIC_CFLAGS += -DSHA1_BLK
1511
else
1512 1513
ifdef PPC_SHA1
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1514
	BASIC_CFLAGS += -DSHA1_PPC
1515 1516 1517
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
1518
	BASIC_CFLAGS += -DSHA1_APPLE
1519
else
1520
	DC_SHA1 := YesPlease
1521 1522
	BASIC_CFLAGS += -DSHA1_DC
	LIB_OBJS += sha1dc_git.o
1523 1524
ifdef DC_SHA1_EXTERNAL
	ifdef DC_SHA1_SUBMODULE
1525
		ifneq ($(DC_SHA1_SUBMODULE),auto)
1526
$(error Only set DC_SHA1_EXTERNAL or DC_SHA1_SUBMODULE, not both)
1527
		endif
1528 1529 1530 1531
	endif
	BASIC_CFLAGS += -DDC_SHA1_EXTERNAL
	EXTLIBS += -lsha1detectcoll
else
1532 1533 1534 1535 1536
ifdef DC_SHA1_SUBMODULE
	LIB_OBJS += sha1collisiondetection/lib/sha1.o
	LIB_OBJS += sha1collisiondetection/lib/ubc_check.o
	BASIC_CFLAGS += -DDC_SHA1_SUBMODULE
else
1537 1538
	LIB_OBJS += sha1dc/sha1.o
	LIB_OBJS += sha1dc/ubc_check.o
1539
endif
1540 1541 1542 1543 1544
	BASIC_CFLAGS += \
		-DSHA1DC_NO_STANDARD_INCLUDES \
		-DSHA1DC_INIT_SAFE_HASH_DEFAULT=0 \
		-DSHA1DC_CUSTOM_INCLUDE_SHA1_C="\"cache.h\"" \
		-DSHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C="\"git-compat-util.h\""
1545 1546 1547
endif
endif
endif
1548
endif
1549
endif
1550

1551 1552 1553 1554
ifdef SHA1_MAX_BLOCK_SIZE
	LIB_OBJS += compat/sha1-chunked.o
	BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
1555 1556 1557 1558
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1559 1560 1561 1562
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1563 1564 1565
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1566 1567 1568 1569
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
R
René Scharfe 已提交
1570 1571 1572 1573 1574
ifdef HAVE_ISO_QSORT_S
	COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S
else
	COMPAT_OBJS += compat/qsort_s.o
endif
1575 1576 1577
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1578

J
Junio C Hamano 已提交
1579 1580 1581
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1582
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1583
	EXTLIBS += $(PTHREAD_LIBS)
1584
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1585
endif
1586

1587 1588 1589 1590
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1591 1592
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1593
	EXTLIBS += $(CHARSET_LIB)
1594 1595
endif

1596 1597 1598 1599
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1600 1601 1602 1603
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1604 1605 1606
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1607 1608 1609
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1610 1611 1612 1613
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1614 1615 1616
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1617

1618
ifdef USE_NED_ALLOCATOR
1619 1620 1621 1622 1623 1624 1625 1626
	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
1627 1628
endif

1629 1630 1631 1632
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1633 1634 1635 1636
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1637 1638 1639 1640 1641
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1642 1643 1644 1645
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1646 1647 1648 1649
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1650 1651 1652 1653
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1654 1655 1656 1657
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1658 1659 1660 1661
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1662
ifeq ($(TCLTK_PATH),)
1663
NO_TCLTK = NoThanks
1664 1665
endif

1666
ifeq ($(PERL_PATH),)
1667
NO_PERL = NoThanks
1668 1669
endif

1670
ifeq ($(PYTHON_PATH),)
1671
NO_PYTHON = NoThanks
1672 1673
endif

1674 1675 1676 1677
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1678
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1679 1680
QUIET_SUBDIR1  =

1681
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1682 1683 1684 1685 1686
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1687
ifneq ($(findstring s,$(MAKEFLAGS)),s)
S
Shawn O. Pearce 已提交
1688
ifndef V
A
Alex Riesen 已提交
1689
	QUIET_CC       = @echo '   ' CC $@;
1690 1691 1692 1693
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1694
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1695
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1696
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1697
	QUIET_GCOV     = @echo '   ' GCOV $@;
1698
	QUIET_SP       = @echo '   ' SP $<;
1699
	QUIET_RC       = @echo '   ' RC $@;
1700
	QUIET_SUBDIR0  = +@subdir=
1701 1702
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1703
	export V
A
Alex Riesen 已提交
1704
	export QUIET_GEN
1705 1706
	export QUIET_BUILT_IN
endif
1707
endif
1708

J
Junio C Hamano 已提交
1709 1710 1711 1712
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1713 1714 1715 1716 1717 1718 1719
### profile feedback build
#

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

1720
ifeq ("$(PROFILE)","GEN")
1721
	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
1722
	EXTLIBS += -lgcov
1723 1724
	export CCACHE_DISABLE = t
	V = 1
1725 1726
else
ifneq ("$(PROFILE)","")
1727
	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1728 1729
	export CCACHE_DISABLE = t
	V = 1
1730
endif
1731
endif
1732

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

1735
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1736
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1737 1738 1739

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1740
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1741
mandir_SQ = $(subst ','\'',$(mandir))
1742 1743
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1744
perllibdir_SQ = $(subst ','\'',$(perllibdir))
1745
localedir_SQ = $(subst ','\'',$(localedir))
1746 1747
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
1748
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1749
prefix_SQ = $(subst ','\'',$(prefix))
1750
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1751 1752

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
J
Jeff King 已提交
1753
TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
1754
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1755
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1756
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1757
DIFF_SQ = $(subst ','\'',$(DIFF))
1758
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1759

1760 1761 1762 1763 1764 1765 1766 1767 1768
# 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)
1769

1770
BASIC_CFLAGS += $(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1771
LIB_OBJS += $(COMPAT_OBJS)
1772

1773 1774 1775 1776 1777 1778 1779 1780 1781
# 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

1782 1783 1784 1785 1786 1787 1788
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

1789 1790 1791 1792 1793 1794 1795
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 已提交
1796 1797 1798
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))
1799 1800 1801 1802
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 已提交
1803

1804 1805 1806 1807
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1808 1809 1810 1811 1812
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)'

1813 1814 1815
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1816
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1817 1818


P
Petr Baudis 已提交
1819 1820
### Build rules

1821 1822
SHELL = $(SHELL_PATH)

1823 1824 1825
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
1826 1827 1828 1829
all:: profile
endif

profile:: profile-clean
1830 1831
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
1832 1833 1834 1835 1836
	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
		$(MAKE) PROFILE=GEN -j1 perf; \
	else \
		echo "Skipping profile of perf tests..."; \
	fi
1837 1838 1839 1840 1841 1842 1843
	$(MAKE) PROFILE=USE all

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

1844 1845

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
1846
ifneq (,$X)
1847
	$(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';)
1848
endif
1849

1850
all::
E
Eygene Ryabinkin 已提交
1851
ifndef NO_TCLTK
1852
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1853
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
1854
endif
1855
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1856

1857 1858 1859 1860 1861
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 已提交
1862
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
1863
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
1864

1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897
### 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.

1898
git.sp git.s git.o: GIT-PREFIX
1899
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1900 1901 1902
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1903

1904
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1905 1906
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
		$(filter %.o,$^) $(LIBS)
1907

1908
help.sp help.s help.o: common-cmds.h
1909

1910
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1911
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1912 1913 1914
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1915

1916
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1917
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1918
	'-DGIT_VERSION="$(GIT_VERSION)"' \
1919 1920 1921
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)' \
	'-DGIT_BUILT_FROM_COMMIT="$(shell GIT_CEILING_DIRECTORIES=\"$(CURDIR)/..\" \
		git rev-parse -q --verify HEAD || :)"'
1922

J
Junio C Hamano 已提交
1923
$(BUILT_INS): git$X
1924
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
1925 1926 1927
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
1928

1929
common-cmds.h: generate-cmdlist.sh command-list.txt
1930

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

1934
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
1935
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
1936 1937
	$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV):\
	$(perllibdir_SQ)
1938 1939 1940 1941
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
1942
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
1943
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
1944
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
1945
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
1946
    -e $(BROKEN_PATH_FIX) \
1947 1948
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
1949
    -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
1950
    -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
1951 1952 1953
    $@.sh >$@+
endef

1954 1955 1956
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
1957
		echo >&2 "    * new script parameters"; \
1958 1959 1960 1961
		echo "$$FLAGS" >$@; \
            fi


1962
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
1963
	$(QUIET_GEN)$(cmd_munge_script) && \
1964
	chmod +x $@+ && \
1965
	mv $@+ $@
1966

1967
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1968 1969 1970
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1971
git.res: git.rc GIT-VERSION-FILE
1972
	$(QUIET_RC)$(RC) \
1973 1974
	  $(join -DMAJOR= -DMINOR= -DMICRO= -DPATCHLEVEL=, $(wordlist 1, 4, \
	    $(shell echo $(GIT_VERSION) 0 0 0 0 | tr '.a-zA-Z-' ' '))) \
S
Steven Penny 已提交
1975
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
1976

1977
# This makes sure we depend on the NO_PERL setting itself.
1978
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
1979

1980
ifndef NO_PERL
1981
$(SCRIPT_PERL_GEN):
1982

1983 1984
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ):$(perllibdir_SQ)
$(SCRIPT_PERL_GEN): % : %.perl GIT-PERL-DEFINES GIT-VERSION-FILE
1985
	$(QUIET_GEN)$(RM) $@ $@+ && \
1986
	INSTLIBDIR='$(perllibdir_SQ)' && \
1987 1988
	INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \
	INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \
1989 1990 1991
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
	    -e '	h' \
1992
	    -e '	s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'"));=' \
1993 1994 1995
	    -e '	H' \
	    -e '	x' \
	    -e '}' \
1996
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
1997
	    $< >$@+ && \
1998
	chmod +x $@+ && \
1999
	mv $@+ $@
2000

2001 2002 2003 2004 2005 2006 2007
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

2008 2009 2010 2011 2012

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

2013
git-instaweb: git-instaweb.sh GIT-SCRIPT-DEFINES
2014
	$(QUIET_GEN)$(cmd_munge_script) && \
2015
	chmod +x $@+ && \
2016
	mv $@+ $@
2017
else # NO_PERL
2018
$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh
2019 2020 2021 2022 2023 2024 2025
	$(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
2026

2027 2028 2029
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

2030
ifndef NO_PYTHON
F
Felipe Contreras 已提交
2031 2032
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
2033
	$(QUIET_GEN)$(RM) $@ $@+ && \
2034
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
2035
	    $< >$@+ && \
2036 2037 2038
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
2039
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
2040 2041 2042 2043 2044 2045 2046 2047
	$(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

2048 2049 2050 2051 2052 2053
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+

2054
configure: configure.ac GIT-VERSION-FILE
2055
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
2056

2057
ifdef AUTOCONFIGURED
2058 2059 2060 2061 2062 2063
# 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
2064
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
2065
	if test -f config.status; then \
2066 2067 2068 2069 2070 2071 2072 2073 2074
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

2075 2076 2077 2078 2079 2080
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
2081
XDIFF_OBJS += xdiff/xhistogram.o
2082 2083

VCSSVN_OBJS += vcs-svn/line_buffer.o
2084
VCSSVN_OBJS += vcs-svn/sliding_window.o
2085
VCSSVN_OBJS += vcs-svn/fast_export.o
2086
VCSSVN_OBJS += vcs-svn/svndiff.o
2087 2088
VCSSVN_OBJS += vcs-svn/svndump.o

2089
TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS)) $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))
2090 2091 2092
OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
	$(XDIFF_OBJS) \
	$(VCSSVN_OBJS) \
2093
	common-main.o \
2094 2095 2096 2097
	git.o
ifndef NO_CURL
	OBJECTS += http.o http-walker.o remote-curl.o
endif
2098

2099
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
2100
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
2101

2102
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2103
$(dep_dirs):
2104
	@mkdir -p $@
2105 2106

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
2107
dep_file = $(dir $@).depend/$(notdir $@).d
2108
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
2109 2110
endif

2111
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
2112 2113
dep_dirs =
missing_dep_dirs =
2114 2115 2116 2117 2118 2119 2120
dep_args =
endif

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

2121 2122
.SUFFIXES:

2123
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
2124
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2125
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
2126
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2127

2128
%.s: %.c GIT-CFLAGS FORCE
2129
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2130 2131

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
2132 2133
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
2134 2135 2136
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
2137 2138 2139 2140 2141 2142 2143 2144
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 已提交
2145

2146
$(OBJECTS): $(LIB_H)
2147
endif
2148

2149
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
2150
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
2151 2152 2153
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
2154

2155
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2156
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2157
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2158

2159
config.sp config.s config.o: GIT-PREFIX
2160 2161
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2162

2163
attr.sp attr.s attr.o: GIT-PREFIX
2164 2165
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2166

2167
gettext.sp gettext.s gettext.o: GIT-PREFIX
2168 2169 2170
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2171
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SPARSE_FLAGS += \
2172 2173
	-DCURL_DISABLE_TYPECHECK

2174 2175
pack-revindex.sp: SPARSE_FLAGS += -Wno-memcpy-max-count

2176
ifdef NO_EXPAT
2177
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2178 2179
endif

2180
ifdef NO_REGEX
2181 2182
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2183 2184
endif

2185
ifdef USE_NED_ALLOCATOR
2186
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2187
	-DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
2188
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2189 2190
endif

2191
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2192
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2193

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

2198
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2199
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2200
		$(CURL_LIBCURL) $(LIBS)
2201
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2202
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2203
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2204

2205 2206 2207 2208
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)

2209 2210 2211 2212 2213 2214
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

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

P
Petr Baudis 已提交
2219
$(LIB_FILE): $(LIB_OBJS)
2220
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2221

2222
$(XDIFF_LIB): $(XDIFF_OBJS)
2223
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2224

J
Jonathan Nieder 已提交
2225
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2226
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2227

2228 2229
export DEFAULT_EDITOR DEFAULT_PAGER

2230 2231
.PHONY: doc man man-perl html info pdf
doc: man-perl
P
Petr Baudis 已提交
2232 2233
	$(MAKE) -C Documentation all

2234
man: man-perl
2235 2236
	$(MAKE) -C Documentation man

2237 2238
man-perl: perl/build/man/man3/Git.3pm

2239 2240 2241
html:
	$(MAKE) -C Documentation html

2242 2243 2244
info:
	$(MAKE) -C Documentation info

2245 2246 2247
pdf:
	$(MAKE) -C Documentation pdf

2248 2249
XGETTEXT_FLAGS = \
	--force-po \
2250
	--add-comments=TRANSLATORS: \
2251 2252
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2253 2254
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2255 2256
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2257
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
2258
	--keyword=__ --keyword=N__ --keyword="__n:1,2"
2259
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2260 2261
LOCALIZED_SH = $(SCRIPT_SH)
LOCALIZED_SH += git-parse-remote.sh
2262
LOCALIZED_SH += git-rebase--interactive.sh
2263
LOCALIZED_SH += git-sh-setup.sh
2264
LOCALIZED_PERL = $(SCRIPT_PERL)
2265 2266 2267 2268 2269 2270

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

2272 2273 2274 2275 2276 2277 2278 2279
## 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.

2280
po/git.pot: $(GENERATED_H) FORCE
2281 2282 2283 2284 2285 2286 2287 2288 2289 2290
	# 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

2291 2292 2293
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2294 2295
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2296 2297 2298

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

E
Elia Pinto 已提交
2301
.PHONY: pot
2302 2303
pot: po/git.pot

2304 2305 2306 2307 2308 2309 2310 2311 2312 2313
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 $@ $<

2314 2315
LIB_PERL := $(wildcard perl/Git.pm perl/Git/*.pm perl/Git/*/*.pm perl/Git/*/*/*.pm)
LIB_PERL_GEN := $(patsubst perl/%.pm,perl/build/lib/%.pm,$(LIB_PERL))
2316 2317
LIB_CPAN := $(wildcard perl/FromCPAN/*.pm perl/FromCPAN/*/*.pm)
LIB_CPAN_GEN := $(patsubst perl/%.pm,perl/build/lib/%.pm,$(LIB_CPAN))
2318 2319

ifndef NO_PERL
2320
all:: $(LIB_PERL_GEN)
2321
ifndef NO_PERL_CPAN_FALLBACKS
2322
all:: $(LIB_CPAN_GEN)
2323
endif
2324
NO_PERL_CPAN_FALLBACKS_SQ = $(subst ','\'',$(NO_PERL_CPAN_FALLBACKS))
2325 2326
endif

2327
perl/build/lib/%.pm: perl/%.pm
2328
	$(QUIET_GEN)mkdir -p $(dir $@) && \
2329 2330 2331
	sed -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
	    -e 's|@@NO_PERL_CPAN_FALLBACKS@@|$(NO_PERL_CPAN_FALLBACKS_SQ)|g' \
	< $< > $@
2332 2333 2334 2335 2336

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

J
Jeff King 已提交
2337
FIND_SOURCE_FILES = ( \
2338 2339
	git ls-files \
		'*.[hcS]' \
2340
		'*.sh' \
2341
		':!*[tp][0-9][0-9][0-9][0-9]*' \
2342
		':!contrib' \
2343
		2>/dev/null || \
J
Jeff King 已提交
2344 2345
	$(FIND) . \
		\( -name .git -type d -prune \) \
2346
		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
2347
		-o \( -name contrib -type d -prune \) \
2348 2349
		-o \( -name build -type d -prune \) \
		-o \( -name 'trash*' -type d -prune \) \
J
Jeff King 已提交
2350
		-o \( -name '*.[hcS]' -type f -print \) \
2351
		-o \( -name '*.sh' -type f -print \) \
J
Jeff King 已提交
2352
	)
2353

2354 2355
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2356
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2357

2358
tags: FORCE
2359
	$(RM) tags
2360
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2361

K
Kristof Provost 已提交
2362 2363
cscope:
	$(RM) cscope*
2364
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2365

2366
### Detect prefix changes
2367 2368 2369 2370 2371 2372
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 \
2373
		echo >&2 "    * new prefix flags"; \
2374 2375 2376 2377
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2379
GIT-CFLAGS: FORCE
2380 2381
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2382
		echo >&2 "    * new build flags"; \
2383 2384 2385
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2386 2387 2388 2389 2390
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2395 2396 2397
# 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".
2398
GIT-BUILD-OPTIONS: FORCE
2399
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@+
J
Jeff King 已提交
2400
	@echo TEST_SHELL_PATH=\''$(subst ','\'',$(TEST_SHELL_PATH_SQ))'\' >>$@+
2401 2402 2403 2404 2405
	@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)))'\' >>$@+
2406
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2407 2408
	@echo USE_LIBPCRE1=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE1)))'\' >>$@+
	@echo USE_LIBPCRE2=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE2)))'\' >>$@+
2409
	@echo NO_LIBPCRE1_JIT=\''$(subst ','\'',$(subst ','\'',$(NO_LIBPCRE1_JIT)))'\' >>$@+
2410
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
2411
	@echo NO_PTHREADS=\''$(subst ','\'',$(subst ','\'',$(NO_PTHREADS)))'\' >>$@+
2412 2413
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
2414
	@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
2415
	@echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
2416
ifdef TEST_OUTPUT_DIRECTORY
2417
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2418
endif
2419
ifdef GIT_TEST_OPTS
2420
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2421
endif
2422
ifdef GIT_TEST_CMP
2423
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2424 2425
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2426
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2427
endif
2428 2429
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@+
2430
ifdef GIT_PERF_REPEAT_COUNT
2431
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2432 2433
endif
ifdef GIT_PERF_REPO
2434
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2435 2436
endif
ifdef GIT_PERF_LARGE_REPO
2437
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2438 2439
endif
ifdef GIT_PERF_MAKE_OPTS
2440
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2441
endif
2442 2443 2444
ifdef GIT_PERF_MAKE_COMMAND
	@echo GIT_PERF_MAKE_COMMAND=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_COMMAND)))'\' >>$@+
endif
2445 2446 2447
ifdef GIT_INTEROP_MAKE_OPTS
	@echo GIT_INTEROP_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_INTEROP_MAKE_OPTS)))'\' >>$@+
endif
2448
ifdef TEST_GIT_INDEX_VERSION
2449
	@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
2450
endif
2451
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2452

2453 2454 2455
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2456

2457 2458
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2459
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2460
		echo >&2 "    * new Python interpreter location"; \
2461 2462 2463 2464
		echo "$$VARS" >$@; \
            fi
endif

2465 2466 2467
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2468
all:: $(NO_INSTALL)
2469 2470 2471 2472 2473

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

2477 2478 2479 2480
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2481
export NO_SVN_TESTS
2482
export TEST_NO_MALLOC_CHECK
2483

2484 2485
### Testing rules

2486
test: all
P
Petr Baudis 已提交
2487 2488
	$(MAKE) -C t/ all

2489 2490 2491 2492 2493
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

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

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

2498
.PRECIOUS: $(TEST_OBJS)
2499

2500 2501
t/helper/test-tool$X: $(patsubst %,t/helper/%,$(TEST_BUILTINS_OBJS))

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

2505
check-sha1:: t/helper/test-tool$X
2506
	t/helper/test-sha1.sh
2507

2508 2509 2510 2511 2512 2513 2514 2515 2516
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)

2517 2518 2519 2520
.PHONY: style
style:
	git clang-format --style file --diff --extensions c,h

2521
check: common-cmds.h
2522
	@if sparse; \
2523
	then \
2524
		echo >&2 "Use 'make sparse' instead"; \
2525
		$(MAKE) --no-print-directory sparse; \
2526
	else \
2527
		echo >&2 "Did you mean 'make test'?"; \
2528 2529
		exit 1; \
	fi
P
Petr Baudis 已提交
2530

R
René Scharfe 已提交
2531 2532 2533
C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
%.cocci.patch: %.cocci $(C_SOURCES)
	@echo '    ' SPATCH $<; \
2534
	ret=0; \
R
René Scharfe 已提交
2535
	for f in $(C_SOURCES); do \
2536 2537 2538 2539 2540 2541 2542 2543 2544
		$(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 已提交
2545 2546 2547 2548 2549 2550
	if test -s $@; \
	then \
		echo '    ' SPATCH result: $@; \
	fi
coccicheck: $(patsubst %.cocci,%.cocci.patch,$(wildcard contrib/coccinelle/*.cocci))

P
Petr Baudis 已提交
2551 2552
### Installation rules

2553
ifneq ($(filter /%,$(firstword $(template_dir))),)
2554
template_instdir = $(template_dir)
2555 2556
else
template_instdir = $(prefix)/$(template_dir)
2557 2558 2559
endif
export template_instdir

2560
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2561
gitexec_instdir = $(gitexecdir)
2562 2563
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2564 2565 2566 2567
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2568 2569 2570 2571 2572 2573 2574
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2575 2576
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2577
.PHONY: profile-install profile-fast-install
2578 2579 2580 2581 2582 2583
profile-install: profile
	$(MAKE) install

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

2584
install: all
2585
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2586 2587
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2588
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2589
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2590
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2591
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2592
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2593 2594 2595 2596 2597
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
2598
ifndef NO_PERL
2599 2600 2601
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perllibdir_SQ)'
	(cd perl/build/lib && $(TAR) cf - .) | \
	(cd '$(DESTDIR_SQ)$(perllibdir_SQ)' && umask 022 && $(TAR) xof -)
J
Junio C Hamano 已提交
2602
	$(MAKE) -C gitweb install
2603
endif
E
Eygene Ryabinkin 已提交
2604
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2605
	$(MAKE) -C gitk-git install
2606
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2607
endif
2608
ifneq (,$X)
2609
	$(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';)
2610
endif
2611

2612
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2613
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2614
	{ test "$$bindir/" = "$$execdir/" || \
2615 2616
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2617
		test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
2618 2619 2620 2621
		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
	  done; \
	} && \
2622 2623
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
J
Junio C Hamano 已提交
2624
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2625 2626 2627 2628
		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 && \
2629
	for p in $(BUILT_INS); do \
2630
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2631
		test -z "$(NO_INSTALL_HARDLINKS)" && \
J
Jeff King 已提交
2632 2633 2634
		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; \
2635
	done && \
2636 2637
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2638
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2639
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2640 2641 2642
		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; \
2643
	done && \
2644
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2645

2646
.PHONY: install-gitweb install-doc install-man install-man-perl install-html install-info install-pdf
E
Elia Pinto 已提交
2647
.PHONY: quick-install-doc quick-install-man quick-install-html
2648 2649 2650
install-gitweb:
	$(MAKE) -C gitweb install

2651
install-doc: install-man-perl
P
Petr Baudis 已提交
2652 2653
	$(MAKE) -C Documentation install

2654
install-man: install-man-perl
2655 2656
	$(MAKE) -C Documentation install-man

2657
install-man-perl: man-perl
2658 2659 2660 2661
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mandir_SQ)/man3'
	(cd perl/build/man/man3 && $(TAR) cf - .) | \
	(cd '$(DESTDIR_SQ)$(mandir_SQ)/man3' && umask 022 && $(TAR) xof -)

2662 2663 2664
install-html:
	$(MAKE) -C Documentation install-html

2665 2666 2667
install-info:
	$(MAKE) -C Documentation install-info

2668 2669 2670
install-pdf:
	$(MAKE) -C Documentation install-pdf

2671 2672
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2673

2674 2675 2676
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2677 2678 2679
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2680 2681 2682 2683


### Maintainer's dist rules

2684
GIT_TARNAME = git-$(GIT_VERSION)
2685
dist: git-archive$(X) configure
2686 2687
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2688
	@mkdir -p $(GIT_TARNAME)
2689
	@cp configure $(GIT_TARNAME)
2690
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2691
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2692
	$(TAR) rf $(GIT_TARNAME).tar \
2693
		$(GIT_TARNAME)/configure \
2694
		$(GIT_TARNAME)/version \
2695
		$(GIT_TARNAME)/git-gui/version
2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710
ifdef DC_SHA1_SUBMODULE
	@mkdir -p $(GIT_TARNAME)/sha1collisiondetection/lib
	@cp sha1collisiondetection/LICENSE.txt \
		$(GIT_TARNAME)/sha1collisiondetection/
	@cp sha1collisiondetection/LICENSE.txt \
		$(GIT_TARNAME)/sha1collisiondetection/
	@cp sha1collisiondetection/lib/sha1.[ch] \
		$(GIT_TARNAME)/sha1collisiondetection/lib/
	@cp sha1collisiondetection/lib/ubc_check.[ch] \
		$(GIT_TARNAME)/sha1collisiondetection/lib/
	$(TAR) rf $(GIT_TARNAME).tar \
		$(GIT_TARNAME)/sha1collisiondetection/LICENSE.txt \
		$(GIT_TARNAME)/sha1collisiondetection/lib/sha1.[ch] \
		$(GIT_TARNAME)/sha1collisiondetection/lib/ubc_check.[ch]
endif
2711
	@$(RM) -r $(GIT_TARNAME)
2712
	gzip -f -9 $(GIT_TARNAME).tar
2713

2714 2715 2716 2717
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2718

2719 2720
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
2721
.PHONY: dist-doc distclean
2722
dist-doc:
2723
	$(RM) -r .doc-tmp-dir
2724 2725 2726 2727 2728
	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
	:
2729
	$(RM) -r .doc-tmp-dir
2730
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2731
	$(MAKE) -C Documentation DESTDIR=./ \
2732
		man1dir=../.doc-tmp-dir/man1 \
2733
		man5dir=../.doc-tmp-dir/man5 \
2734
		man7dir=../.doc-tmp-dir/man7 \
2735 2736 2737
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2738
	$(RM) -r .doc-tmp-dir
2739

P
Petr Baudis 已提交
2740
### Cleaning rules
2741

2742 2743
distclean: clean
	$(RM) configure
2744 2745 2746
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2747

2748 2749 2750 2751
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

2752
clean: profile-clean coverage-clean
2753 2754
	$(RM) *.res
	$(RM) $(OBJECTS)
2755
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2756
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2757
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
2758
	$(RM) -r bin-wrappers $(dep_dirs)
2759
	$(RM) -r po/build/
2760
	$(RM) *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
2761 2762 2763
	$(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 已提交
2764
	$(RM) contrib/coccinelle/*.cocci.patch*
2765
	$(MAKE) -C Documentation/ clean
2766
ifndef NO_PERL
2767
	$(MAKE) -C gitweb clean
2768
	$(RM) -r perl/build/
2769
endif
P
Petr Baudis 已提交
2770
	$(MAKE) -C templates/ clean
2771
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2772
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2773
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2774 2775
	$(MAKE) -C git-gui clean
endif
2776
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2777 2778
	$(RM) GIT-USER-AGENT GIT-PREFIX
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PYTHON-VARS
2779

2780
.PHONY: all install profile-clean clean strip
2781
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2782
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2783

J
Junio C Hamano 已提交
2784 2785
### Check documentation
#
J
Jeff King 已提交
2786 2787 2788 2789
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2790
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
2791 2792

.PHONY: check-docs
J
Junio C Hamano 已提交
2793
check-docs::
2794
	$(MAKE) -C Documentation lint-docs
J
Jeff King 已提交
2795
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2796 2797 2798
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2799
		git-merge-resolve | git-merge-subtree | \
2800
		git-fsck-objects | git-init-db | \
2801
		git-remote-* | git-stage | \
2802
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2803 2804 2805
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
2806
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
2807
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2808 2809 2810 2811
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2812 2813
	done; \
	( \
2814 2815
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
2816
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2817
		    -e 's/^/listed /' command-list.txt; \
2818 2819
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2820 2821 2822 2823
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2824
		case " $(ALL_COMMANDS) " in \
2825 2826 2827 2828
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2829 2830 2831 2832 2833

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

2835 2836
### Test suite coverage testing
#
2837
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
2838
.PHONY: coverage-untested-functions cover_db cover_db_html
2839
.PHONY: coverage-clean-results
2840 2841

coverage:
2842
	$(MAKE) coverage-test
2843
	$(MAKE) coverage-untested-functions
2844

2845
object_dirs := $(sort $(dir $(OBJECTS)))
2846
coverage-clean-results:
2847 2848 2849
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2850
	$(RM) -r cover_db/
2851
	$(RM) -r cover_db_html/
2852

2853 2854 2855
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2856 2857
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2858
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2859

2860
coverage-compile:
2861
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2862 2863

coverage-test: coverage-clean-results coverage-compile
2864
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2865
		DEFAULT_TEST_TARGET=test -j1 test
2866 2867

coverage-report:
2868
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2869
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2870
	done
2871 2872

coverage-untested-functions: coverage-report
2873 2874
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2875
		> coverage-untested-functions
2876 2877 2878

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2879 2880 2881

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