Makefile 78.7 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 107
# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
# in the C library.
#
108 109
# Define NO_LIBGEN_H if you don't have libgen.h.
#
110 111
# Define NEEDS_LIBGEN if your libgen needs -lgen when linking
#
112 113
# Define NO_SYS_SELECT_H if you don't have sys/select.h.
#
114 115
# 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.
116
#
P
Pavel Roskin 已提交
117
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
E
Eric Wong 已提交
118 119 120
# 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.
#
121 122 123 124 125 126 127 128 129 130 131 132
# 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.
#
133 134 135 136
# 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.
#
137 138
# Define BLK_SHA1 environment variable to make use of the bundled
# optimized C SHA1 routine.
139
#
140 141
# Define PPC_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for PowerPC.
142
#
J
Jeff King 已提交
143 144 145 146
# Define DC_SHA1 to unconditionally enable the collision-detecting sha1
# algorithm. This is slower, but may detect attempted collision attacks.
# Takes priority over other *_SHA1 knobs.
#
147 148 149
# Define OPENSSL_SHA1 environment variable when running make to link
# with the SHA1 routine from openssl library.
#
150 151 152 153
# 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.
#
154 155 156
# 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).
157
#
158
# Define NEEDS_SSL_WITH_CURL if you need -lssl with -lcurl (Minix).
159
#
160
# Define NEEDS_IDN_WITH_CURL if you need -lidn when using -lcurl (Minix).
161
#
162
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
163
#
J
Joachim Schmitz 已提交
164 165
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
J
Justin Lebar 已提交
166
# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t.
J
Joachim Schmitz 已提交
167 168 169
#
# Define NO_UINTMAX_T if you don't have uintmax_t.
#
170 171 172
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
173 174 175 176
# 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.
#
177 178
# Define NO_MMAP if you want to avoid mmap.
#
179 180 181 182 183
# 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.
#
184 185 186
# 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.
187
#
J
Junio C Hamano 已提交
188 189
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
190
# Define NO_PREAD if you have a problem with pread() system call (e.g.
191
# cygwin1.dll before v1.5.22).
192
#
193 194 195 196 197
# 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
#
198 199 200
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
201 202 203
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
# the executable mode bit, but doesn't really do so.
#
204 205 206 207
# 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).
#
208 209
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
#
210 211
# Define NO_UNIX_SOCKETS if your system does not offer unix sockets.
#
212 213 214
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
215 216
# Define NO_ICONV if your libc does not properly support iconv.
#
217 218 219
# Define OLD_ICONV if your library has an old iconv(), where the second
# (input buffer pointer) parameter is declared with type (const char **).
#
220 221
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
#
222 223 224
# 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.
225
#
J
Junio C Hamano 已提交
226 227 228
# 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)
#
229
# Define USE_NSEC below if you want git to care about sub-second file mtimes
230 231 232 233 234
# 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.
235
#
236 237 238
# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
# "st_ctim"
#
239 240 241
# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
# available.  This automatically turns USE_NSEC off.
#
242
# Define USE_STDEV below if you want git to care about the underlying device
243
# change being considered an inode change from the update-index perspective.
244
#
245 246 247
# 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.
#
248 249 250
# 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 已提交
251 252
# Define ASCIIDOC_ROFF if your DocBook XSL does not escape raw roff directives
# (versions 1.68.1 through v1.72).
253
#
T
Thomas Rast 已提交
254 255 256 257
# 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.
#
258 259 260 261 262 263
# Define USE_ASCIIDOCTOR to use Asciidoctor instead of AsciiDoc to build the
# documentation.
#
# Define ASCIIDOCTOR_EXTENSIONS_LAB to point to the location of the Asciidoctor
# Extensions Lab if you have it available.
#
264 265
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
266 267 268
# Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
# MakeMaker (e.g. using ActiveState under Cygwin).
#
269 270
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
271 272 273
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
# but /usr/bin/python2.7 on some platforms).
#
274 275
# Define NO_PYTHON if you do not want Python scripts or libraries at all.
#
E
Eygene Ryabinkin 已提交
276 277
# Define NO_TCLTK if you do not want Tcl/Tk GUI.
#
278 279 280
# 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.
#
281 282 283 284 285
# 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.
286 287 288
# 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).
#
289 290 291 292
# Define INTERNAL_QSORT to use Git's implementation of qsort(), which
# is a simplified version of the merge sort used in glibc. This is
# recommended if Git triggers O(n^2) behavior in your platform's qsort().
#
R
René Scharfe 已提交
293 294 295
# Define HAVE_ISO_QSORT_S if your platform provides a qsort_s() that's
# compatible with the one described in C11 Annex K.
#
296 297 298
# 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.
299
#
300 301
# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
# when hardlinking a file to another name and unlinking the original file right
302
# away (some NTFS drivers seem to zero the contents in that scenario).
303
#
304 305
# 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.
306
#
J
Junio C Hamano 已提交
307 308 309
# 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.
#
310 311
# Define USE_NED_ALLOCATOR if you want to replace the platforms default
# memory allocators with the nedmalloc allocator written by Niall Douglas.
312
#
313 314 315 316 317
# 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.
#
318 319
# Define NO_REGEX if your C library lacks regex support with REG_STARTEND
# feature.
320
#
J
Jeff King 已提交
321 322 323
# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
# user.
#
324
# Define GETTEXT_POISON if you are debugging the choice of strings marked
325 326 327
# 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.
328
#
329 330
# Define JSMIN to point to JavaScript minifier that functions as
# a filter to have gitweb.js minified.
J
Junio C Hamano 已提交
331
#
332 333 334
# Define CSSMIN to point to a CSS minifier in order to generate a minified
# version of gitweb.css
#
335 336 337 338
# 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.
#
339 340 341 342 343 344 345
# 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'
346
#
347 348 349 350 351 352
# 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.
#
353
# Define NATIVE_CRLF if your platform uses CRLF for line endings.
354
#
J
Jeff King 已提交
355 356
# Define GIT_USER_AGENT if you want to change how git identifies itself during
# network interactions.  The default is "git/$(GIT_VERSION)".
357
#
358 359 360
# 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.
361 362 363 364
#
# 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].
365
#
366 367
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
368
#
369
# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
370
#
371 372 373 374
# 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.
375
#
376 377 378 379 380 381 382 383
# 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 已提交
384
#
385
# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
386 387
#
# Define HAVE_GETDELIM if your system has the getdelim() function.
388 389 390 391 392 393 394 395
#
# 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".
396

397
GIT-VERSION-FILE: FORCE
398
	@$(SHELL_PATH) ./GIT-VERSION-GEN
399
-include GIT-VERSION-FILE
400

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

403
CFLAGS = -g -O2 -Wall
404
DEVELOPER_CFLAGS = -Werror \
405 406 407 408 409 410 411 412
	-Wdeclaration-after-statement \
	-Wno-format-zero-length \
	-Wold-style-definition \
	-Woverflow \
	-Wpointer-arith \
	-Wstrict-prototypes \
	-Wunused \
	-Wvla
J
Junio C Hamano 已提交
413
LDFLAGS =
414
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
415
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
416
STRIP ?= strip
417

418 419 420
# Create as necessary, replace existing, make ranlib unneeded.
ARFLAGS = rcs

421 422 423
# Among the variables below, these:
#   gitexecdir
#   template_dir
424
#   sysconfdir
425 426
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
427
# runtime figures out where they are based on the path to the executable.
428 429 430 431 432
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
433 434
# This can help installing the suite in a relocatable way.

435
prefix = $(HOME)
436 437
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
438 439
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
440
gitexecdir = libexec/git-core
441
mergetoolsdir = $(gitexecdir)/mergetools
442
sharedir = $(prefix)/share
443
gitwebdir = $(sharedir)/gitweb
444
localedir = $(sharedir)/locale
445
template_dir = share/git-core/templates
446
htmldir = $(prefix)/share/doc/git-doc
447
ETC_GITCONFIG = $(sysconfdir)/gitconfig
448
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
449
lib = lib
450
# DESTDIR =
451
pathsep = :
452

453 454 455 456
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

457
export prefix bindir sharedir sysconfdir gitwebdir localedir
458

459
CC = cc
460
AR = ar
461
RM = rm -f
462
DIFF = diff
463
TAR = tar
464
FIND = find
465
INSTALL = install
466
TCL_PATH = tclsh
467
TCLTK_PATH = wish
468
XGETTEXT = xgettext
469
MSGFMT = msgfmt
470
CURL_CONFIG = curl-config
471
PTHREAD_LIBS = -lpthread
472
PTHREAD_CFLAGS =
473
GCOV = gcov
R
René Scharfe 已提交
474
SPATCH = spatch
475

476 477
export TCL_PATH TCLTK_PATH

478
SPARSE_FLAGS =
479
SPATCH_FLAGS = --all-includes
480

P
Petr Baudis 已提交
481 482 483 484


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

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

491 492 493 494 495
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
496 497
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
498
GENERATED_H =
499
EXTRA_CPPFLAGS =
500
LIB_OBJS =
501
PROGRAM_OBJS =
502 503
PROGRAMS =
SCRIPT_PERL =
504
SCRIPT_PYTHON =
505
SCRIPT_SH =
506
SCRIPT_LIB =
507
TEST_PROGRAMS_NEED_X =
508

J
Jonathan Nieder 已提交
509 510 511 512 513 514
# 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

515
SCRIPT_SH += git-bisect.sh
516
SCRIPT_SH += git-difftool--helper.sh
517 518 519 520 521 522 523
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
524
SCRIPT_SH += git-remote-testgit.sh
525 526 527 528 529
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

530 531
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
532 533 534
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
535
SCRIPT_LIB += git-sh-setup
536
SCRIPT_LIB += git-sh-i18n
537

538 539 540 541 542 543 544
SCRIPT_PERL += git-add--interactive.perl
SCRIPT_PERL += git-archimport.perl
SCRIPT_PERL += git-cvsexportcommit.perl
SCRIPT_PERL += git-cvsimport.perl
SCRIPT_PERL += git-cvsserver.perl
SCRIPT_PERL += git-send-email.perl
SCRIPT_PERL += git-svn.perl
545

P
Pete Wyckoff 已提交
546
SCRIPT_PYTHON += git-p4.py
547

548
NO_INSTALL += git-remote-testgit
549

550 551 552 553 554
# 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))

555 556 557 558
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))

559 560 561 562 563 564 565 566 567
# 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
568
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
569
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
570
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
571
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
572
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
573
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
574 575 576 577 578 579 580 581 582

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

583 584 585
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
586
	  git-instaweb
587

588 589
ETAGS_TARGET = TAGS

590 591
# Empty...
EXTRA_PROGRAMS =
592

593 594
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
595

596
PROGRAM_OBJS += credential-store.o
597
PROGRAM_OBJS += daemon.o
598
PROGRAM_OBJS += fast-import.o
599
PROGRAM_OBJS += http-backend.o
600
PROGRAM_OBJS += imap-send.o
601
PROGRAM_OBJS += sh-i18n--envsubst.o
602 603 604
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
605
PROGRAM_OBJS += remote-testsvn.o
606

607 608 609
# Binary suffix, set to .exe for Windows builds
X =

610
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
611

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

647
TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
648

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

BUILT_INS += git-cherry$X
654
BUILT_INS += git-cherry-pick$X
655 656 657 658 659
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 已提交
660
BUILT_INS += git-stage$X
661 662
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
663

664 665
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
666
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
667

E
Eygene Ryabinkin 已提交
668
# what 'all' will build but not install in gitexecdir
669
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
670

671 672 673 674 675 676 677 678 679
# 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

680 681 682 683 684 685 686
# 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
687 688 689
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
690

L
Luben Tuikov 已提交
691
export PERL_PATH
692
export PYTHON_PATH
L
Luben Tuikov 已提交
693

694 695 696
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
697

J
Jeff King 已提交
698
GENERATED_H += common-cmds.h
699

700 701 702 703 704
LIB_H = $(shell $(FIND) . \
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
	-name '*.h' -print)
705

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

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

977
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
978
EXTLIBS =
979

J
Jeff King 已提交
980 981
GIT_USER_AGENT = git/$(GIT_VERSION)

982
include config.mak.uname
983
-include config.mak.autogen
984
-include config.mak
985

986
ifdef DEVELOPER
987
CFLAGS += $(DEVELOPER_CFLAGS)
988 989
endif

990 991 992 993 994 995 996 997
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

998
ifndef COMPUTE_HEADER_DEPENDENCIES
999 1000 1001 1002
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
1003
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
1004 1005
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
1006
	echo $$?)
1007
ifeq ($(dep_check),0)
1008 1009 1010
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1011
endif
1012 1013
endif

1014
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1015
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1016 1017 1018 1019 1020
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1021 1022
endif

1023
ifdef SANE_TOOL_PATH
1024 1025
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1026 1027
PATH := $(SANE_TOOL_PATH):${PATH}
else
1028
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1029 1030
endif

G
Gary V. Vaughan 已提交
1031 1032 1033 1034
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1035 1036 1037 1038
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1039 1040 1041 1042 1043 1044 1045 1046
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

1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059
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
1060
	ifndef NO_APPLE_COMMON_CRYPTO
1061
		NO_OPENSSL = YesPlease
1062 1063 1064
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1065
	NO_REGEX = YesPlease
1066
	PTHREAD_LIBS =
1067 1068
endif

1069 1070 1071 1072 1073 1074 1075 1076
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
1077 1078
endif

1079 1080 1081 1082 1083
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

M
Michał Kiedrowicz 已提交
1084 1085 1086 1087 1088 1089 1090 1091 1092
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 已提交
1093 1094 1095 1096
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1097
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1098
IMAP_SEND_LDFLAGS =
1099

D
Daniel Barkalow 已提交
1100 1101
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1102 1103 1104
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1105
else
1106
	ifdef CURLDIR
1107 1108 1109
		# 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
1110
	else
1111
		CURL_LIBCURL = -lcurl
1112
	endif
1113 1114 1115 1116
	ifdef NEEDS_SSL_WITH_CURL
		CURL_LIBCURL += -lssl
		ifdef NEEDS_CRYPTO_WITH_SSL
			CURL_LIBCURL += -lcrypto
1117 1118
		endif
	endif
1119 1120 1121
	ifdef NEEDS_IDN_WITH_CURL
		CURL_LIBCURL += -lidn
	endif
1122

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

1157 1158
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1159
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1160 1161 1162
endif
EXTLIBS += -lz

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

1373
ifdef NO_ICONV
1374
	BASIC_CFLAGS += -DNO_ICONV
1375 1376
endif

1377 1378 1379 1380
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1381 1382 1383 1384
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1385 1386 1387 1388
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1389 1390 1391 1392 1393
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

1394 1395 1396
ifdef OPENSSL_SHA1
	EXTLIBS += $(LIB_4_CRYPTO)
	BASIC_CFLAGS += -DSHA1_OPENSSL
J
Jeff King 已提交
1397
else
1398 1399
ifdef BLK_SHA1
	LIB_OBJS += block-sha1/sha1.o
1400
	BASIC_CFLAGS += -DSHA1_BLK
1401
else
1402 1403
ifdef PPC_SHA1
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1404
	BASIC_CFLAGS += -DSHA1_PPC
1405 1406 1407
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
1408
	BASIC_CFLAGS += -DSHA1_APPLE
1409
else
1410 1411 1412 1413
	DC_SHA1 := YesPlease
	LIB_OBJS += sha1dc/sha1.o
	LIB_OBJS += sha1dc/ubc_check.o
	BASIC_CFLAGS += -DSHA1_DC
1414 1415 1416
endif
endif
endif
1417 1418
endif

1419 1420 1421 1422
ifdef SHA1_MAX_BLOCK_SIZE
	LIB_OBJS += compat/sha1-chunked.o
	BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
1423 1424 1425
ifdef NO_PERL_MAKEMAKER
	export NO_PERL_MAKEMAKER
endif
1426 1427 1428 1429
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1430 1431 1432 1433
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1434 1435 1436
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1437 1438 1439 1440
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
R
René Scharfe 已提交
1441 1442 1443 1444 1445
ifdef HAVE_ISO_QSORT_S
	COMPAT_CFLAGS += -DHAVE_ISO_QSORT_S
else
	COMPAT_OBJS += compat/qsort_s.o
endif
1446 1447 1448
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1449

J
Junio C Hamano 已提交
1450 1451 1452
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1453
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1454
	EXTLIBS += $(PTHREAD_LIBS)
1455
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1456
endif
1457

1458 1459 1460 1461
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1462 1463
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1464
	EXTLIBS += $(CHARSET_LIB)
1465 1466
endif

1467 1468 1469 1470
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1471 1472 1473 1474
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1475 1476 1477
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1478 1479 1480
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1481 1482 1483 1484
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1485 1486 1487
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1488

1489
ifdef USE_NED_ALLOCATOR
1490 1491 1492 1493 1494 1495 1496 1497
	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
1498 1499
endif

1500 1501 1502 1503
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1504 1505 1506 1507
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1508 1509 1510 1511 1512
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1513 1514 1515 1516
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1517 1518 1519 1520
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1521 1522 1523 1524
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1525 1526 1527 1528
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1529 1530 1531 1532
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1533
ifeq ($(TCLTK_PATH),)
1534
NO_TCLTK = NoThanks
1535 1536
endif

1537
ifeq ($(PERL_PATH),)
1538
NO_PERL = NoThanks
1539 1540
endif

1541
ifeq ($(PYTHON_PATH),)
1542
NO_PYTHON = NoThanks
1543 1544
endif

1545 1546 1547 1548
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1549
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1550 1551
QUIET_SUBDIR1  =

1552
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1553 1554 1555 1556 1557
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1558
ifneq ($(findstring s,$(MAKEFLAGS)),s)
S
Shawn O. Pearce 已提交
1559
ifndef V
A
Alex Riesen 已提交
1560
	QUIET_CC       = @echo '   ' CC $@;
1561 1562 1563 1564
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1565
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1566
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1567
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1568
	QUIET_GCOV     = @echo '   ' GCOV $@;
1569
	QUIET_SP       = @echo '   ' SP $<;
1570
	QUIET_RC       = @echo '   ' RC $@;
1571
	QUIET_SUBDIR0  = +@subdir=
1572 1573
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1574
	export V
A
Alex Riesen 已提交
1575
	export QUIET_GEN
1576 1577
	export QUIET_BUILT_IN
endif
1578
endif
1579

J
Junio C Hamano 已提交
1580 1581 1582 1583
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1584 1585 1586 1587 1588 1589 1590
### profile feedback build
#

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

1591
ifeq ("$(PROFILE)","GEN")
1592
	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
1593
	EXTLIBS += -lgcov
1594 1595
	export CCACHE_DISABLE = t
	V = 1
1596 1597
else
ifneq ("$(PROFILE)","")
1598
	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1599 1600
	export CCACHE_DISABLE = t
	V = 1
1601
endif
1602
endif
1603

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

1606
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1607
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1608 1609 1610

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1611
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1612 1613
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1614
localedir_SQ = $(subst ','\'',$(localedir))
1615 1616
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
1617
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1618
prefix_SQ = $(subst ','\'',$(prefix))
1619
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1620 1621 1622

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1623
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1624
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1625
DIFF_SQ = $(subst ','\'',$(DIFF))
1626
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1627

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

1638
BASIC_CFLAGS += $(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1639
LIB_OBJS += $(COMPAT_OBJS)
1640

1641 1642 1643 1644 1645 1646 1647 1648 1649
# 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

1650 1651 1652 1653 1654 1655 1656
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

1657 1658 1659 1660 1661 1662 1663
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 已提交
1664 1665 1666
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))
1667 1668 1669 1670
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 已提交
1671

1672 1673 1674 1675
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1676 1677 1678 1679 1680
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)'

1681 1682 1683
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1684
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1685 1686


P
Petr Baudis 已提交
1687 1688
### Build rules

1689 1690
SHELL = $(SHELL_PATH)

1691 1692 1693
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
1694 1695 1696 1697
all:: profile
endif

profile:: profile-clean
1698 1699
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
1700 1701 1702 1703 1704
	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
		$(MAKE) PROFILE=GEN -j1 perf; \
	else \
		echo "Skipping profile of perf tests..."; \
	fi
1705 1706 1707 1708 1709 1710 1711
	$(MAKE) PROFILE=USE all

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

1712 1713

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
1714
ifneq (,$X)
1715
	$(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';)
1716
endif
1717

1718
all::
E
Eygene Ryabinkin 已提交
1719
ifndef NO_TCLTK
1720
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1721
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
E
Eygene Ryabinkin 已提交
1722
endif
1723
ifndef NO_PERL
1724
	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' localedir='$(localedir_SQ)' all
1725
endif
1726
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1727

1728 1729 1730 1731 1732
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 已提交
1733
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
1734
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
1735

1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768
### 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.

1769
git.sp git.s git.o: GIT-PREFIX
1770
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1771 1772 1773
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1774

1775
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1776 1777
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) \
		$(filter %.o,$^) $(LIBS)
1778

1779
help.sp help.s help.o: common-cmds.h
1780

1781
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1782
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1783 1784 1785
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1786

1787
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1788
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1789 1790
	'-DGIT_VERSION="$(GIT_VERSION)"' \
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
1791

J
Junio C Hamano 已提交
1792
$(BUILT_INS): git$X
1793
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
1794 1795 1796
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
1797

1798
common-cmds.h: generate-cmdlist.sh command-list.txt
1799

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

1803
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
1804
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
1805
	$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV)
1806 1807 1808 1809
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
1810
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
1811
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
1812
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
1813
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
1814
    -e $(BROKEN_PATH_FIX) \
1815 1816
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
1817
    -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
1818
    -e 's|@@PAGER_ENV@@|$(PAGER_ENV_SQ)|g' \
1819 1820 1821
    $@.sh >$@+
endef

1822 1823 1824
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
1825
		echo >&2 "    * new script parameters"; \
1826 1827 1828 1829
		echo "$$FLAGS" >$@; \
            fi


1830
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
1831
	$(QUIET_GEN)$(cmd_munge_script) && \
1832
	chmod +x $@+ && \
1833
	mv $@+ $@
1834

1835
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1836 1837 1838
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1839
git.res: git.rc GIT-VERSION-FILE
1840
	$(QUIET_RC)$(RC) \
1841
	  $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
S
Steven Penny 已提交
1842
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
1843

1844
# This makes sure we depend on the NO_PERL setting itself.
1845
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
1846

1847
ifndef NO_PERL
1848
$(SCRIPT_PERL_GEN): perl/perl.mak
1849

1850 1851 1852
perl/perl.mak: perl/PM.stamp

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

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

1860
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ)
1861
$(SCRIPT_PERL_GEN): % : %.perl perl/perl.mak GIT-PERL-DEFINES GIT-VERSION-FILE
1862
	$(QUIET_GEN)$(RM) $@ $@+ && \
1863
	INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
1864 1865
	INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \
	INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \
1866 1867 1868
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
	    -e '	h' \
1869
	    -e '	s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'"));=' \
1870 1871 1872
	    -e '	H' \
	    -e '	x' \
	    -e '}' \
1873
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
1874
	    $< >$@+ && \
1875
	chmod +x $@+ && \
1876
	mv $@+ $@
1877

1878 1879 1880 1881 1882 1883 1884
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

1885 1886 1887 1888 1889

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

1890
git-instaweb: git-instaweb.sh GIT-SCRIPT-DEFINES
1891
	$(QUIET_GEN)$(cmd_munge_script) && \
1892
	chmod +x $@+ && \
1893
	mv $@+ $@
1894
else # NO_PERL
1895
$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh
1896 1897 1898 1899 1900 1901 1902
	$(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
1903

1904 1905 1906
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

1907
ifndef NO_PYTHON
F
Felipe Contreras 已提交
1908 1909
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
1910
	$(QUIET_GEN)$(RM) $@ $@+ && \
1911
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
1912
	    $< >$@+ && \
1913 1914 1915
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
1916
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
1917 1918 1919 1920 1921 1922 1923 1924
	$(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

1925 1926 1927 1928 1929 1930
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+

1931
configure: configure.ac GIT-VERSION-FILE
1932
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
1933

1934
ifdef AUTOCONFIGURED
1935 1936 1937 1938 1939 1940
# 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
1941
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
1942
	if test -f config.status; then \
1943 1944 1945 1946 1947 1948 1949 1950 1951
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

1952 1953 1954 1955 1956 1957
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
1958
XDIFF_OBJS += xdiff/xhistogram.o
1959 1960

VCSSVN_OBJS += vcs-svn/line_buffer.o
1961
VCSSVN_OBJS += vcs-svn/sliding_window.o
1962 1963
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1964
VCSSVN_OBJS += vcs-svn/svndiff.o
1965 1966
VCSSVN_OBJS += vcs-svn/svndump.o

1967
TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS))
1968 1969 1970
OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
	$(XDIFF_OBJS) \
	$(VCSSVN_OBJS) \
1971
	common-main.o \
1972 1973 1974 1975
	git.o
ifndef NO_CURL
	OBJECTS += http.o http-walker.o remote-curl.o
endif
1976

1977
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1978
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1979

1980
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1981
$(dep_dirs):
1982
	@mkdir -p $@
1983 1984

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
1985
dep_file = $(dir $@).depend/$(notdir $@).d
1986
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
1987 1988
endif

1989
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1990 1991
dep_dirs =
missing_dep_dirs =
1992 1993 1994 1995 1996 1997 1998
dep_args =
endif

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

1999 2000
.SUFFIXES:

2001
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
2002
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2003
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
2004
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2005

2006
%.s: %.c GIT-CFLAGS FORCE
2007
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2008 2009

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
2010 2011
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
2012 2013 2014
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
2015 2016 2017 2018 2019 2020 2021 2022
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 已提交
2023

2024
$(OBJECTS): $(LIB_H)
2025
endif
2026

2027
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
2028
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
2029 2030 2031
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
2032

2033
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2034
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2035
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2036

2037
config.sp config.s config.o: GIT-PREFIX
2038 2039
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2040

2041
attr.sp attr.s attr.o: GIT-PREFIX
2042 2043
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2044

2045
gettext.sp gettext.s gettext.o: GIT-PREFIX
2046 2047 2048
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2049
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SPARSE_FLAGS += \
2050 2051
	-DCURL_DISABLE_TYPECHECK

2052
ifdef NO_EXPAT
2053
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2054 2055
endif

2056
ifdef NO_REGEX
2057 2058
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2059 2060
endif

2061
ifdef USE_NED_ALLOCATOR
2062
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2063
	-DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR
2064
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2065 2066
endif

2067
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2068
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2069

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

2074
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2075
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2076
		$(CURL_LIBCURL) $(LIBS)
2077
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2078
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2079
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2080

2081 2082 2083 2084
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)

2085 2086 2087 2088 2089 2090
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

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

P
Petr Baudis 已提交
2095
$(LIB_FILE): $(LIB_OBJS)
2096
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2097

2098
$(XDIFF_LIB): $(XDIFF_OBJS)
2099
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2100

J
Jonathan Nieder 已提交
2101
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2102
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2103

2104 2105
export DEFAULT_EDITOR DEFAULT_PAGER

E
Elia Pinto 已提交
2106
.PHONY: doc man html info pdf
P
Petr Baudis 已提交
2107 2108 2109
doc:
	$(MAKE) -C Documentation all

2110 2111 2112 2113 2114 2115
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

2116 2117 2118
info:
	$(MAKE) -C Documentation info

2119 2120 2121
pdf:
	$(MAKE) -C Documentation pdf

2122 2123
XGETTEXT_FLAGS = \
	--force-po \
2124
	--add-comments=TRANSLATORS: \
2125 2126
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2127 2128
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2129 2130
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2131
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
2132
	--keyword=__ --keyword=N__ --keyword="__n:1,2"
2133
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2134 2135
LOCALIZED_SH = $(SCRIPT_SH)
LOCALIZED_SH += git-parse-remote.sh
2136
LOCALIZED_SH += git-rebase--interactive.sh
2137
LOCALIZED_SH += git-sh-setup.sh
2138
LOCALIZED_PERL = $(SCRIPT_PERL)
2139 2140 2141 2142 2143 2144

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

2146
po/git.pot: $(GENERATED_H) FORCE
2147 2148 2149
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2150 2151
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2152 2153
	mv $@+ $@

E
Elia Pinto 已提交
2154
.PHONY: pot
2155 2156
pot: po/git.pot

2157 2158 2159 2160 2161 2162 2163 2164 2165 2166
POFILES := $(wildcard po/*.po)
MOFILES := $(patsubst po/%.po,po/build/locale/%/LC_MESSAGES/git.mo,$(POFILES))

ifndef NO_GETTEXT
all:: $(MOFILES)
endif

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

J
Jeff King 已提交
2167
FIND_SOURCE_FILES = ( \
2168 2169
	git ls-files \
		'*.[hcS]' \
2170
		'*.sh' \
2171
		':!*[tp][0-9][0-9][0-9][0-9]*' \
2172
		':!contrib' \
2173
		2>/dev/null || \
J
Jeff King 已提交
2174 2175
	$(FIND) . \
		\( -name .git -type d -prune \) \
2176
		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
2177
		-o \( -name contrib -type d -prune \) \
2178 2179
		-o \( -name build -type d -prune \) \
		-o \( -name 'trash*' -type d -prune \) \
J
Jeff King 已提交
2180
		-o \( -name '*.[hcS]' -type f -print \) \
2181
		-o \( -name '*.sh' -type f -print \) \
J
Jeff King 已提交
2182
	)
2183

2184 2185
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2186
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2187

2188
tags: FORCE
2189
	$(RM) tags
2190
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2191

K
Kristof Provost 已提交
2192 2193
cscope:
	$(RM) cscope*
2194
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2195

2196
### Detect prefix changes
2197 2198 2199 2200 2201 2202
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 \
2203
		echo >&2 "    * new prefix flags"; \
2204 2205 2206 2207
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2209
GIT-CFLAGS: FORCE
2210 2211
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2212
		echo >&2 "    * new build flags"; \
2213 2214 2215
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2216 2217 2218 2219 2220
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2225 2226 2227
# 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".
2228
GIT-BUILD-OPTIONS: FORCE
2229 2230 2231 2232 2233 2234
	@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)))'\' >>$@+
2235
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2236 2237 2238 2239
	@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)))'\' >>$@+
2240
	@echo PAGER_ENV=\''$(subst ','\'',$(subst ','\'',$(PAGER_ENV)))'\' >>$@+
2241
	@echo DC_SHA1=\''$(subst ','\'',$(subst ','\'',$(DC_SHA1)))'\' >>$@+
2242
ifdef TEST_OUTPUT_DIRECTORY
2243
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2244
endif
2245
ifdef GIT_TEST_OPTS
2246
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2247
endif
2248
ifdef GIT_TEST_CMP
2249
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2250 2251
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2252
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2253
endif
2254 2255
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@+
2256
ifdef GIT_PERF_REPEAT_COUNT
2257
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2258 2259
endif
ifdef GIT_PERF_REPO
2260
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2261 2262
endif
ifdef GIT_PERF_LARGE_REPO
2263
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2264 2265
endif
ifdef GIT_PERF_MAKE_OPTS
2266
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2267
endif
2268 2269 2270
ifdef GIT_INTEROP_MAKE_OPTS
	@echo GIT_INTEROP_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_INTEROP_MAKE_OPTS)))'\' >>$@+
endif
2271
ifdef TEST_GIT_INDEX_VERSION
2272
	@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
2273
endif
2274
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2275

2276 2277 2278
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2279

2280 2281
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2282
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2283
		echo >&2 "    * new Python interpreter location"; \
2284 2285 2286 2287
		echo "$$VARS" >$@; \
            fi
endif

2288 2289 2290
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2291
all:: $(NO_INSTALL)
2292 2293 2294 2295 2296

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

2300 2301 2302 2303
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2304
export NO_SVN_TESTS
2305
export TEST_NO_MALLOC_CHECK
2306

2307 2308
### Testing rules

2309
test: all
P
Petr Baudis 已提交
2310 2311
	$(MAKE) -C t/ all

2312 2313 2314 2315 2316
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

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

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

2321
.PRECIOUS: $(TEST_OBJS)
2322

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

2326 2327
check-sha1:: t/helper/test-sha1$X
	t/helper/test-sha1.sh
2328

2329 2330 2331 2332 2333 2334 2335 2336 2337
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)

2338
check: common-cmds.h
2339
	@if sparse; \
2340
	then \
2341
		echo >&2 "Use 'make sparse' instead"; \
2342
		$(MAKE) --no-print-directory sparse; \
2343
	else \
2344
		echo >&2 "Did you mean 'make test'?"; \
2345 2346
		exit 1; \
	fi
P
Petr Baudis 已提交
2347

R
René Scharfe 已提交
2348 2349 2350
C_SOURCES = $(patsubst %.o,%.c,$(C_OBJ))
%.cocci.patch: %.cocci $(C_SOURCES)
	@echo '    ' SPATCH $<; \
2351
	ret=0; \
R
René Scharfe 已提交
2352
	for f in $(C_SOURCES); do \
2353 2354 2355 2356 2357 2358 2359 2360 2361
		$(SPATCH) --sp-file $< $$f $(SPATCH_FLAGS) || \
			{ ret=$$?; break; }; \
	done >$@+ 2>$@.log; \
	if test $$ret != 0; \
	then \
		cat $@.log; \
		exit 1; \
	fi; \
	mv $@+ $@; \
R
René Scharfe 已提交
2362 2363 2364 2365 2366 2367
	if test -s $@; \
	then \
		echo '    ' SPATCH result: $@; \
	fi
coccicheck: $(patsubst %.cocci,%.cocci.patch,$(wildcard contrib/coccinelle/*.cocci))

P
Petr Baudis 已提交
2368 2369
### Installation rules

2370
ifneq ($(filter /%,$(firstword $(template_dir))),)
2371
template_instdir = $(template_dir)
2372 2373
else
template_instdir = $(prefix)/$(template_dir)
2374 2375 2376
endif
export template_instdir

2377
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2378
gitexec_instdir = $(gitexecdir)
2379 2380
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2381 2382 2383 2384
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2385 2386 2387 2388 2389 2390 2391
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2392 2393
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2394
.PHONY: profile-install profile-fast-install
2395 2396 2397 2398 2399 2400
profile-install: profile
	$(MAKE) install

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

2401
install: all
2402
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2403 2404
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2405
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2406
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2407
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2408
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2409
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2410 2411 2412 2413 2414
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
2415
ifndef NO_PERL
2416
	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
J
Junio C Hamano 已提交
2417
	$(MAKE) -C gitweb install
2418
endif
E
Eygene Ryabinkin 已提交
2419
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2420
	$(MAKE) -C gitk-git install
2421
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2422
endif
2423
ifneq (,$X)
2424
	$(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';)
2425
endif
2426

2427
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2428
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2429
	{ test "$$bindir/" = "$$execdir/" || \
2430 2431
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2432
		test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
2433 2434 2435 2436
		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
	  done; \
	} && \
2437 2438
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
J
Junio C Hamano 已提交
2439
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2440 2441 2442 2443
		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 && \
2444
	for p in $(BUILT_INS); do \
2445
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2446
		test -z "$(NO_INSTALL_HARDLINKS)" && \
J
Jeff King 已提交
2447 2448 2449
		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; \
2450
	done && \
2451 2452
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2453
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2454
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2455 2456 2457
		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; \
2458
	done && \
2459
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2460

E
Elia Pinto 已提交
2461 2462
.PHONY: install-gitweb install-doc install-man install-html install-info install-pdf
.PHONY: quick-install-doc quick-install-man quick-install-html
2463 2464 2465
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2466 2467 2468
install-doc:
	$(MAKE) -C Documentation install

2469 2470 2471
install-man:
	$(MAKE) -C Documentation install-man

2472 2473 2474
install-html:
	$(MAKE) -C Documentation install-html

2475 2476 2477
install-info:
	$(MAKE) -C Documentation install-info

2478 2479 2480
install-pdf:
	$(MAKE) -C Documentation install-pdf

2481 2482
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2483

2484 2485 2486
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2487 2488 2489
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2490 2491 2492 2493


### Maintainer's dist rules

2494
GIT_TARNAME = git-$(GIT_VERSION)
2495
dist: git-archive$(X) configure
2496 2497
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2498
	@mkdir -p $(GIT_TARNAME)
2499
	@cp configure $(GIT_TARNAME)
2500
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2501
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2502
	$(TAR) rf $(GIT_TARNAME).tar \
2503
		$(GIT_TARNAME)/configure \
2504
		$(GIT_TARNAME)/version \
2505
		$(GIT_TARNAME)/git-gui/version
2506
	@$(RM) -r $(GIT_TARNAME)
2507
	gzip -f -9 $(GIT_TARNAME).tar
2508

2509 2510 2511 2512
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2513

2514 2515
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
2516
.PHONY: dist-doc distclean
2517
dist-doc:
2518
	$(RM) -r .doc-tmp-dir
2519 2520 2521 2522 2523
	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
	:
2524
	$(RM) -r .doc-tmp-dir
2525
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2526
	$(MAKE) -C Documentation DESTDIR=./ \
2527
		man1dir=../.doc-tmp-dir/man1 \
2528
		man5dir=../.doc-tmp-dir/man5 \
2529
		man7dir=../.doc-tmp-dir/man7 \
2530 2531 2532
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2533
	$(RM) -r .doc-tmp-dir
2534

P
Petr Baudis 已提交
2535
### Cleaning rules
2536

2537 2538
distclean: clean
	$(RM) configure
2539 2540 2541
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2542

2543 2544 2545 2546
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

2547
clean: profile-clean coverage-clean
2548 2549
	$(RM) *.res
	$(RM) $(OBJECTS)
2550
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2551
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2552
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
2553
	$(RM) -r bin-wrappers $(dep_dirs)
2554
	$(RM) -r po/build/
2555
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
2556 2557 2558
	$(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 已提交
2559
	$(RM) contrib/coccinelle/*.cocci.patch*
2560
	$(MAKE) -C Documentation/ clean
2561
ifndef NO_PERL
2562
	$(MAKE) -C gitweb clean
2563
	$(MAKE) -C perl clean
2564
endif
P
Petr Baudis 已提交
2565
	$(MAKE) -C templates/ clean
2566
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2567
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2568
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2569 2570
	$(MAKE) -C git-gui clean
endif
2571
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2572 2573
	$(RM) GIT-USER-AGENT GIT-PREFIX
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PYTHON-VARS
2574

2575
.PHONY: all install profile-clean clean strip
2576
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2577
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2578

J
Junio C Hamano 已提交
2579 2580
### Check documentation
#
J
Jeff King 已提交
2581 2582 2583 2584
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2585
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
2586 2587

.PHONY: check-docs
J
Junio C Hamano 已提交
2588
check-docs::
2589
	$(MAKE) -C Documentation lint-docs
J
Jeff King 已提交
2590
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2591 2592 2593
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2594
		git-merge-resolve | git-merge-subtree | \
2595
		git-fsck-objects | git-init-db | \
2596
		git-remote-* | git-stage | \
2597
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2598 2599 2600
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
2601
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
2602
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2603 2604 2605 2606
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2607 2608
	done; \
	( \
2609 2610
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
2611
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2612
		    -e 's/^/listed /' command-list.txt; \
2613 2614
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2615 2616 2617 2618
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2619
		case " $(ALL_COMMANDS) " in \
2620 2621 2622 2623
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2624 2625 2626 2627 2628

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

2630 2631
### Test suite coverage testing
#
2632
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
2633
.PHONY: coverage-untested-functions cover_db cover_db_html
2634
.PHONY: coverage-clean-results
2635 2636

coverage:
2637
	$(MAKE) coverage-test
2638
	$(MAKE) coverage-untested-functions
2639

2640
object_dirs := $(sort $(dir $(OBJECTS)))
2641
coverage-clean-results:
2642 2643 2644
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2645
	$(RM) -r cover_db/
2646
	$(RM) -r cover_db_html/
2647

2648 2649 2650
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2651 2652
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2653
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2654

2655
coverage-compile:
2656
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2657 2658

coverage-test: coverage-clean-results coverage-compile
2659
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2660
		DEFAULT_TEST_TARGET=test -j1 test
2661 2662

coverage-report:
2663
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2664
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2665
	done
2666 2667

coverage-untested-functions: coverage-report
2668 2669
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2670
		> coverage-untested-functions
2671 2672 2673

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2674 2675 2676

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