Makefile 77.5 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

P
Petr Baudis 已提交
471 472 473 474


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

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

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

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

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

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

528
SCRIPT_PERL += git-add--interactive.perl
529
SCRIPT_PERL += git-difftool.perl
530 531 532 533 534 535 536
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
537

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

540
NO_INSTALL += git-remote-testgit
541

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

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

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

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

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

580 581
ETAGS_TARGET = TAGS

582 583
# Empty...
EXTRA_PROGRAMS =
584

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

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

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

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

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

638
TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
639

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

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

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

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

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

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

L
Luben Tuikov 已提交
682
export PERL_PATH
683
export PYTHON_PATH
L
Luben Tuikov 已提交
684

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

J
Jeff King 已提交
689
GENERATED_H += common-cmds.h
690

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

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

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

964
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
965
EXTLIBS =
966

J
Jeff King 已提交
967 968
GIT_USER_AGENT = git/$(GIT_VERSION)

969
include config.mak.uname
970
-include config.mak.autogen
971
-include config.mak
972

973
ifdef DEVELOPER
974
CFLAGS += $(DEVELOPER_CFLAGS)
975 976
endif

977 978 979 980 981 982 983 984
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

985
ifndef COMPUTE_HEADER_DEPENDENCIES
986 987 988 989
COMPUTE_HEADER_DEPENDENCIES = auto
endif

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

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

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

G
Gary V. Vaughan 已提交
1018 1019 1020 1021
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1022 1023 1024 1025
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1026 1027 1028 1029 1030 1031 1032 1033
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

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

1055 1056 1057 1058 1059 1060 1061 1062
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
1063 1064
endif

1065 1066 1067 1068 1069
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

M
Michał Kiedrowicz 已提交
1070 1071 1072 1073 1074 1075 1076 1077 1078
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 已提交
1079 1080 1081 1082
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1083
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1084
IMAP_SEND_LDFLAGS =
1085

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

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

1143 1144
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1145
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1146 1147 1148
endif
EXTLIBS += -lz

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

1362
ifdef NO_ICONV
1363
	BASIC_CFLAGS += -DNO_ICONV
1364 1365
endif

1366 1367 1368 1369
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1370 1371 1372 1373
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1374 1375 1376 1377
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1378 1379 1380 1381 1382
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

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

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

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

1435 1436 1437 1438
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1439 1440
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1441
	EXTLIBS += $(CHARSET_LIB)
1442 1443
endif

1444 1445 1446 1447
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1448 1449 1450 1451
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

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

1466
ifdef USE_NED_ALLOCATOR
1467 1468 1469 1470 1471 1472 1473 1474
	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
1475 1476
endif

1477 1478 1479 1480
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1481 1482 1483 1484
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1485 1486 1487 1488
ifneq (,$(XDL_FAST_HASH))
	BASIC_CFLAGS += -DXDL_FAST_HASH
endif

1489 1490 1491 1492 1493
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1494 1495 1496 1497
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1498 1499 1500 1501
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1502 1503 1504 1505
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1506 1507 1508 1509
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1510 1511 1512 1513
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1514
ifeq ($(TCLTK_PATH),)
1515
NO_TCLTK = NoThanks
1516 1517
endif

1518
ifeq ($(PERL_PATH),)
1519
NO_PERL = NoThanks
1520 1521
endif

1522
ifeq ($(PYTHON_PATH),)
1523
NO_PYTHON = NoThanks
1524 1525
endif

1526 1527 1528 1529
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1530
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1531 1532
QUIET_SUBDIR1  =

1533
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1534 1535 1536 1537 1538
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

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

J
Junio C Hamano 已提交
1561 1562 1563 1564
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1565 1566 1567 1568 1569 1570 1571
### profile feedback build
#

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

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

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

SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
1588
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1589
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1590 1591 1592

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

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1605
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1606
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1607
DIFF_SQ = $(subst ','\'',$(DIFF))
1608
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1609

1610 1611 1612 1613 1614 1615 1616 1617 1618
# 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)
1619

1620
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
1621
	$(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1622
LIB_OBJS += $(COMPAT_OBJS)
1623

1624 1625 1626 1627 1628 1629 1630 1631 1632
# 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

1633 1634 1635 1636 1637 1638 1639
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

1640 1641 1642 1643 1644 1645 1646
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 已提交
1647 1648 1649
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))
1650 1651 1652 1653
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 已提交
1654

1655 1656 1657 1658
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1659 1660 1661 1662 1663
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)'

1664 1665 1666
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1667
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1668 1669


P
Petr Baudis 已提交
1670 1671
### Build rules

1672 1673
SHELL = $(SHELL_PATH)

1674 1675 1676
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
1677 1678 1679 1680
all:: profile
endif

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

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

1695 1696

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
1697
ifneq (,$X)
1698
	$(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';)
1699
endif
1700

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

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

1719 1720 1721 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
### 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.

1752
git.sp git.s git.o: GIT-PREFIX
1753
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1754 1755 1756
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1757

1758
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1759 1760
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
		$(filter %.o,$^) $(LIBS)
1761

1762
help.sp help.s help.o: common-cmds.h
1763

1764
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1765
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1766 1767 1768
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1769

1770
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1771
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1772 1773
	'-DGIT_VERSION="$(GIT_VERSION)"' \
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
1774

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

1781
common-cmds.h: generate-cmdlist.sh command-list.txt
1782

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

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

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


1813
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
1814
	$(QUIET_GEN)$(cmd_munge_script) && \
1815
	chmod +x $@+ && \
1816
	mv $@+ $@
1817

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

1822
git.res: git.rc GIT-VERSION-FILE
1823
	$(QUIET_RC)$(RC) \
1824
	  $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
1825 1826
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@

1827
# This makes sure we depend on the NO_PERL setting itself.
1828
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
1829

1830
ifndef NO_PERL
1831
$(SCRIPT_PERL_GEN): perl/perl.mak
1832

1833 1834 1835
perl/perl.mak: perl/PM.stamp

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

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

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

1861 1862 1863 1864 1865 1866 1867
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

1868 1869 1870 1871 1872

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

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

1887 1888 1889
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

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

1908 1909 1910 1911 1912 1913
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+

1914
configure: configure.ac GIT-VERSION-FILE
1915
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
1916

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

1935 1936 1937 1938 1939 1940
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
1941
XDIFF_OBJS += xdiff/xhistogram.o
1942 1943

VCSSVN_OBJS += vcs-svn/line_buffer.o
1944
VCSSVN_OBJS += vcs-svn/sliding_window.o
1945 1946
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1947
VCSSVN_OBJS += vcs-svn/svndiff.o
1948 1949
VCSSVN_OBJS += vcs-svn/svndump.o

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

1960
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1961
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1962

1963
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1964
$(dep_dirs):
1965
	@mkdir -p $@
1966 1967

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
1968
dep_file = $(dir $@).depend/$(notdir $@).d
1969
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
1970 1971
endif

1972
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1973 1974
dep_dirs =
missing_dep_dirs =
1975 1976 1977 1978 1979 1980 1981
dep_args =
endif

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

1982 1983
.SUFFIXES:

1984
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
1985
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1986
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
1987
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1988

1989
%.s: %.c GIT-CFLAGS FORCE
1990
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1991 1992

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

2007
$(OBJECTS): $(LIB_H)
2008
endif
2009

2010
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
2011
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
2012 2013 2014
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
2015

2016
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2017
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2018
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2019

2020
config.sp config.s config.o: GIT-PREFIX
2021 2022
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2023

2024
attr.sp attr.s attr.o: GIT-PREFIX
2025 2026
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2027

2028
gettext.sp gettext.s gettext.o: GIT-PREFIX
2029 2030 2031
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2032
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SPARSE_FLAGS += \
2033 2034
	-DCURL_DISABLE_TYPECHECK

2035
ifdef NO_EXPAT
2036
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2037 2038
endif

2039
ifdef NO_REGEX
2040 2041
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2042 2043
endif

2044
ifdef USE_NED_ALLOCATOR
2045
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2046
	-DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
2047
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2048 2049
endif

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

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

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

2064 2065 2066 2067
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)

2068 2069 2070 2071 2072 2073
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

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

P
Petr Baudis 已提交
2078
$(LIB_FILE): $(LIB_OBJS)
2079
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2080

2081
$(XDIFF_LIB): $(XDIFF_OBJS)
2082
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2083

J
Jonathan Nieder 已提交
2084
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2085
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2086

2087 2088
export DEFAULT_EDITOR DEFAULT_PAGER

E
Elia Pinto 已提交
2089
.PHONY: doc man html info pdf
P
Petr Baudis 已提交
2090 2091 2092
doc:
	$(MAKE) -C Documentation all

2093 2094 2095 2096 2097 2098
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

2099 2100 2101
info:
	$(MAKE) -C Documentation info

2102 2103 2104
pdf:
	$(MAKE) -C Documentation pdf

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

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

2128
po/git.pot: $(GENERATED_H) FORCE
2129 2130 2131
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2132 2133
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2134 2135
	mv $@+ $@

E
Elia Pinto 已提交
2136
.PHONY: pot
2137 2138
pot: po/git.pot

2139 2140 2141 2142 2143 2144 2145 2146 2147 2148
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 $@ $<

2149 2150 2151 2152
FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \
			$(FIND) . \( -name .git -type d -prune \) \
				-o \( -name '*.[hcS]' -type f -print \) )

2153 2154
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2155
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2156

2157
tags: FORCE
2158
	$(RM) tags
2159
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2160

K
Kristof Provost 已提交
2161 2162
cscope:
	$(RM) cscope*
2163
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2164

2165
### Detect prefix changes
2166 2167 2168 2169 2170 2171
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 \
2172
		echo >&2 "    * new prefix flags"; \
2173 2174 2175 2176
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2178
GIT-CFLAGS: FORCE
2179 2180
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2181
		echo >&2 "    * new build flags"; \
2182 2183 2184
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2185 2186 2187 2188 2189
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2194 2195 2196
# 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".
2197
GIT-BUILD-OPTIONS: FORCE
2198 2199 2200 2201 2202 2203
	@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)))'\' >>$@+
2204
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2205 2206 2207 2208
	@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)))'\' >>$@+
2209
	@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
2210
ifdef TEST_OUTPUT_DIRECTORY
2211
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2212
endif
2213
ifdef GIT_TEST_OPTS
2214
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2215
endif
2216
ifdef GIT_TEST_CMP
2217
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2218 2219
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2220
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2221
endif
2222 2223
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@+
2224
ifdef GIT_PERF_REPEAT_COUNT
2225
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2226 2227
endif
ifdef GIT_PERF_REPO
2228
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2229 2230
endif
ifdef GIT_PERF_LARGE_REPO
2231
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2232 2233
endif
ifdef GIT_PERF_MAKE_OPTS
2234
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2235
endif
2236
ifdef TEST_GIT_INDEX_VERSION
2237
	@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
2238
endif
2239
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2240

2241 2242 2243
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2244

2245 2246
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2247
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2248
		echo >&2 "    * new Python interpreter location"; \
2249 2250 2251 2252
		echo "$$VARS" >$@; \
            fi
endif

2253 2254 2255
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2256
all:: $(NO_INSTALL)
2257 2258 2259 2260 2261

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

2265 2266 2267 2268
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2269
export NO_SVN_TESTS
2270
export TEST_NO_MALLOC_CHECK
2271

2272 2273
### Testing rules

2274
test: all
P
Petr Baudis 已提交
2275 2276
	$(MAKE) -C t/ all

2277 2278 2279 2280 2281
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

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

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

2286
.PRECIOUS: $(TEST_OBJS)
2287

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

2291 2292
check-sha1:: t/helper/test-sha1$X
	t/helper/test-sha1.sh
2293

2294 2295 2296 2297 2298 2299 2300 2301 2302
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)

2303
check: common-cmds.h
2304
	@if sparse; \
2305
	then \
2306
		echo >&2 "Use 'make sparse' instead"; \
2307
		$(MAKE) --no-print-directory sparse; \
2308
	else \
2309
		echo >&2 "Did you mean 'make test'?"; \
2310 2311
		exit 1; \
	fi
P
Petr Baudis 已提交
2312

R
René Scharfe 已提交
2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324
C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
%.cocci.patch: %.cocci $(C_SOURCES)
	@echo '    ' SPATCH $<; \
	for f in $(C_SOURCES); do \
		$(SPATCH) --sp-file $< $$f; \
	done >$@ 2>$@.log; \
	if test -s $@; \
	then \
		echo '    ' SPATCH result: $@; \
	fi
coccicheck: $(patsubst %.cocci,%.cocci.patch,$(wildcard contrib/coccinelle/*.cocci))

P
Petr Baudis 已提交
2325 2326
### Installation rules

2327
ifneq ($(filter /%,$(firstword $(template_dir))),)
2328
template_instdir = $(template_dir)
2329 2330
else
template_instdir = $(prefix)/$(template_dir)
2331 2332 2333
endif
export template_instdir

2334
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2335
gitexec_instdir = $(gitexecdir)
2336 2337
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2338 2339 2340 2341
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2342 2343 2344 2345 2346 2347 2348
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2349 2350
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2351
.PHONY: profile-install profile-fast-install
2352 2353 2354 2355 2356 2357
profile-install: profile
	$(MAKE) install

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

2358
install: all
2359
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2360 2361
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2362
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2363
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2364
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2365
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2366
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2367 2368 2369 2370 2371
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
2372
ifndef NO_PERL
2373
	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
J
Junio C Hamano 已提交
2374
	$(MAKE) -C gitweb install
2375
endif
E
Eygene Ryabinkin 已提交
2376
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2377
	$(MAKE) -C gitk-git install
2378
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2379
endif
2380
ifneq (,$X)
2381
	$(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';)
2382
endif
2383

2384
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2385
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2386
	{ test "$$bindir/" = "$$execdir/" || \
2387 2388
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2389
		test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
2390 2391 2392 2393
		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
	  done; \
	} && \
2394 2395
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
J
Junio C Hamano 已提交
2396
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2397 2398 2399 2400
		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 && \
2401
	for p in $(BUILT_INS); do \
2402
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2403
		test -z "$(NO_INSTALL_HARDLINKS)" && \
J
Jeff King 已提交
2404 2405 2406
		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; \
2407
	done && \
2408 2409
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2410
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2411
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2412 2413 2414
		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; \
2415
	done && \
2416
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2417

E
Elia Pinto 已提交
2418 2419
.PHONY: install-gitweb install-doc install-man install-html install-info install-pdf
.PHONY: quick-install-doc quick-install-man quick-install-html
2420 2421 2422
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2423 2424 2425
install-doc:
	$(MAKE) -C Documentation install

2426 2427 2428
install-man:
	$(MAKE) -C Documentation install-man

2429 2430 2431
install-html:
	$(MAKE) -C Documentation install-html

2432 2433 2434
install-info:
	$(MAKE) -C Documentation install-info

2435 2436 2437
install-pdf:
	$(MAKE) -C Documentation install-pdf

2438 2439
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2440

2441 2442 2443
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2444 2445 2446
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2447 2448 2449 2450


### Maintainer's dist rules

2451
GIT_TARNAME = git-$(GIT_VERSION)
2452
dist: git-archive$(X) configure
2453 2454
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2455
	@mkdir -p $(GIT_TARNAME)
2456
	@cp configure $(GIT_TARNAME)
2457
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2458
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2459
	$(TAR) rf $(GIT_TARNAME).tar \
2460
		$(GIT_TARNAME)/configure \
2461
		$(GIT_TARNAME)/version \
2462
		$(GIT_TARNAME)/git-gui/version
2463
	@$(RM) -r $(GIT_TARNAME)
2464
	gzip -f -9 $(GIT_TARNAME).tar
2465

2466 2467 2468 2469
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2470

2471 2472
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
2473
.PHONY: dist-doc distclean
2474
dist-doc:
2475
	$(RM) -r .doc-tmp-dir
2476 2477 2478 2479 2480
	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
	:
2481
	$(RM) -r .doc-tmp-dir
2482
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2483
	$(MAKE) -C Documentation DESTDIR=./ \
2484
		man1dir=../.doc-tmp-dir/man1 \
2485
		man5dir=../.doc-tmp-dir/man5 \
2486
		man7dir=../.doc-tmp-dir/man7 \
2487 2488 2489
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2490
	$(RM) -r .doc-tmp-dir
2491

P
Petr Baudis 已提交
2492
### Cleaning rules
2493

2494 2495
distclean: clean
	$(RM) configure
2496 2497 2498
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2499

2500 2501 2502 2503
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

2504
clean: profile-clean coverage-clean
2505 2506
	$(RM) *.res
	$(RM) $(OBJECTS)
2507
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2508
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2509
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
2510
	$(RM) -r bin-wrappers $(dep_dirs)
2511
	$(RM) -r po/build/
2512
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
2513 2514 2515
	$(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 已提交
2516
	$(RM) contrib/coccinelle/*.cocci.patch*
2517
	$(MAKE) -C Documentation/ clean
2518
ifndef NO_PERL
2519
	$(MAKE) -C gitweb clean
2520
	$(MAKE) -C perl clean
2521
endif
P
Petr Baudis 已提交
2522
	$(MAKE) -C templates/ clean
2523
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2524
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2525
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2526 2527
	$(MAKE) -C git-gui clean
endif
2528
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2529 2530
	$(RM) GIT-USER-AGENT GIT-PREFIX
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PYTHON-VARS
2531

2532
.PHONY: all install profile-clean clean strip
2533
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2534
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2535

J
Junio C Hamano 已提交
2536 2537
### Check documentation
#
J
Jeff King 已提交
2538 2539 2540 2541
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2542
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
2543 2544

.PHONY: check-docs
J
Junio C Hamano 已提交
2545
check-docs::
2546
	$(MAKE) -C Documentation lint-docs
J
Jeff King 已提交
2547
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2548 2549 2550
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2551
		git-merge-resolve | git-merge-subtree | \
2552
		git-fsck-objects | git-init-db | \
2553
		git-remote-* | git-stage | \
2554
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2555 2556 2557
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
2558
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
2559
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2560 2561 2562 2563
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2564 2565
	done; \
	( \
2566 2567
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
2568
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2569
		    -e 's/^/listed /' command-list.txt; \
2570 2571
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2572 2573 2574 2575
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2576
		case " $(ALL_COMMANDS) " in \
2577 2578 2579 2580
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2581 2582 2583 2584 2585

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

2587 2588
### Test suite coverage testing
#
2589
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
2590
.PHONY: coverage-untested-functions cover_db cover_db_html
2591
.PHONY: coverage-clean-results
2592 2593

coverage:
2594
	$(MAKE) coverage-test
2595
	$(MAKE) coverage-untested-functions
2596

2597
object_dirs := $(sort $(dir $(OBJECTS)))
2598
coverage-clean-results:
2599 2600 2601
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2602
	$(RM) -r cover_db/
2603
	$(RM) -r cover_db_html/
2604

2605 2606 2607
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2608 2609
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2610
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2611

2612
coverage-compile:
2613
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2614 2615

coverage-test: coverage-clean-results coverage-compile
2616
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2617
		DEFAULT_TEST_TARGET=test -j1 test
2618 2619

coverage-report:
2620
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2621
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2622
	done
2623 2624

coverage-untested-functions: coverage-report
2625 2626
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2627
		> coverage-untested-functions
2628 2629 2630

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2631 2632 2633

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