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

S
Shawn O. Pearce 已提交
4
# Define V=1 to have a more verbose compile.
5
#
6 7 8 9 10
# Define SHELL_PATH to a POSIX shell if your /bin/sh is broken.
#
# Define SANE_TOOL_PATH to a colon-separated list of paths to prepend
# to PATH if your tools in /usr/bin are broken.
#
11 12 13
# Define SOCKLEN_T to a suitable type (such as 'size_t') if your
# system headers do not define a socklen_t type.
#
G
Gary V. Vaughan 已提交
14 15 16
# Define INLINE to a suitable substitute (such as '__inline' or '') if git
# fails to compile with errors about undefined inline functions or similar.
#
17
# Define SNPRINTF_RETURNS_BOGUS if you are on a system which snprintf()
18 19 20
# or vsnprintf() return -1 instead of number of characters which would
# have been written to the final string if enough space had been available.
#
21
# Define FREAD_READS_DIRECTORIES if you are on a system which succeeds
22 23
# when attempting to read from an fopen'ed directory.
#
24
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
25
# This also implies BLK_SHA1.
26
#
M
Michał Kiedrowicz 已提交
27 28 29 30 31 32
# Define USE_LIBPCRE if you have and want to use libpcre. git-grep will be
# able to use Perl-compatible regular expressions.
#
# Define LIBPCREDIR=/foo/bar if your libpcre header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
K
Kirill Smelkov 已提交
33 34
# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
#
35
# Define NO_CURL if you do not have libcurl installed.  git-http-fetch and
36
# git-http-push are not built, and you cannot use http:// and https://
37
# transports (neither smart nor dumb).
38
#
P
Patrick Mauritz 已提交
39
# Define CURLDIR=/foo/bar if your curl header and library files are in
40
# /foo/bar/include and /foo/bar/lib directories.
P
Patrick Mauritz 已提交
41
#
42 43 44
# Define CURL_CONFIG to curl's configuration program that prints information
# about the library (e.g., its version number).  The default is 'curl-config'.
#
45
# Define NO_EXPAT if you do not have expat installed.  git-http-push is
46
# not built, and you cannot push using http:// and https:// transports (dumb).
47
#
48 49 50
# Define EXPATDIR=/foo/bar if your expat header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
M
Matt Kraai 已提交
51 52 53
# Define EXPAT_NEEDS_XMLPARSE_H if you have an old version of expat (e.g.,
# 1.1 or 1.2) that provides xmlparse.h instead of expat.h.
#
54 55 56 57
# Define NO_GETTEXT if you don't want Git output to be translated.
# A translated Git requires GNU libintl or another gettext implementation,
# plus libintl-perl at runtime.
#
58 59 60
# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust
# the installed gettext translation of the shell scripts output.
#
61 62 63 64 65 66
# Define HAVE_LIBCHARSET_H if you haven't set NO_GETTEXT and you can't
# trust the langinfo.h's nl_langinfo(CODESET) function to return the
# current character set. GNU and Solaris have a nl_langinfo(CODESET),
# FreeBSD can use either, but MinGW and some others need to use
# libcharset.h's locale_charset() instead.
#
67
# Define CHARSET_LIB to the library you need to link with in order to
68
# use locale_charset() function.  On some platforms this needs to set to
69
# -lcharset, on others to -liconv .
70
#
71 72 73 74 75 76
# Define LIBC_CONTAINS_LIBINTL if your gettext implementation doesn't
# need -lintl when linking.
#
# Define NO_MSGFMT_EXTENDED_OPTIONS if your implementation of msgfmt
# doesn't support GNU extensions like --check and --statistics
#
77 78 79
# Define HAVE_PATHS_H if you have paths.h and want to use the default PATH
# it specifies.
#
80
# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
81
# d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
82
#
83 84
# Define HAVE_STRINGS_H if you have strings.h and need it for strcasecmp.
#
85 86
# Define NO_STRCASESTR if you don't have strcasestr.
#
R
René Scharfe 已提交
87 88
# Define NO_MEMMEM if you don't have memmem.
#
M
Matt Kraai 已提交
89 90
# Define NO_GETPAGESIZE if you don't have getpagesize.
#
91 92
# Define NO_STRLCPY if you don't have strlcpy.
#
93 94
# Define NO_STRTOUMAX if you don't have both strtoimax and strtoumax in the
# C library. If your compiler also does not support long long or does not have
95 96
# strtoull, define NO_STRTOULL.
#
J
Jason Riedy 已提交
97 98
# Define NO_SETENV if you don't have setenv in the C library.
#
99 100
# Define NO_UNSETENV if you don't have unsetenv in the C library.
#
101 102
# Define NO_MKDTEMP if you don't have mkdtemp in the C library.
#
103 104
# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
#
105 106
# Define NO_MKSTEMPS if you don't have mkstemps in the C library.
#
107 108 109
# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
# in the C library.
#
110 111
# Define NO_LIBGEN_H if you don't have libgen.h.
#
112 113
# Define NEEDS_LIBGEN if your libgen needs -lgen when linking
#
114 115
# Define NO_SYS_SELECT_H if you don't have sys/select.h.
#
116 117
# Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link.
# Enable it on Windows.  By default, symrefs are still used.
118
#
P
Pavel Roskin 已提交
119
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
E
Eric Wong 已提交
120 121 122
# tests.  These tests take up a significant amount of the total test time
# but are not needed unless you plan to talk to SVN repos.
#
123 124 125 126 127 128 129 130 131 132 133 134
# Define NO_FINK if you are building on Darwin/Mac OS X, have Fink
# installed in /sw, but don't want GIT to link against any libraries
# installed there.  If defined you may specify your own (or Fink's)
# include directories and library directories by defining CFLAGS
# and LDFLAGS appropriately.
#
# Define NO_DARWIN_PORTS if you are building on Darwin/Mac OS X,
# have DarwinPorts installed in /opt/local, but don't want GIT to
# link against any libraries installed there.  If defined you may
# specify your own (or DarwinPort's) include directories and
# library directories by defining CFLAGS and LDFLAGS appropriately.
#
135 136 137 138
# Define NO_APPLE_COMMON_CRYPTO if you are building on Darwin/Mac OS X
# and do not want to use Apple's CommonCrypto library.  This allows you
# to provide your own OpenSSL library, for example from MacPorts.
#
139 140
# Define BLK_SHA1 environment variable to make use of the bundled
# optimized C SHA1 routine.
141
#
142 143
# Define PPC_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for PowerPC.
144
#
145 146 147 148
# Define SHA1_MAX_BLOCK_SIZE to limit the amount of data that will be hashed
# in one call to the platform's SHA1_Update(). e.g. APPLE_COMMON_CRYPTO
# wants 'SHA1_MAX_BLOCK_SIZE=1024L*1024L*1024L' defined.
#
149 150 151
# Define NEEDS_CRYPTO_WITH_SSL if you need -lcrypto when using -lssl (Darwin).
#
# Define NEEDS_SSL_WITH_CRYPTO if you need -lssl when using -lcrypto (Darwin).
152
#
153
# Define NEEDS_SSL_WITH_CURL if you need -lssl with -lcurl (Minix).
154
#
155
# Define NEEDS_IDN_WITH_CURL if you need -lidn when using -lcurl (Minix).
156
#
157
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
158
#
J
Joachim Schmitz 已提交
159 160
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
J
Justin Lebar 已提交
161
# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t.
J
Joachim Schmitz 已提交
162 163 164
#
# Define NO_UINTMAX_T if you don't have uintmax_t.
#
165 166 167
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
168 169 170 171
# Define NEEDS_RESOLV if linking with -lnsl and/or -lsocket is not enough.
# Notably on Solaris hstrerror resides in libresolv and on Solaris 7
# inet_ntop and inet_pton additionally reside there.
#
172 173
# Define NO_MMAP if you want to avoid mmap.
#
174 175 176 177 178
# Define NO_SYS_POLL_H if you don't have sys/poll.h.
#
# Define NO_POLL if you do not have or don't want to use poll().
# This also implies NO_SYS_POLL_H.
#
179 180 181
# Define NEEDS_SYS_PARAM_H if you need to include sys/param.h to compile,
# *PLEASE* REPORT to git@vger.kernel.org if your platform needs this;
# we want to know more about the issue.
182
#
J
Junio C Hamano 已提交
183 184
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
185
# Define NO_PREAD if you have a problem with pread() system call (e.g.
186
# cygwin1.dll before v1.5.22).
187
#
188 189 190 191 192
# Define NO_SETITIMER if you don't have setitimer()
#
# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
# This also implies NO_SETITIMER
#
193 194 195
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
196 197 198
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
# the executable mode bit, but doesn't really do so.
#
199 200 201 202
# Define NEEDS_MODE_TRANSLATION if your OS strays from the typical file type
# bits in mode values (e.g. z/OS defines I_SFMT to 0xFF000000 as opposed to the
# usual 0xF000).
#
203 204
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
#
205 206
# Define NO_UNIX_SOCKETS if your system does not offer unix sockets.
#
207 208 209
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
210 211
# Define NO_ICONV if your libc does not properly support iconv.
#
212 213 214
# Define OLD_ICONV if your library has an old iconv(), where the second
# (input buffer pointer) parameter is declared with type (const char **).
#
215 216
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
#
217 218 219
# Define NO_R_TO_GCC_LINKER if your gcc does not like "-R/path/lib"
# that tells runtime paths to dynamic libraries;
# "-Wl,-rpath=/path/lib" is used instead.
220
#
J
Junio C Hamano 已提交
221 222 223
# Define NO_NORETURN if using buggy versions of gcc 4.6+ and profile feedback,
# as the compiler can crash (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49299)
#
224
# Define USE_NSEC below if you want git to care about sub-second file mtimes
225 226 227 228 229
# and ctimes. Note that you need recent glibc (at least 2.2.4) for this. On
# Linux, kernel 2.6.11 or newer is required for reliable sub-second file times
# on file systems with exactly 1 ns or 1 s resolution. If you intend to use Git
# on other file systems (e.g. CEPH, CIFS, NTFS, UDF), don't enable USE_NSEC. See
# Documentation/technical/racy-git.txt for details.
230
#
231 232 233
# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
# "st_ctim"
#
234 235 236
# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
# available.  This automatically turns USE_NSEC off.
#
237
# Define USE_STDEV below if you want git to care about the underlying device
238
# change being considered an inode change from the update-index perspective.
239
#
240 241 242
# Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks
# field that counts the on-disk footprint in 512-byte blocks.
#
243 244 245
# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72
# (not v1.73 or v1.71).
#
J
Jeff King 已提交
246 247
# Define ASCIIDOC_ROFF if your DocBook XSL does not escape raw roff directives
# (versions 1.68.1 through v1.72).
248
#
T
Thomas Rast 已提交
249 250 251 252
# Define GNU_ROFF if your target system uses GNU groff.  This forces
# apostrophes to be ASCII so that cut&pasting examples to the shell
# will work.
#
253 254 255 256 257 258
# 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.
#
259 260
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
261 262 263
# Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
# MakeMaker (e.g. using ActiveState under Cygwin).
#
264 265
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
266 267 268
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
# but /usr/bin/python2.7 on some platforms).
#
269 270
# Define NO_PYTHON if you do not want Python scripts or libraries at all.
#
E
Eygene Ryabinkin 已提交
271 272
# Define NO_TCLTK if you do not want Tcl/Tk GUI.
#
273 274 275
# 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.
#
276 277 278 279 280
# 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.
281 282 283
# 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).
#
284 285 286 287
# 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 已提交
288 289 290
# Define HAVE_ISO_QSORT_S if your platform provides a qsort_s() that's
# compatible with the one described in C11 Annex K.
#
291 292 293
# 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.
294
#
295 296
# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
# when hardlinking a file to another name and unlinking the original file right
297
# away (some NTFS drivers seem to zero the contents in that scenario).
298
#
299 300
# 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.
301
#
J
Junio C Hamano 已提交
302 303 304
# 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.
#
305 306
# Define USE_NED_ALLOCATOR if you want to replace the platforms default
# memory allocators with the nedmalloc allocator written by Niall Douglas.
307
#
308 309 310 311 312
# 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.
#
313 314
# Define NO_REGEX if your C library lacks regex support with REG_STARTEND
# feature.
315
#
J
Jeff King 已提交
316 317 318
# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
# user.
#
319
# Define GETTEXT_POISON if you are debugging the choice of strings marked
320 321 322
# 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.
323
#
324 325
# Define JSMIN to point to JavaScript minifier that functions as
# a filter to have gitweb.js minified.
J
Junio C Hamano 已提交
326
#
327 328 329
# Define CSSMIN to point to a CSS minifier in order to generate a minified
# version of gitweb.css
#
330 331 332 333
# 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.
#
334 335 336 337 338 339 340
# 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'
341
#
342 343 344 345 346 347
# 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.
#
348
# Define NATIVE_CRLF if your platform uses CRLF for line endings.
349
#
J
Jeff King 已提交
350 351
# Define GIT_USER_AGENT if you want to change how git identifies itself during
# network interactions.  The default is "git/$(GIT_VERSION)".
352
#
353 354 355
# 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.
356 357 358 359
#
# 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].
360
#
361 362
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
363
#
364
# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
365
#
366 367 368 369
# 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.
370
#
371 372 373 374 375 376 377 378
# 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 已提交
379
#
380
# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
381 382
#
# Define HAVE_GETDELIM if your system has the getdelim() function.
383 384 385 386 387 388 389 390
#
# 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".
391

392
GIT-VERSION-FILE: FORCE
393
	@$(SHELL_PATH) ./GIT-VERSION-GEN
394
-include GIT-VERSION-FILE
395

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

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

413 414 415
# Create as necessary, replace existing, make ranlib unneeded.
ARFLAGS = rcs

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

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

448 449 450 451
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

452
export prefix bindir sharedir sysconfdir gitwebdir localedir
453

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

471 472
export TCL_PATH TCLTK_PATH

473
SPARSE_FLAGS =
474
SPATCH_FLAGS = --all-includes
475

P
Petr Baudis 已提交
476 477 478 479


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

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

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

J
Jonathan Nieder 已提交
504 505 506 507 508 509
# 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

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

525 526
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
527 528 529
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
530
SCRIPT_LIB += git-sh-setup
531
SCRIPT_LIB += git-sh-i18n
532

533 534 535 536 537 538 539
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
540

P
Pete Wyckoff 已提交
541
SCRIPT_PYTHON += git-p4.py
542

543
NO_INSTALL += git-remote-testgit
544

545 546 547 548 549
# 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))

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

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

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

578 579 580
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
581
	  git-instaweb
582

583 584
ETAGS_TARGET = TAGS

585 586
# Empty...
EXTRA_PROGRAMS =
587

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

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

602 603 604
# Binary suffix, set to .exe for Windows builds
X =

605
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
606

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

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

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

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

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

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

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

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

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

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

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

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

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

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

969
GITLIBS = common-main.o $(LIB_FILE) $(XDIFF_LIB)
970
EXTLIBS =
971

J
Jeff King 已提交
972 973
GIT_USER_AGENT = git/$(GIT_VERSION)

974
include config.mak.uname
975
-include config.mak.autogen
976
-include config.mak
977

978
ifdef DEVELOPER
979
CFLAGS += $(DEVELOPER_CFLAGS)
980 981
endif

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

990
ifndef COMPUTE_HEADER_DEPENDENCIES
991 992 993 994
COMPUTE_HEADER_DEPENDENCIES = auto
endif

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

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

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

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

1027 1028 1029 1030
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1031 1032 1033 1034 1035 1036 1037 1038
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

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

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

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

M
Michał Kiedrowicz 已提交
1076 1077 1078 1079 1080 1081 1082 1083 1084
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 已提交
1085 1086 1087 1088
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1089
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1090
IMAP_SEND_LDFLAGS =
1091

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

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

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

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

1368
ifdef NO_ICONV
1369
	BASIC_CFLAGS += -DNO_ICONV
1370 1371
endif

1372 1373 1374 1375
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1376 1377 1378 1379
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1380 1381 1382 1383
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

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

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

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

J
Junio C Hamano 已提交
1438 1439 1440
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1441
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1442
	EXTLIBS += $(PTHREAD_LIBS)
1443
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1444
endif
1445

1446 1447 1448 1449
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1450 1451
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1452
	EXTLIBS += $(CHARSET_LIB)
1453 1454
endif

1455 1456 1457 1458
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1459 1460 1461 1462
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1463 1464 1465
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1466 1467 1468
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1469 1470 1471 1472
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1473 1474 1475
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1476

1477
ifdef USE_NED_ALLOCATOR
1478 1479 1480 1481 1482 1483 1484 1485
	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
1486 1487
endif

1488 1489 1490 1491
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1492 1493 1494 1495
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1496 1497 1498 1499 1500
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1501 1502 1503 1504
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
endif

1505 1506 1507 1508
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1509 1510 1511 1512
ifdef NEEDS_LIBRT
	EXTLIBS += -lrt
endif

1513 1514 1515 1516
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1517 1518 1519 1520
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1521
ifeq ($(TCLTK_PATH),)
1522
NO_TCLTK = NoThanks
1523 1524
endif

1525
ifeq ($(PERL_PATH),)
1526
NO_PERL = NoThanks
1527 1528
endif

1529
ifeq ($(PYTHON_PATH),)
1530
NO_PYTHON = NoThanks
1531 1532
endif

1533 1534 1535 1536
ifndef PAGER_ENV
PAGER_ENV = LESS=FRX LV=-c
endif

1537
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1538 1539
QUIET_SUBDIR1  =

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

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

J
Junio C Hamano 已提交
1568 1569 1570 1571
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1572 1573 1574 1575 1576 1577 1578
### profile feedback build
#

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

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

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

SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
1595
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1596
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1597 1598 1599

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

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1612
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1613
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1614
DIFF_SQ = $(subst ','\'',$(DIFF))
1615
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1616

1617 1618 1619 1620 1621 1622 1623 1624 1625
# 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)
1626

1627
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
1628
	$(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1629
LIB_OBJS += $(COMPAT_OBJS)
1630

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

1640 1641 1642 1643 1644 1645 1646
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

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

1662 1663 1664 1665
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1666 1667 1668 1669 1670
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)'

1671 1672 1673
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1674
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1675 1676


P
Petr Baudis 已提交
1677 1678
### Build rules

1679 1680
SHELL = $(SHELL_PATH)

1681 1682 1683
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
1684 1685 1686 1687
all:: profile
endif

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

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

1702 1703

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

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

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

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

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

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

1769
help.sp help.s help.o: common-cmds.h
1770

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

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

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

1788
common-cmds.h: generate-cmdlist.sh command-list.txt
1789

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

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

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


1820
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
1821
	$(QUIET_GEN)$(cmd_munge_script) && \
1822
	chmod +x $@+ && \
1823
	mv $@+ $@
1824

1825
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1826 1827 1828
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1829
git.res: git.rc GIT-VERSION-FILE
1830
	$(QUIET_RC)$(RC) \
1831
	  $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
S
Steven Penny 已提交
1832
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" -i $< -o $@
1833

1834
# This makes sure we depend on the NO_PERL setting itself.
1835
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
1836

1837
ifndef NO_PERL
1838
$(SCRIPT_PERL_GEN): perl/perl.mak
1839

1840 1841 1842
perl/perl.mak: perl/PM.stamp

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

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

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

1868 1869 1870 1871 1872 1873 1874
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

1875 1876 1877 1878 1879

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

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

1894 1895 1896
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

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

1915 1916 1917 1918 1919 1920
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+

1921
configure: configure.ac GIT-VERSION-FILE
1922
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
1923

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

1942 1943 1944 1945 1946 1947
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
1948
XDIFF_OBJS += xdiff/xhistogram.o
1949 1950

VCSSVN_OBJS += vcs-svn/line_buffer.o
1951
VCSSVN_OBJS += vcs-svn/sliding_window.o
1952 1953
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1954
VCSSVN_OBJS += vcs-svn/svndiff.o
1955 1956
VCSSVN_OBJS += vcs-svn/svndump.o

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

1967
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1968
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1969

1970
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1971
$(dep_dirs):
1972
	@mkdir -p $@
1973 1974

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

1979
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1980 1981
dep_dirs =
missing_dep_dirs =
1982 1983 1984 1985 1986 1987 1988
dep_args =
endif

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

1989 1990
.SUFFIXES:

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

1996
%.s: %.c GIT-CFLAGS FORCE
1997
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1998 1999

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

2014
$(OBJECTS): $(LIB_H)
2015
endif
2016

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

2023
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2024
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2025
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2026

2027
config.sp config.s config.o: GIT-PREFIX
2028 2029
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2030

2031
attr.sp attr.s attr.o: GIT-PREFIX
2032 2033
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2034

2035
gettext.sp gettext.s gettext.o: GIT-PREFIX
2036 2037 2038
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2039
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SPARSE_FLAGS += \
2040 2041
	-DCURL_DISABLE_TYPECHECK

2042
ifdef NO_EXPAT
2043
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2044 2045
endif

2046
ifdef NO_REGEX
2047 2048
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2049 2050
endif

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

2057
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2058
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2059

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

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

2071 2072 2073 2074
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)

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

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

P
Petr Baudis 已提交
2085
$(LIB_FILE): $(LIB_OBJS)
2086
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2087

2088
$(XDIFF_LIB): $(XDIFF_OBJS)
2089
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2090

J
Jonathan Nieder 已提交
2091
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2092
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2093

2094 2095
export DEFAULT_EDITOR DEFAULT_PAGER

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

2100 2101 2102 2103 2104 2105
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

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

2109 2110 2111
pdf:
	$(MAKE) -C Documentation pdf

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

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

2136
po/git.pot: $(GENERATED_H) FORCE
2137 2138 2139
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2140 2141
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2142 2143
	mv $@+ $@

E
Elia Pinto 已提交
2144
.PHONY: pot
2145 2146
pot: po/git.pot

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

2174 2175
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2176
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2177

2178
tags: FORCE
2179
	$(RM) tags
2180
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2181

K
Kristof Provost 已提交
2182 2183
cscope:
	$(RM) cscope*
2184
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2185

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

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

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

2206 2207 2208 2209 2210
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

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

2262 2263 2264
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2265

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

2274 2275 2276
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2277
all:: $(NO_INSTALL)
2278 2279 2280 2281 2282

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

2286 2287 2288 2289
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2290
export NO_SVN_TESTS
2291
export TEST_NO_MALLOC_CHECK
2292

2293 2294
### Testing rules

2295
test: all
P
Petr Baudis 已提交
2296 2297
	$(MAKE) -C t/ all

2298 2299 2300 2301 2302
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

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

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

2307
.PRECIOUS: $(TEST_OBJS)
2308

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

2312 2313
check-sha1:: t/helper/test-sha1$X
	t/helper/test-sha1.sh
2314

2315 2316 2317 2318 2319 2320 2321 2322 2323
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)

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

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

P
Petr Baudis 已提交
2346 2347
### Installation rules

2348
ifneq ($(filter /%,$(firstword $(template_dir))),)
2349
template_instdir = $(template_dir)
2350 2351
else
template_instdir = $(prefix)/$(template_dir)
2352 2353 2354
endif
export template_instdir

2355
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2356
gitexec_instdir = $(gitexecdir)
2357 2358
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2359 2360 2361 2362
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2363 2364 2365 2366 2367 2368 2369
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2370 2371
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2372
.PHONY: profile-install profile-fast-install
2373 2374 2375 2376 2377 2378
profile-install: profile
	$(MAKE) install

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

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

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

E
Elia Pinto 已提交
2439 2440
.PHONY: install-gitweb install-doc install-man install-html install-info install-pdf
.PHONY: quick-install-doc quick-install-man quick-install-html
2441 2442 2443
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2444 2445 2446
install-doc:
	$(MAKE) -C Documentation install

2447 2448 2449
install-man:
	$(MAKE) -C Documentation install-man

2450 2451 2452
install-html:
	$(MAKE) -C Documentation install-html

2453 2454 2455
install-info:
	$(MAKE) -C Documentation install-info

2456 2457 2458
install-pdf:
	$(MAKE) -C Documentation install-pdf

2459 2460
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2461

2462 2463 2464
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2465 2466 2467
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2468 2469 2470 2471


### Maintainer's dist rules

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

2487 2488 2489 2490
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2491

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

P
Petr Baudis 已提交
2513
### Cleaning rules
2514

2515 2516
distclean: clean
	$(RM) configure
2517 2518 2519
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2520

2521 2522 2523 2524
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

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

2553
.PHONY: all install profile-clean clean strip
2554
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2555
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2556

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

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

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

2608 2609
### Test suite coverage testing
#
2610
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
2611
.PHONY: coverage-untested-functions cover_db cover_db_html
2612
.PHONY: coverage-clean-results
2613 2614

coverage:
2615
	$(MAKE) coverage-test
2616
	$(MAKE) coverage-untested-functions
2617

2618
object_dirs := $(sort $(dir $(OBJECTS)))
2619
coverage-clean-results:
2620 2621 2622
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2623
	$(RM) -r cover_db/
2624
	$(RM) -r cover_db_html/
2625

2626 2627 2628
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2629 2630
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2631
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2632

2633
coverage-compile:
2634
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2635 2636

coverage-test: coverage-clean-results coverage-compile
2637
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2638
		DEFAULT_TEST_TARGET=test -j1 test
2639 2640

coverage-report:
2641
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2642
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2643
	done
2644 2645

coverage-untested-functions: coverage-report
2646 2647
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2648
		> coverage-untested-functions
2649 2650 2651

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2652 2653 2654

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