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

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

388
GIT-VERSION-FILE: FORCE
389
	@$(SHELL_PATH) ./GIT-VERSION-GEN
390
-include GIT-VERSION-FILE
391

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

394
CFLAGS = -g -O2 -Wall
395
DEVELOPER_CFLAGS = -Werror \
396 397 398 399 400 401 402 403
	-Wdeclaration-after-statement \
	-Wno-format-zero-length \
	-Wold-style-definition \
	-Woverflow \
	-Wpointer-arith \
	-Wstrict-prototypes \
	-Wunused \
	-Wvla
J
Junio C Hamano 已提交
404
LDFLAGS =
405
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
406
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
407
STRIP ?= strip
408

409 410 411
# Create as necessary, replace existing, make ranlib unneeded.
ARFLAGS = rcs

412 413 414
# Among the variables below, these:
#   gitexecdir
#   template_dir
415
#   sysconfdir
416 417
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
418
# runtime figures out where they are based on the path to the executable.
419 420 421 422 423
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
424 425
# This can help installing the suite in a relocatable way.

426
prefix = $(HOME)
427 428
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
429 430
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
431
gitexecdir = libexec/git-core
432
mergetoolsdir = $(gitexecdir)/mergetools
433
sharedir = $(prefix)/share
434
gitwebdir = $(sharedir)/gitweb
435
localedir = $(sharedir)/locale
436
template_dir = share/git-core/templates
437
htmldir = $(prefix)/share/doc/git-doc
438
ETC_GITCONFIG = $(sysconfdir)/gitconfig
439
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
440
lib = lib
441
# DESTDIR =
442
pathsep = :
443

444 445 446 447
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

448
export prefix bindir sharedir sysconfdir gitwebdir localedir
449

450
CC = cc
451
AR = ar
452
RM = rm -f
453
DIFF = diff
454
TAR = tar
455
FIND = find
456
INSTALL = install
457
TCL_PATH = tclsh
458
TCLTK_PATH = wish
459
XGETTEXT = xgettext
460
MSGFMT = msgfmt
461
CURL_CONFIG = curl-config
462
PTHREAD_LIBS = -lpthread
463
PTHREAD_CFLAGS =
464
GCOV = gcov
R
René Scharfe 已提交
465
SPATCH = spatch
466

467 468
export TCL_PATH TCLTK_PATH

469
SPARSE_FLAGS =
470
SPATCH_FLAGS = --all-includes
471

P
Petr Baudis 已提交
472 473 474 475


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

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

482 483 484 485 486
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
487 488
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
489
GENERATED_H =
490
EXTRA_CPPFLAGS =
491
LIB_OBJS =
492
PROGRAM_OBJS =
493 494
PROGRAMS =
SCRIPT_PERL =
495
SCRIPT_PYTHON =
496
SCRIPT_SH =
497
SCRIPT_LIB =
498
TEST_PROGRAMS_NEED_X =
499

J
Jonathan Nieder 已提交
500 501 502 503 504 505
# 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

506
SCRIPT_SH += git-bisect.sh
507
SCRIPT_SH += git-difftool--helper.sh
508 509 510 511 512 513 514
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
515
SCRIPT_SH += git-remote-testgit.sh
516 517 518 519 520
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

521 522
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
523 524 525
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
526
SCRIPT_LIB += git-sh-setup
527
SCRIPT_LIB += git-sh-i18n
528

529
SCRIPT_PERL += git-add--interactive.perl
530
SCRIPT_PERL += git-difftool.perl
531 532 533 534 535 536 537
SCRIPT_PERL += git-archimport.perl
SCRIPT_PERL += git-cvsexportcommit.perl
SCRIPT_PERL += git-cvsimport.perl
SCRIPT_PERL += git-cvsserver.perl
SCRIPT_PERL += git-relink.perl
SCRIPT_PERL += git-send-email.perl
SCRIPT_PERL += git-svn.perl
538

P
Pete Wyckoff 已提交
539
SCRIPT_PYTHON += git-p4.py
540

541
NO_INSTALL += git-remote-testgit
542

543 544 545 546 547
# 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))

548 549 550 551
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))

552 553 554 555 556 557 558 559 560
# 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
561
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
562
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
563
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
564
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
565
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
566
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
567 568 569 570 571 572 573 574 575

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

576 577 578
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
579
	  git-instaweb
580

581 582
ETAGS_TARGET = TAGS

583 584
# Empty...
EXTRA_PROGRAMS =
585

586 587
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
588

589
PROGRAM_OBJS += credential-store.o
590
PROGRAM_OBJS += daemon.o
591
PROGRAM_OBJS += fast-import.o
592
PROGRAM_OBJS += http-backend.o
593
PROGRAM_OBJS += imap-send.o
594
PROGRAM_OBJS += sh-i18n--envsubst.o
595 596 597
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
598
PROGRAM_OBJS += remote-testsvn.o
599

600 601 602
# Binary suffix, set to .exe for Windows builds
X =

603
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
604

605 606
TEST_PROGRAMS_NEED_X += test-chmtime
TEST_PROGRAMS_NEED_X += test-ctype
607
TEST_PROGRAMS_NEED_X += test-config
608 609 610
TEST_PROGRAMS_NEED_X += test-date
TEST_PROGRAMS_NEED_X += test-delta
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
611
TEST_PROGRAMS_NEED_X += test-dump-split-index
612
TEST_PROGRAMS_NEED_X += test-dump-untracked-cache
J
Johannes Schindelin 已提交
613
TEST_PROGRAMS_NEED_X += test-fake-ssh
614
TEST_PROGRAMS_NEED_X += test-genrandom
615
TEST_PROGRAMS_NEED_X += test-hashmap
J
Jeff King 已提交
616
TEST_PROGRAMS_NEED_X += test-index-version
617
TEST_PROGRAMS_NEED_X += test-lazy-init-name-hash
D
David Barr 已提交
618
TEST_PROGRAMS_NEED_X += test-line-buffer
619
TEST_PROGRAMS_NEED_X += test-match-trees
R
René Scharfe 已提交
620
TEST_PROGRAMS_NEED_X += test-mergesort
J
Jeff King 已提交
621
TEST_PROGRAMS_NEED_X += test-mktemp
622 623
TEST_PROGRAMS_NEED_X += test-parse-options
TEST_PROGRAMS_NEED_X += test-path-utils
624
TEST_PROGRAMS_NEED_X += test-prio-queue
625
TEST_PROGRAMS_NEED_X += test-read-cache
626
TEST_PROGRAMS_NEED_X += test-regex
627
TEST_PROGRAMS_NEED_X += test-revision-walking
628
TEST_PROGRAMS_NEED_X += test-run-command
629
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
630
TEST_PROGRAMS_NEED_X += test-sha1
631
TEST_PROGRAMS_NEED_X += test-sha1-array
632
TEST_PROGRAMS_NEED_X += test-sigchain
633
TEST_PROGRAMS_NEED_X += test-string-list
634
TEST_PROGRAMS_NEED_X += test-submodule-config
635
TEST_PROGRAMS_NEED_X += test-subprocess
D
David Barr 已提交
636
TEST_PROGRAMS_NEED_X += test-svn-fe
637
TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
638
TEST_PROGRAMS_NEED_X += test-wildmatch
639

640
TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
641

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

BUILT_INS += git-cherry$X
647
BUILT_INS += git-cherry-pick$X
648 649 650 651 652
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 已提交
653
BUILT_INS += git-stage$X
654 655
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
656

657 658
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
659
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
660

E
Eygene Ryabinkin 已提交
661
# what 'all' will build but not install in gitexecdir
662
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
663

664 665 666 667 668 669 670 671 672
# 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

673 674 675 676 677 678 679
# 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
680 681 682
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
683

L
Luben Tuikov 已提交
684
export PERL_PATH
685
export PYTHON_PATH
L
Luben Tuikov 已提交
686

687 688 689
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
690

J
Jeff King 已提交
691
GENERATED_H += common-cmds.h
692

693 694 695 696 697
LIB_H = $(shell $(FIND) . \
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
	-name '*.h' -print)
698

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

863
BUILTIN_OBJS += builtin/add.o
864
BUILTIN_OBJS += builtin/am.o
865 866 867 868 869 870 871 872 873
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 已提交
874
BUILTIN_OBJS += builtin/check-ignore.o
875
BUILTIN_OBJS += builtin/check-mailmap.o
876 877 878 879 880
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
881
BUILTIN_OBJS += builtin/column.o
882 883 884 885
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
886
BUILTIN_OBJS += builtin/credential.o
887 888 889 890 891 892 893 894 895 896 897 898
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
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
899
BUILTIN_OBJS += builtin/get-tar-commit-id.o
900 901 902 903 904
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
905
BUILTIN_OBJS += builtin/interpret-trailers.o
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922
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 已提交
923
BUILTIN_OBJS += builtin/notes.o
924 925 926 927 928 929
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 已提交
930
BUILTIN_OBJS += builtin/pull.o
931 932 933 934 935
BUILTIN_OBJS += builtin/push.o
BUILTIN_OBJS += builtin/read-tree.o
BUILTIN_OBJS += builtin/receive-pack.o
BUILTIN_OBJS += builtin/reflog.o
BUILTIN_OBJS += builtin/remote.o
I
Ilari Liusvaara 已提交
936
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
937
BUILTIN_OBJS += builtin/remote-fd.o
938
BUILTIN_OBJS += builtin/repack.o
939 940 941 942 943 944 945 946 947 948 949 950
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
951
BUILTIN_OBJS += builtin/submodule--helper.o
952 953 954 955 956 957 958 959 960
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
961
BUILTIN_OBJS += builtin/verify-commit.o
962 963
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
964
BUILTIN_OBJS += builtin/worktree.o
965
BUILTIN_OBJS += builtin/write-tree.o
966

967
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
968
EXTLIBS =
969

J
Jeff King 已提交
970 971
GIT_USER_AGENT = git/$(GIT_VERSION)

972
include config.mak.uname
973
-include config.mak.autogen
974
-include config.mak
975

976
ifdef DEVELOPER
977
CFLAGS += $(DEVELOPER_CFLAGS)
978 979
endif

980 981 982 983 984 985 986 987
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

988
ifndef COMPUTE_HEADER_DEPENDENCIES
989 990 991 992
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
993
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
994 995
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
996
	echo $$?)
997
ifeq ($(dep_check),0)
998 999 1000
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1001
endif
1002 1003
endif

1004
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1005
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1006 1007 1008 1009 1010
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1011 1012
endif

1013
ifdef SANE_TOOL_PATH
1014 1015
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1016 1017
PATH := $(SANE_TOOL_PATH):${PATH}
else
1018
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1019 1020
endif

G
Gary V. Vaughan 已提交
1021 1022 1023 1024
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1025 1026 1027 1028
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1029 1030 1031 1032 1033 1034 1035 1036
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

1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
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
1050
	ifndef NO_APPLE_COMMON_CRYPTO
1051
		NO_OPENSSL = YesPlease
1052 1053 1054
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1055
	NO_REGEX = YesPlease
1056
	PTHREAD_LIBS =
1057 1058
endif

1059 1060 1061 1062 1063 1064 1065 1066
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
1067 1068
endif

1069 1070 1071 1072 1073
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

M
Michał Kiedrowicz 已提交
1074 1075 1076 1077 1078 1079 1080 1081 1082
ifdef USE_LIBPCRE
	BASIC_CFLAGS += -DUSE_LIBPCRE
	ifdef LIBPCREDIR
		BASIC_CFLAGS += -I$(LIBPCREDIR)/include
		EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
	endif
	EXTLIBS += -lpcre
endif

K
Kirill Smelkov 已提交
1083 1084 1085 1086
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1087
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1088
IMAP_SEND_LDFLAGS =
1089

D
Daniel Barkalow 已提交
1090 1091
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1092 1093 1094
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1095
else
1096
	ifdef CURLDIR
1097 1098 1099
		# 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
1100
	else
1101
		CURL_LIBCURL = -lcurl
1102
	endif
1103 1104 1105 1106
	ifdef NEEDS_SSL_WITH_CURL
		CURL_LIBCURL += -lssl
		ifdef NEEDS_CRYPTO_WITH_SSL
			CURL_LIBCURL += -lcrypto
1107 1108
		endif
	endif
1109 1110 1111
	ifdef NEEDS_IDN_WITH_CURL
		CURL_LIBCURL += -lidn
	endif
1112

1113 1114 1115
	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)
1116 1117
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1118
	curl_check := $(shell (echo 070908; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1119 1120
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1121
			PROGRAM_OBJS += http-push.o
1122
		endif
1123
	endif
1124
	curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1125 1126 1127 1128 1129 1130 1131 1132
	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
1133
	ifndef NO_EXPAT
1134 1135 1136 1137 1138 1139
		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 已提交
1140 1141 1142
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1143
	endif
1144
endif
R
Remi Pommarel 已提交
1145
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
1146

1147 1148
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1149
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1150 1151 1152
endif
EXTLIBS += -lz

P
Petr Baudis 已提交
1153
ifndef NO_OPENSSL
J
Junio C Hamano 已提交
1154
	OPENSSL_LIBSSL = -lssl
J
Junio C Hamano 已提交
1155
	ifdef OPENSSLDIR
1156
		BASIC_CFLAGS += -I$(OPENSSLDIR)/include
1157
		OPENSSL_LINK = -L$(OPENSSLDIR)/$(lib) $(CC_LD_DYNPATH)$(OPENSSLDIR)/$(lib)
J
Junio C Hamano 已提交
1158 1159 1160
	else
		OPENSSL_LINK =
	endif
1161
	ifdef NEEDS_CRYPTO_WITH_SSL
1162
		OPENSSL_LIBSSL += -lcrypto
1163
	endif
P
Petr Baudis 已提交
1164
else
1165
	BASIC_CFLAGS += -DNO_OPENSSL
1166
	BLK_SHA1 = 1
J
Junio C Hamano 已提交
1167
	OPENSSL_LIBSSL =
P
Petr Baudis 已提交
1168
endif
1169 1170 1171
ifdef NO_OPENSSL
	LIB_4_CRYPTO =
else
1172
ifdef NEEDS_SSL_WITH_CRYPTO
J
Junio C Hamano 已提交
1173
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -lssl
1174
else
J
Junio C Hamano 已提交
1175
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto
1176
endif
1177 1178 1179
ifdef APPLE_COMMON_CRYPTO
	LIB_4_CRYPTO += -framework Security -framework CoreFoundation
endif
1180
endif
1181
ifdef NEEDS_LIBICONV
J
Junio C Hamano 已提交
1182
	ifdef ICONVDIR
1183
		BASIC_CFLAGS += -I$(ICONVDIR)/include
1184
		ICONV_LINK = -L$(ICONVDIR)/$(lib) $(CC_LD_DYNPATH)$(ICONVDIR)/$(lib)
J
Junio C Hamano 已提交
1185 1186 1187
	else
		ICONV_LINK =
	endif
J
Joachim Schmitz 已提交
1188 1189 1190
	ifdef NEEDS_LIBINTL_BEFORE_LIBICONV
		ICONV_LINK += -lintl
	endif
1191
	EXTLIBS += $(ICONV_LINK) -liconv
1192
endif
1193 1194 1195
ifdef NEEDS_LIBGEN
	EXTLIBS += -lgen
endif
1196 1197 1198 1199 1200
ifndef NO_GETTEXT
ifndef LIBC_CONTAINS_LIBINTL
	EXTLIBS += -lintl
endif
endif
1201
ifdef NEEDS_SOCKET
1202
	EXTLIBS += -lsocket
1203
endif
1204
ifdef NEEDS_NSL
1205
	EXTLIBS += -lnsl
1206
endif
1207 1208 1209
ifdef NEEDS_RESOLV
	EXTLIBS += -lresolv
endif
1210
ifdef NO_D_TYPE_IN_DIRENT
1211
	BASIC_CFLAGS += -DNO_D_TYPE_IN_DIRENT
1212
endif
1213 1214 1215
ifdef NO_GECOS_IN_PWENT
	BASIC_CFLAGS += -DNO_GECOS_IN_PWENT
endif
1216 1217 1218
ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
	BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT
endif
1219 1220 1221
ifdef USE_NSEC
	BASIC_CFLAGS += -DUSE_NSEC
endif
1222 1223 1224
ifdef USE_ST_TIMESPEC
	BASIC_CFLAGS += -DUSE_ST_TIMESPEC
endif
J
Junio C Hamano 已提交
1225 1226 1227
ifdef NO_NORETURN
	BASIC_CFLAGS += -DNO_NORETURN
endif
1228 1229 1230
ifdef NO_NSEC
	BASIC_CFLAGS += -DNO_NSEC
endif
1231 1232 1233 1234
ifdef SNPRINTF_RETURNS_BOGUS
	COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS
	COMPAT_OBJS += compat/snprintf.o
endif
1235 1236 1237 1238
ifdef FREAD_READS_DIRECTORIES
	COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES
	COMPAT_OBJS += compat/fopen.o
endif
1239
ifdef NO_SYMLINK_HEAD
1240
	BASIC_CFLAGS += -DNO_SYMLINK_HEAD
1241
endif
1242 1243 1244
ifdef GETTEXT_POISON
	BASIC_CFLAGS += -DGETTEXT_POISON
endif
1245 1246
ifdef NO_GETTEXT
	BASIC_CFLAGS += -DNO_GETTEXT
1247
	USE_GETTEXT_SCHEME ?= fallthrough
1248
endif
1249 1250 1251 1252 1253
ifdef NO_POLL
	NO_SYS_POLL_H = YesPlease
	COMPAT_CFLAGS += -DNO_POLL -Icompat/poll
	COMPAT_OBJS += compat/poll/poll.o
endif
1254
ifdef NO_STRCASESTR
1255
	COMPAT_CFLAGS += -DNO_STRCASESTR
J
Jason Riedy 已提交
1256 1257
	COMPAT_OBJS += compat/strcasestr.o
endif
1258 1259 1260 1261
ifdef NO_STRLCPY
	COMPAT_CFLAGS += -DNO_STRLCPY
	COMPAT_OBJS += compat/strlcpy.o
endif
1262 1263
ifdef NO_STRTOUMAX
	COMPAT_CFLAGS += -DNO_STRTOUMAX
1264
	COMPAT_OBJS += compat/strtoumax.o compat/strtoimax.o
1265 1266 1267 1268
endif
ifdef NO_STRTOULL
	COMPAT_CFLAGS += -DNO_STRTOULL
endif
J
Jason Riedy 已提交
1269
ifdef NO_SETENV
1270
	COMPAT_CFLAGS += -DNO_SETENV
J
Jason Riedy 已提交
1271
	COMPAT_OBJS += compat/setenv.o
1272
endif
1273 1274 1275 1276
ifdef NO_MKDTEMP
	COMPAT_CFLAGS += -DNO_MKDTEMP
	COMPAT_OBJS += compat/mkdtemp.o
endif
1277 1278 1279 1280
ifdef MKDIR_WO_TRAILING_SLASH
	COMPAT_CFLAGS += -DMKDIR_WO_TRAILING_SLASH
	COMPAT_OBJS += compat/mkdir.o
endif
1281 1282 1283
ifdef NO_MKSTEMPS
	COMPAT_CFLAGS += -DNO_MKSTEMPS
endif
J
Johannes Schindelin 已提交
1284
ifdef NO_UNSETENV
J
Jason Riedy 已提交
1285 1286 1287
	COMPAT_CFLAGS += -DNO_UNSETENV
	COMPAT_OBJS += compat/unsetenv.o
endif
1288 1289 1290
ifdef NO_SYS_SELECT_H
	BASIC_CFLAGS += -DNO_SYS_SELECT_H
endif
1291 1292 1293
ifdef NO_SYS_POLL_H
	BASIC_CFLAGS += -DNO_SYS_POLL_H
endif
1294 1295
ifdef NEEDS_SYS_PARAM_H
	BASIC_CFLAGS += -DNEEDS_SYS_PARAM_H
1296
endif
1297 1298 1299 1300 1301 1302
ifdef NO_INTTYPES_H
	BASIC_CFLAGS += -DNO_INTTYPES_H
endif
ifdef NO_INITGROUPS
	BASIC_CFLAGS += -DNO_INITGROUPS
endif
1303
ifdef NO_MMAP
1304
	COMPAT_CFLAGS += -DNO_MMAP
J
Jason Riedy 已提交
1305
	COMPAT_OBJS += compat/mmap.o
J
Janos Laube 已提交
1306 1307 1308 1309 1310
else
	ifdef USE_WIN32_MMAP
		COMPAT_CFLAGS += -DUSE_WIN32_MMAP
		COMPAT_OBJS += compat/win32mmap.o
	endif
1311
endif
1312 1313
ifdef OBJECT_CREATION_USES_RENAMES
	COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1
1314
endif
1315 1316
ifdef NO_STRUCT_ITIMERVAL
	COMPAT_CFLAGS += -DNO_STRUCT_ITIMERVAL
1317
	NO_SETITIMER = YesPlease
1318 1319 1320 1321
endif
ifdef NO_SETITIMER
	COMPAT_CFLAGS += -DNO_SETITIMER
endif
1322 1323 1324 1325
ifdef NO_PREAD
	COMPAT_CFLAGS += -DNO_PREAD
	COMPAT_OBJS += compat/pread.o
endif
1326 1327 1328
ifdef NO_FAST_WORKING_DIRECTORY
	BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
endif
1329 1330 1331
ifdef NO_TRUSTABLE_FILEMODE
	BASIC_CFLAGS += -DNO_TRUSTABLE_FILEMODE
endif
1332 1333 1334 1335
ifdef NEEDS_MODE_TRANSLATION
	COMPAT_CFLAGS += -DNEEDS_MODE_TRANSLATION
	COMPAT_OBJS += compat/stat.o
endif
1336
ifdef NO_IPV6
1337
	BASIC_CFLAGS += -DNO_IPV6
1338
endif
J
Joachim Schmitz 已提交
1339 1340 1341
ifdef NO_INTPTR_T
	COMPAT_CFLAGS += -DNO_INTPTR_T
endif
1342 1343 1344
ifdef NO_UINTMAX_T
	BASIC_CFLAGS += -Duintmax_t=uint32_t
endif
1345 1346
ifdef NO_SOCKADDR_STORAGE
ifdef NO_IPV6
1347
	BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in
1348
else
1349
	BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in6
1350
endif
1351
endif
1352 1353
ifdef NO_INET_NTOP
	LIB_OBJS += compat/inet_ntop.o
1354
	BASIC_CFLAGS += -DNO_INET_NTOP
1355
endif
1356 1357
ifdef NO_INET_PTON
	LIB_OBJS += compat/inet_pton.o
1358
	BASIC_CFLAGS += -DNO_INET_PTON
1359
endif
1360 1361 1362 1363 1364
ifndef NO_UNIX_SOCKETS
	LIB_OBJS += unix-socket.o
	PROGRAM_OBJS += credential-cache.o
	PROGRAM_OBJS += credential-cache--daemon.o
endif
1365

1366
ifdef NO_ICONV
1367
	BASIC_CFLAGS += -DNO_ICONV
1368 1369
endif

1370 1371 1372 1373
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1374 1375 1376 1377
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1378 1379 1380 1381
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1382 1383 1384 1385 1386
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

1387 1388 1389 1390
ifdef BLK_SHA1
	SHA1_HEADER = "block-sha1/sha1.h"
	LIB_OBJS += block-sha1/sha1.o
else
1391 1392 1393
ifdef PPC_SHA1
	SHA1_HEADER = "ppc/sha1.h"
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1394 1395 1396 1397
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
	SHA1_HEADER = <CommonCrypto/CommonDigest.h>
1398 1399
else
	SHA1_HEADER = <openssl/sha.h>
1400
	EXTLIBS += $(LIB_4_CRYPTO)
1401 1402
endif
endif
1403 1404
endif

1405 1406 1407 1408
ifdef SHA1_MAX_BLOCK_SIZE
	LIB_OBJS += compat/sha1-chunked.o
	BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
1409 1410 1411
ifdef NO_PERL_MAKEMAKER
	export NO_PERL_MAKEMAKER
endif
1412 1413 1414 1415
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1416 1417 1418 1419
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1420 1421 1422
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1423 1424 1425 1426
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
1427 1428 1429
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1430

J
Junio C Hamano 已提交
1431 1432 1433
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1434
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1435
	EXTLIBS += $(PTHREAD_LIBS)
1436
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1437
endif
1438

1439 1440 1441 1442
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1443 1444
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1445
	EXTLIBS += $(CHARSET_LIB)
1446 1447
endif

1448 1449 1450 1451
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1452 1453 1454 1455
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1456 1457 1458
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1459 1460 1461
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1462 1463 1464 1465
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1466 1467 1468
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1469

1470
ifdef USE_NED_ALLOCATOR
1471 1472 1473 1474 1475 1476 1477 1478
	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
1479 1480
endif

1481 1482 1483 1484
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1485 1486 1487 1488
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1489 1490 1491 1492
ifneq (,$(XDL_FAST_HASH))
	BASIC_CFLAGS += -DXDL_FAST_HASH
endif

1493 1494 1495 1496 1497
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1498 1499 1500 1501
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1502 1503 1504 1505
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1506 1507 1508 1509
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1510 1511 1512 1513
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1514 1515 1516 1517
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1518
ifeq ($(TCLTK_PATH),)
1519
NO_TCLTK = NoThanks
1520 1521
endif

1522
ifeq ($(PERL_PATH),)
1523
NO_PERL = NoThanks
1524 1525
endif

1526
ifeq ($(PYTHON_PATH),)
1527
NO_PYTHON = NoThanks
1528 1529
endif

1530 1531 1532 1533
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1534
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1535 1536
QUIET_SUBDIR1  =

1537
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1538 1539 1540 1541 1542
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1543
ifneq ($(findstring s,$(MAKEFLAGS)),s)
S
Shawn O. Pearce 已提交
1544
ifndef V
A
Alex Riesen 已提交
1545
	QUIET_CC       = @echo '   ' CC $@;
1546 1547 1548 1549
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1550
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1551
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1552
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1553
	QUIET_GCOV     = @echo '   ' GCOV $@;
1554
	QUIET_SP       = @echo '   ' SP $<;
1555
	QUIET_RC       = @echo '   ' RC $@;
1556
	QUIET_SUBDIR0  = +@subdir=
1557 1558
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1559
	export V
A
Alex Riesen 已提交
1560
	export QUIET_GEN
1561 1562
	export QUIET_BUILT_IN
endif
1563
endif
1564

J
Junio C Hamano 已提交
1565 1566 1567 1568
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1569 1570 1571 1572 1573 1574 1575
### profile feedback build
#

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

1576
ifeq ("$(PROFILE)","GEN")
1577
	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
1578
	EXTLIBS += -lgcov
1579 1580
	export CCACHE_DISABLE = t
	V = 1
1581 1582
else
ifneq ("$(PROFILE)","")
1583
	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1584 1585
	export CCACHE_DISABLE = t
	V = 1
1586
endif
1587
endif
1588

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

SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
1592
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1593
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1594 1595 1596

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1597
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1598 1599
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1600
localedir_SQ = $(subst ','\'',$(localedir))
1601 1602
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
1603
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1604
prefix_SQ = $(subst ','\'',$(prefix))
1605
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1606 1607 1608

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1609
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1610
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1611
DIFF_SQ = $(subst ','\'',$(DIFF))
1612
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1613

1614 1615 1616 1617 1618 1619 1620 1621 1622
# 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)
1623

1624
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
1625
	$(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1626
LIB_OBJS += $(COMPAT_OBJS)
1627

1628 1629 1630 1631 1632 1633 1634 1635 1636
# 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

1637 1638 1639 1640 1641 1642 1643
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

1644 1645 1646 1647 1648 1649 1650
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 已提交
1651 1652 1653
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))
1654 1655 1656 1657
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 已提交
1658

1659 1660 1661 1662
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1663 1664 1665 1666 1667
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)'

1668 1669 1670
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1671
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1672 1673


P
Petr Baudis 已提交
1674 1675
### Build rules

1676 1677
SHELL = $(SHELL_PATH)

1678 1679 1680
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
1681 1682 1683 1684
all:: profile
endif

profile:: profile-clean
1685 1686
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
1687 1688 1689 1690 1691
	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
		$(MAKE) PROFILE=GEN -j1 perf; \
	else \
		echo "Skipping profile of perf tests..."; \
	fi
1692 1693 1694 1695 1696 1697 1698
	$(MAKE) PROFILE=USE all

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

1699 1700

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
1701
ifneq (,$X)
1702
	$(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';)
1703
endif
1704

1705
all::
E
Eygene Ryabinkin 已提交
1706
ifndef NO_TCLTK
1707
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1708
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
E
Eygene Ryabinkin 已提交
1709
endif
1710
ifndef NO_PERL
1711
	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' localedir='$(localedir_SQ)' all
1712
endif
1713
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1714

1715 1716 1717 1718 1719
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 已提交
1720
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
1721
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
1722

1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
### 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.

1756
git.sp git.s git.o: GIT-PREFIX
1757
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1758 1759 1760
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1761

1762
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1763 1764
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
		$(filter %.o,$^) $(LIBS)
1765

1766
help.sp help.s help.o: common-cmds.h
1767

1768
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1769
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1770 1771 1772
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1773

1774
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1775
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1776 1777
	'-DGIT_VERSION="$(GIT_VERSION)"' \
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
1778

J
Junio C Hamano 已提交
1779
$(BUILT_INS): git$X
1780
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
1781 1782 1783
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
1784

1785
common-cmds.h: generate-cmdlist.sh command-list.txt
1786

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

1790
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
1791
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
1792
	$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV)
1793 1794 1795 1796
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
1797
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
1798
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
1799
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
1800
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
1801
    -e $(BROKEN_PATH_FIX) \
1802 1803
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
1804
    -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
1805
    -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
1806 1807 1808
    $@.sh >$@+
endef

1809 1810 1811
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
1812
		echo >&2 "    * new script parameters"; \
1813 1814 1815 1816
		echo "$$FLAGS" >$@; \
            fi


1817
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
1818
	$(QUIET_GEN)$(cmd_munge_script) && \
1819
	chmod +x $@+ && \
1820
	mv $@+ $@
1821

1822
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1823 1824 1825
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1826
git.res: git.rc GIT-VERSION-FILE
1827
	$(QUIET_RC)$(RC) \
1828
	  $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
1829 1830
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@

1831
# This makes sure we depend on the NO_PERL setting itself.
1832
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
1833

1834
ifndef NO_PERL
1835
$(SCRIPT_PERL_GEN): perl/perl.mak
1836

1837 1838 1839
perl/perl.mak: perl/PM.stamp

perl/PM.stamp: FORCE
1840
	@$(FIND) perl -type f -name '*.pm' | sort >$@+ && \
1841 1842 1843
	{ cmp $@+ $@ >/dev/null 2>/dev/null || mv $@+ $@; } && \
	$(RM) $@+

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

1847
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ)
1848
$(SCRIPT_PERL_GEN): % : %.perl perl/perl.mak GIT-PERL-DEFINES GIT-VERSION-FILE
1849
	$(QUIET_GEN)$(RM) $@ $@+ && \
1850
	INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
1851 1852
	INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \
	INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \
1853 1854 1855
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
	    -e '	h' \
1856
	    -e '	s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'"));=' \
1857 1858 1859
	    -e '	H' \
	    -e '	x' \
	    -e '}' \
1860
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
1861
	    $< >$@+ && \
1862
	chmod +x $@+ && \
1863
	mv $@+ $@
1864

1865 1866 1867 1868 1869 1870 1871
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

1872 1873 1874 1875 1876

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

1877
git-instaweb: git-instaweb.sh GIT-SCRIPT-DEFINES
1878
	$(QUIET_GEN)$(cmd_munge_script) && \
1879
	chmod +x $@+ && \
1880
	mv $@+ $@
1881
else # NO_PERL
1882
$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh
1883 1884 1885 1886 1887 1888 1889
	$(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
1890

1891 1892 1893
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

1894
ifndef NO_PYTHON
F
Felipe Contreras 已提交
1895 1896
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
1897
	$(QUIET_GEN)$(RM) $@ $@+ && \
1898
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
1899
	    $< >$@+ && \
1900 1901 1902
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
1903
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
1904 1905 1906 1907 1908 1909 1910 1911
	$(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

1912 1913 1914 1915 1916 1917
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+

1918
configure: configure.ac GIT-VERSION-FILE
1919
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
1920

1921
ifdef AUTOCONFIGURED
1922 1923 1924 1925 1926 1927
# 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
1928
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
1929
	if test -f config.status; then \
1930 1931 1932 1933 1934 1935 1936 1937 1938
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

1939 1940 1941 1942 1943 1944
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
1945
XDIFF_OBJS += xdiff/xhistogram.o
1946 1947

VCSSVN_OBJS += vcs-svn/line_buffer.o
1948
VCSSVN_OBJS += vcs-svn/sliding_window.o
1949 1950
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1951
VCSSVN_OBJS += vcs-svn/svndiff.o
1952 1953
VCSSVN_OBJS += vcs-svn/svndump.o

1954
TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS))
1955 1956 1957
OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
	$(XDIFF_OBJS) \
	$(VCSSVN_OBJS) \
1958
	common-main.o \
1959 1960 1961 1962
	git.o
ifndef NO_CURL
	OBJECTS += http.o http-walker.o remote-curl.o
endif
1963

1964
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1965
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1966

1967
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1968
$(dep_dirs):
1969
	@mkdir -p $@
1970 1971

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
1972
dep_file = $(dir $@).depend/$(notdir $@).d
1973
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
1974 1975
endif

1976
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1977 1978
dep_dirs =
missing_dep_dirs =
1979 1980 1981 1982 1983 1984 1985
dep_args =
endif

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

1986 1987
.SUFFIXES:

1988
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
1989
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1990
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
1991
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1992

1993
%.s: %.c GIT-CFLAGS FORCE
1994
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1995 1996

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
1997 1998
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
1999 2000 2001
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
2002 2003 2004 2005 2006 2007 2008 2009
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 已提交
2010

2011
$(OBJECTS): $(LIB_H)
2012
endif
2013

2014
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
2015
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
2016 2017 2018
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
2019

2020
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2021
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2022
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2023

2024
config.sp config.s config.o: GIT-PREFIX
2025 2026
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2027

2028
attr.sp attr.s attr.o: GIT-PREFIX
2029 2030
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2031

2032
gettext.sp gettext.s gettext.o: GIT-PREFIX
2033 2034 2035
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2036
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SPARSE_FLAGS += \
2037 2038
	-DCURL_DISABLE_TYPECHECK

2039
ifdef NO_EXPAT
2040
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2041 2042
endif

2043
ifdef NO_REGEX
2044 2045
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2046 2047
endif

2048
ifdef USE_NED_ALLOCATOR
2049
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2050
	-DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
2051
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2052 2053
endif

2054
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2055
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2056

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

2061
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2062
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2063
		$(CURL_LIBCURL) $(LIBS)
2064
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2065
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2066
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2067

2068 2069 2070 2071
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)

2072 2073 2074 2075 2076 2077
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

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

P
Petr Baudis 已提交
2082
$(LIB_FILE): $(LIB_OBJS)
2083
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2084

2085
$(XDIFF_LIB): $(XDIFF_OBJS)
2086
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2087

J
Jonathan Nieder 已提交
2088
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2089
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2090

2091 2092
export DEFAULT_EDITOR DEFAULT_PAGER

E
Elia Pinto 已提交
2093
.PHONY: doc man html info pdf
P
Petr Baudis 已提交
2094 2095 2096
doc:
	$(MAKE) -C Documentation all

2097 2098 2099 2100 2101 2102
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

2103 2104 2105
info:
	$(MAKE) -C Documentation info

2106 2107 2108
pdf:
	$(MAKE) -C Documentation pdf

2109 2110
XGETTEXT_FLAGS = \
	--force-po \
2111
	--add-comments=TRANSLATORS: \
2112 2113
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2114 2115
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2116 2117
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2118
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
2119
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2120 2121
LOCALIZED_SH = $(SCRIPT_SH)
LOCALIZED_SH += git-parse-remote.sh
2122
LOCALIZED_SH += git-rebase--interactive.sh
2123
LOCALIZED_SH += git-sh-setup.sh
2124
LOCALIZED_PERL = $(SCRIPT_PERL)
2125 2126 2127 2128 2129 2130

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

2132
po/git.pot: $(GENERATED_H) FORCE
2133 2134 2135
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2136 2137
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2138 2139
	mv $@+ $@

E
Elia Pinto 已提交
2140
.PHONY: pot
2141 2142
pot: po/git.pot

2143 2144 2145 2146 2147 2148 2149 2150 2151 2152
POFILES := $(wildcard po/*.po)
MOFILES := $(patsubst po/%.po,po/build/locale/%/LC_MESSAGES/git.mo,$(POFILES))

ifndef NO_GETTEXT
all:: $(MOFILES)
endif

po/build/locale/%/LC_MESSAGES/git.mo: po/%.po
	$(QUIET_MSGFMT)mkdir -p $(dir $@) && $(MSGFMT) -o $@ $<

J
Jeff King 已提交
2153
FIND_SOURCE_FILES = ( \
2154 2155
	git ls-files \
		'*.[hcS]' \
2156
		'*.sh' \
2157
		':!*[tp][0-9][0-9][0-9][0-9]*' \
2158
		':!contrib' \
2159
		2>/dev/null || \
J
Jeff King 已提交
2160 2161
	$(FIND) . \
		\( -name .git -type d -prune \) \
2162
		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
2163
		-o \( -name contrib -type d -prune \) \
2164 2165
		-o \( -name build -type d -prune \) \
		-o \( -name 'trash*' -type d -prune \) \
J
Jeff King 已提交
2166
		-o \( -name '*.[hcS]' -type f -print \) \
2167
		-o \( -name '*.sh' -type f -print \) \
J
Jeff King 已提交
2168
	)
2169

2170 2171
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2172
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2173

2174
tags: FORCE
2175
	$(RM) tags
2176
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2177

K
Kristof Provost 已提交
2178 2179
cscope:
	$(RM) cscope*
2180
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2181

2182
### Detect prefix changes
2183 2184 2185 2186 2187 2188
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 \
2189
		echo >&2 "    * new prefix flags"; \
2190 2191 2192 2193
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2195
GIT-CFLAGS: FORCE
2196 2197
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2198
		echo >&2 "    * new build flags"; \
2199 2200 2201
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2202 2203 2204 2205 2206
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2211 2212 2213
# 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".
2214
GIT-BUILD-OPTIONS: FORCE
2215 2216 2217 2218 2219 2220
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@+
	@echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@+
	@echo DIFF=\''$(subst ','\'',$(subst ','\'',$(DIFF)))'\' >>$@+
	@echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@+
	@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@+
	@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@+
2221
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2222 2223 2224 2225
	@echo USE_LIBPCRE=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE)))'\' >>$@+
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@+
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@+
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@+
2226
	@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
2227
ifdef TEST_OUTPUT_DIRECTORY
2228
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2229
endif
2230
ifdef GIT_TEST_OPTS
2231
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2232
endif
2233
ifdef GIT_TEST_CMP
2234
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2235 2236
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2237
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2238
endif
2239 2240
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@+
2241
ifdef GIT_PERF_REPEAT_COUNT
2242
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2243 2244
endif
ifdef GIT_PERF_REPO
2245
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2246 2247
endif
ifdef GIT_PERF_LARGE_REPO
2248
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2249 2250
endif
ifdef GIT_PERF_MAKE_OPTS
2251
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2252
endif
2253
ifdef TEST_GIT_INDEX_VERSION
2254
	@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
2255
endif
2256
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2257

2258 2259 2260
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2261

2262 2263
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2264
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2265
		echo >&2 "    * new Python interpreter location"; \
2266 2267 2268 2269
		echo "$$VARS" >$@; \
            fi
endif

2270 2271 2272
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2273
all:: $(NO_INSTALL)
2274 2275 2276 2277 2278

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

2282 2283 2284 2285
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2286
export NO_SVN_TESTS
2287
export TEST_NO_MALLOC_CHECK
2288

2289 2290
### Testing rules

2291
test: all
P
Petr Baudis 已提交
2292 2293
	$(MAKE) -C t/ all

2294 2295 2296 2297 2298
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

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

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

2303
.PRECIOUS: $(TEST_OBJS)
2304

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

2308 2309
check-sha1:: t/helper/test-sha1$X
	t/helper/test-sha1.sh
2310

2311 2312 2313 2314 2315 2316 2317 2318 2319
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)

2320
check: common-cmds.h
2321
	@if sparse; \
2322
	then \
2323
		echo >&2 "Use 'make sparse' instead"; \
2324
		$(MAKE) --no-print-directory sparse; \
2325
	else \
2326
		echo >&2 "Did you mean 'make test'?"; \
2327 2328
		exit 1; \
	fi
P
Petr Baudis 已提交
2329

R
René Scharfe 已提交
2330 2331 2332 2333
C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
%.cocci.patch: %.cocci $(C_SOURCES)
	@echo '    ' SPATCH $<; \
	for f in $(C_SOURCES); do \
2334
		$(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS); \
R
René Scharfe 已提交
2335 2336 2337 2338 2339 2340 2341
	done >$@ 2>$@.log; \
	if test -s $@; \
	then \
		echo '    ' SPATCH result: $@; \
	fi
coccicheck: $(patsubst %.cocci,%.cocci.patch,$(wildcard contrib/coccinelle/*.cocci))

P
Petr Baudis 已提交
2342 2343
### Installation rules

2344
ifneq ($(filter /%,$(firstword $(template_dir))),)
2345
template_instdir = $(template_dir)
2346 2347
else
template_instdir = $(prefix)/$(template_dir)
2348 2349 2350
endif
export template_instdir

2351
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2352
gitexec_instdir = $(gitexecdir)
2353 2354
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2355 2356 2357 2358
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2359 2360 2361 2362 2363 2364 2365
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2366 2367
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2368
.PHONY: profile-install profile-fast-install
2369 2370 2371 2372 2373 2374
profile-install: profile
	$(MAKE) install

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

2375
install: all
2376
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2377 2378
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2379
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2380
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2381
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2382
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2383
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2384 2385 2386 2387 2388
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
2389
ifndef NO_PERL
2390
	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
J
Junio C Hamano 已提交
2391
	$(MAKE) -C gitweb install
2392
endif
E
Eygene Ryabinkin 已提交
2393
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2394
	$(MAKE) -C gitk-git install
2395
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2396
endif
2397
ifneq (,$X)
2398
	$(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';)
2399
endif
2400

2401
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2402
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2403
	{ test "$$bindir/" = "$$execdir/" || \
2404 2405
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2406
		test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
2407 2408 2409 2410
		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
	  done; \
	} && \
2411 2412
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
J
Junio C Hamano 已提交
2413
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2414 2415 2416 2417
		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 && \
2418
	for p in $(BUILT_INS); do \
2419
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2420
		test -z "$(NO_INSTALL_HARDLINKS)" && \
J
Jeff King 已提交
2421 2422 2423
		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; \
2424
	done && \
2425 2426
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2427
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2428
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2429 2430 2431
		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; \
2432
	done && \
2433
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2434

E
Elia Pinto 已提交
2435 2436
.PHONY: install-gitweb install-doc install-man install-html install-info install-pdf
.PHONY: quick-install-doc quick-install-man quick-install-html
2437 2438 2439
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2440 2441 2442
install-doc:
	$(MAKE) -C Documentation install

2443 2444 2445
install-man:
	$(MAKE) -C Documentation install-man

2446 2447 2448
install-html:
	$(MAKE) -C Documentation install-html

2449 2450 2451
install-info:
	$(MAKE) -C Documentation install-info

2452 2453 2454
install-pdf:
	$(MAKE) -C Documentation install-pdf

2455 2456
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2457

2458 2459 2460
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2461 2462 2463
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2464 2465 2466 2467


### Maintainer's dist rules

2468
GIT_TARNAME = git-$(GIT_VERSION)
2469
dist: git-archive$(X) configure
2470 2471
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2472
	@mkdir -p $(GIT_TARNAME)
2473
	@cp configure $(GIT_TARNAME)
2474
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2475
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2476
	$(TAR) rf $(GIT_TARNAME).tar \
2477
		$(GIT_TARNAME)/configure \
2478
		$(GIT_TARNAME)/version \
2479
		$(GIT_TARNAME)/git-gui/version
2480
	@$(RM) -r $(GIT_TARNAME)
2481
	gzip -f -9 $(GIT_TARNAME).tar
2482

2483 2484 2485 2486
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2487

2488 2489
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
2490
.PHONY: dist-doc distclean
2491
dist-doc:
2492
	$(RM) -r .doc-tmp-dir
2493 2494 2495 2496 2497
	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
	:
2498
	$(RM) -r .doc-tmp-dir
2499
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2500
	$(MAKE) -C Documentation DESTDIR=./ \
2501
		man1dir=../.doc-tmp-dir/man1 \
2502
		man5dir=../.doc-tmp-dir/man5 \
2503
		man7dir=../.doc-tmp-dir/man7 \
2504 2505 2506
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2507
	$(RM) -r .doc-tmp-dir
2508

P
Petr Baudis 已提交
2509
### Cleaning rules
2510

2511 2512
distclean: clean
	$(RM) configure
2513 2514 2515
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2516

2517 2518 2519 2520
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

2521
clean: profile-clean coverage-clean
2522 2523
	$(RM) *.res
	$(RM) $(OBJECTS)
2524
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2525
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2526
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
2527
	$(RM) -r bin-wrappers $(dep_dirs)
2528
	$(RM) -r po/build/
2529
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
2530 2531 2532
	$(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 已提交
2533
	$(RM) contrib/coccinelle/*.cocci.patch*
2534
	$(MAKE) -C Documentation/ clean
2535
ifndef NO_PERL
2536
	$(MAKE) -C gitweb clean
2537
	$(MAKE) -C perl clean
2538
endif
P
Petr Baudis 已提交
2539
	$(MAKE) -C templates/ clean
2540
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2541
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2542
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2543 2544
	$(MAKE) -C git-gui clean
endif
2545
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2546 2547
	$(RM) GIT-USER-AGENT GIT-PREFIX
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PYTHON-VARS
2548

2549
.PHONY: all install profile-clean clean strip
2550
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2551
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2552

J
Junio C Hamano 已提交
2553 2554
### Check documentation
#
J
Jeff King 已提交
2555 2556 2557 2558
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2559
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
2560 2561

.PHONY: check-docs
J
Junio C Hamano 已提交
2562
check-docs::
2563
	$(MAKE) -C Documentation lint-docs
J
Jeff King 已提交
2564
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2565 2566 2567
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2568
		git-merge-resolve | git-merge-subtree | \
2569
		git-fsck-objects | git-init-db | \
2570
		git-remote-* | git-stage | \
2571
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2572 2573 2574
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
2575
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
2576
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2577 2578 2579 2580
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2581 2582
	done; \
	( \
2583 2584
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
2585
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2586
		    -e 's/^/listed /' command-list.txt; \
2587 2588
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2589 2590 2591 2592
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2593
		case " $(ALL_COMMANDS) " in \
2594 2595 2596 2597
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2598 2599 2600 2601 2602

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

2604 2605
### Test suite coverage testing
#
2606
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
2607
.PHONY: coverage-untested-functions cover_db cover_db_html
2608
.PHONY: coverage-clean-results
2609 2610

coverage:
2611
	$(MAKE) coverage-test
2612
	$(MAKE) coverage-untested-functions
2613

2614
object_dirs := $(sort $(dir $(OBJECTS)))
2615
coverage-clean-results:
2616 2617 2618
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2619
	$(RM) -r cover_db/
2620
	$(RM) -r cover_db_html/
2621

2622 2623 2624
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2625 2626
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2627
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2628

2629
coverage-compile:
2630
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2631 2632

coverage-test: coverage-clean-results coverage-compile
2633
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2634
		DEFAULT_TEST_TARGET=test -j1 test
2635 2636

coverage-report:
2637
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2638
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2639
	done
2640 2641

coverage-untested-functions: coverage-report
2642 2643
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2644
		> coverage-untested-functions
2645 2646 2647

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2648 2649 2650

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