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

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

371
GIT-VERSION-FILE: FORCE
372
	@$(SHELL_PATH) ./GIT-VERSION-GEN
373
-include GIT-VERSION-FILE
374

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

377
CFLAGS = -g -O2 -Wall
J
Junio C Hamano 已提交
378
LDFLAGS =
379
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
380
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
381
STRIP ?= strip
382

383 384 385
# Create as necessary, replace existing, make ranlib unneeded.
ARFLAGS = rcs

386 387 388
# Among the variables below, these:
#   gitexecdir
#   template_dir
389
#   sysconfdir
390 391
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
392
# runtime figures out where they are based on the path to the executable.
393 394 395 396 397
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
398 399
# This can help installing the suite in a relocatable way.

400
prefix = $(HOME)
401 402
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
403 404
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
405
gitexecdir = libexec/git-core
406
mergetoolsdir = $(gitexecdir)/mergetools
407
sharedir = $(prefix)/share
408
gitwebdir = $(sharedir)/gitweb
409
localedir = $(sharedir)/locale
410
template_dir = share/git-core/templates
411
htmldir = $(prefix)/share/doc/git-doc
412
ETC_GITCONFIG = $(sysconfdir)/gitconfig
413
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
414
lib = lib
415
# DESTDIR =
416
pathsep = :
417

418 419 420 421
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

422
export prefix bindir sharedir sysconfdir gitwebdir localedir
423

424
CC = cc
425
AR = ar
426
RM = rm -f
427
DIFF = diff
428
TAR = tar
429
FIND = find
430 431
INSTALL = install
RPMBUILD = rpmbuild
432
TCL_PATH = tclsh
433
TCLTK_PATH = wish
434
XGETTEXT = xgettext
435
MSGFMT = msgfmt
436
CURL_CONFIG = curl-config
437
PTHREAD_LIBS = -lpthread
438
PTHREAD_CFLAGS =
439
GCOV = gcov
440

441 442
export TCL_PATH TCLTK_PATH

443
SPARSE_FLAGS =
444

P
Petr Baudis 已提交
445 446 447 448


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

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

455 456 457 458 459
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
460 461
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
462
GENERATED_H =
463
EXTRA_CPPFLAGS =
464
LIB_OBJS =
465
PROGRAM_OBJS =
466 467
PROGRAMS =
SCRIPT_PERL =
468
SCRIPT_PYTHON =
469
SCRIPT_SH =
470
SCRIPT_LIB =
471
TEST_PROGRAMS_NEED_X =
472

J
Jonathan Nieder 已提交
473 474 475 476 477 478
# 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

479
SCRIPT_SH += git-bisect.sh
480
SCRIPT_SH += git-difftool--helper.sh
481 482 483 484 485 486 487
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
488
SCRIPT_SH += git-remote-testgit.sh
489 490 491 492 493
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

494 495
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
496 497 498
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
499
SCRIPT_LIB += git-sh-setup
500
SCRIPT_LIB += git-sh-i18n
501

502
SCRIPT_PERL += git-add--interactive.perl
503
SCRIPT_PERL += git-difftool.perl
504 505 506 507 508 509 510
SCRIPT_PERL += git-archimport.perl
SCRIPT_PERL += git-cvsexportcommit.perl
SCRIPT_PERL += git-cvsimport.perl
SCRIPT_PERL += git-cvsserver.perl
SCRIPT_PERL += git-relink.perl
SCRIPT_PERL += git-send-email.perl
SCRIPT_PERL += git-svn.perl
511

P
Pete Wyckoff 已提交
512
SCRIPT_PYTHON += git-p4.py
513

514
NO_INSTALL += git-remote-testgit
515

516 517 518 519 520
# 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))

521 522 523 524
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))

525 526 527 528 529 530 531 532 533
# 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
534
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
535
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
536
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
537
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
538
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
539
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
540 541 542 543 544 545 546 547 548

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

549 550 551
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
552
	  git-instaweb
553

554 555
ETAGS_TARGET = TAGS

556 557
# Empty...
EXTRA_PROGRAMS =
558

559 560
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
561

562
PROGRAM_OBJS += credential-store.o
563
PROGRAM_OBJS += daemon.o
564
PROGRAM_OBJS += fast-import.o
565
PROGRAM_OBJS += http-backend.o
566
PROGRAM_OBJS += imap-send.o
567
PROGRAM_OBJS += sh-i18n--envsubst.o
568 569 570
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
571
PROGRAM_OBJS += remote-testsvn.o
572

573 574 575
# Binary suffix, set to .exe for Windows builds
X =

576
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
577

578 579
TEST_PROGRAMS_NEED_X += test-chmtime
TEST_PROGRAMS_NEED_X += test-ctype
580
TEST_PROGRAMS_NEED_X += test-config
581 582 583
TEST_PROGRAMS_NEED_X += test-date
TEST_PROGRAMS_NEED_X += test-delta
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
584
TEST_PROGRAMS_NEED_X += test-dump-split-index
585
TEST_PROGRAMS_NEED_X += test-dump-untracked-cache
J
Johannes Schindelin 已提交
586
TEST_PROGRAMS_NEED_X += test-fake-ssh
587
TEST_PROGRAMS_NEED_X += test-genrandom
588
TEST_PROGRAMS_NEED_X += test-hashmap
J
Jeff King 已提交
589
TEST_PROGRAMS_NEED_X += test-index-version
D
David Barr 已提交
590
TEST_PROGRAMS_NEED_X += test-line-buffer
591
TEST_PROGRAMS_NEED_X += test-match-trees
R
René Scharfe 已提交
592
TEST_PROGRAMS_NEED_X += test-mergesort
J
Jeff King 已提交
593
TEST_PROGRAMS_NEED_X += test-mktemp
594 595
TEST_PROGRAMS_NEED_X += test-parse-options
TEST_PROGRAMS_NEED_X += test-path-utils
596
TEST_PROGRAMS_NEED_X += test-prio-queue
597
TEST_PROGRAMS_NEED_X += test-read-cache
598
TEST_PROGRAMS_NEED_X += test-regex
599
TEST_PROGRAMS_NEED_X += test-revision-walking
600
TEST_PROGRAMS_NEED_X += test-run-command
601
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
602
TEST_PROGRAMS_NEED_X += test-sha1
603
TEST_PROGRAMS_NEED_X += test-sha1-array
604
TEST_PROGRAMS_NEED_X += test-sigchain
605
TEST_PROGRAMS_NEED_X += test-string-list
606
TEST_PROGRAMS_NEED_X += test-submodule-config
607
TEST_PROGRAMS_NEED_X += test-subprocess
D
David Barr 已提交
608
TEST_PROGRAMS_NEED_X += test-svn-fe
609
TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
610
TEST_PROGRAMS_NEED_X += test-wildmatch
611

J
Junio C Hamano 已提交
612
TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))
613

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

BUILT_INS += git-cherry$X
619
BUILT_INS += git-cherry-pick$X
620 621 622 623 624
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 已提交
625
BUILT_INS += git-stage$X
626 627
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
628

629 630
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
631
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
632

E
Eygene Ryabinkin 已提交
633
# what 'all' will build but not install in gitexecdir
634
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
635

636 637 638 639 640 641 642 643 644
# 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

645 646 647 648 649 650 651
# 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
652 653 654
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
655

L
Luben Tuikov 已提交
656
export PERL_PATH
657
export PYTHON_PATH
L
Luben Tuikov 已提交
658

659 660 661
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
662

J
Jeff King 已提交
663
GENERATED_H += common-cmds.h
664

665 666 667 668 669
LIB_H = $(shell $(FIND) . \
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
	-name '*.h' -print)
670

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

830
BUILTIN_OBJS += builtin/add.o
831
BUILTIN_OBJS += builtin/am.o
832 833 834 835 836 837 838 839 840
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 已提交
841
BUILTIN_OBJS += builtin/check-ignore.o
842
BUILTIN_OBJS += builtin/check-mailmap.o
843 844 845 846 847
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
848
BUILTIN_OBJS += builtin/column.o
849 850 851 852
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
853
BUILTIN_OBJS += builtin/credential.o
854 855 856 857 858 859 860 861 862 863 864 865
BUILTIN_OBJS += builtin/describe.o
BUILTIN_OBJS += builtin/diff-files.o
BUILTIN_OBJS += builtin/diff-index.o
BUILTIN_OBJS += builtin/diff-tree.o
BUILTIN_OBJS += builtin/diff.o
BUILTIN_OBJS += builtin/fast-export.o
BUILTIN_OBJS += builtin/fetch-pack.o
BUILTIN_OBJS += builtin/fetch.o
BUILTIN_OBJS += builtin/fmt-merge-msg.o
BUILTIN_OBJS += builtin/for-each-ref.o
BUILTIN_OBJS += builtin/fsck.o
BUILTIN_OBJS += builtin/gc.o
866
BUILTIN_OBJS += builtin/get-tar-commit-id.o
867 868 869 870 871
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
872
BUILTIN_OBJS += builtin/interpret-trailers.o
873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889
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 已提交
890
BUILTIN_OBJS += builtin/notes.o
891 892 893 894 895 896
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 已提交
897
BUILTIN_OBJS += builtin/pull.o
898 899 900 901 902
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 已提交
903
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
904
BUILTIN_OBJS += builtin/remote-fd.o
905
BUILTIN_OBJS += builtin/repack.o
906 907 908 909 910 911 912 913 914 915 916 917
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
918
BUILTIN_OBJS += builtin/submodule--helper.o
919 920 921 922 923 924 925 926 927
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
928
BUILTIN_OBJS += builtin/verify-commit.o
929 930
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
931
BUILTIN_OBJS += builtin/worktree.o
932
BUILTIN_OBJS += builtin/write-tree.o
933

934
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
935
EXTLIBS =
936

J
Jeff King 已提交
937 938
GIT_USER_AGENT = git/$(GIT_VERSION)

939
include config.mak.uname
940
-include config.mak.autogen
941
-include config.mak
942

943 944 945 946 947 948 949 950 951 952 953 954
ifdef DEVELOPER
CFLAGS += -Werror \
	-Wdeclaration-after-statement \
	-Wno-format-zero-length \
	-Wold-style-definition \
	-Woverflow \
	-Wpointer-arith \
	-Wstrict-prototypes \
	-Wunused \
	-Wvla
endif

955 956 957 958 959 960 961 962
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

963
ifndef COMPUTE_HEADER_DEPENDENCIES
964 965 966 967
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
968
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
969 970
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
971
	echo $$?)
972
ifeq ($(dep_check),0)
973 974 975
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
976
endif
977 978
endif

979
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
980
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
981 982 983 984 985
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
986 987
endif

988
ifdef SANE_TOOL_PATH
989 990
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
991 992
PATH := $(SANE_TOOL_PATH):${PATH}
else
993
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
994 995
endif

G
Gary V. Vaughan 已提交
996 997 998 999
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1000 1001 1002 1003
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1004 1005 1006 1007 1008 1009 1010 1011
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

1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
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
1025 1026 1027 1028
	ifndef NO_APPLE_COMMON_CRYPTO
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1029
	NO_REGEX = YesPlease
1030
	PTHREAD_LIBS =
1031 1032
endif

1033 1034 1035 1036 1037 1038 1039 1040
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
1041 1042
endif

1043 1044 1045 1046 1047
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

M
Michał Kiedrowicz 已提交
1048 1049 1050 1051 1052 1053 1054 1055 1056
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 已提交
1057 1058 1059 1060
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

1061
IMAP_SEND_BUILDDEPS =
R
Remi Pommarel 已提交
1062
IMAP_SEND_LDFLAGS =
1063

D
Daniel Barkalow 已提交
1064 1065
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1066 1067 1068
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1069
else
1070
	ifdef CURLDIR
1071 1072 1073
		# 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
1074
	else
1075
		CURL_LIBCURL = -lcurl
1076
	endif
1077 1078 1079 1080
	ifdef NEEDS_SSL_WITH_CURL
		CURL_LIBCURL += -lssl
		ifdef NEEDS_CRYPTO_WITH_SSL
			CURL_LIBCURL += -lcrypto
1081 1082
		endif
	endif
1083 1084 1085
	ifdef NEEDS_IDN_WITH_CURL
		CURL_LIBCURL += -lidn
	endif
1086

1087 1088 1089
	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)
1090 1091
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1092
	curl_check := $(shell (echo 070908; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1093 1094
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1095
			PROGRAM_OBJS += http-push.o
1096
		endif
1097
	endif
1098
	curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
1099 1100 1101 1102 1103 1104 1105 1106
	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
1107
	ifndef NO_EXPAT
1108 1109 1110 1111 1112 1113
		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 已提交
1114 1115 1116
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1117
	endif
1118
endif
R
Remi Pommarel 已提交
1119
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
1120

1121 1122
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1123
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1124 1125 1126
endif
EXTLIBS += -lz

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

1340
ifdef NO_ICONV
1341
	BASIC_CFLAGS += -DNO_ICONV
1342 1343
endif

1344 1345 1346 1347
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1348 1349 1350 1351
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1352 1353 1354 1355
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1356 1357 1358 1359 1360
ifdef APPLE_COMMON_CRYPTO
	# Apple CommonCrypto requires chunking
	SHA1_MAX_BLOCK_SIZE = 1024L*1024L*1024L
endif

1361 1362 1363 1364
ifdef BLK_SHA1
	SHA1_HEADER = "block-sha1/sha1.h"
	LIB_OBJS += block-sha1/sha1.o
else
1365 1366 1367
ifdef PPC_SHA1
	SHA1_HEADER = "ppc/sha1.h"
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1368 1369 1370 1371
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
	SHA1_HEADER = <CommonCrypto/CommonDigest.h>
1372 1373
else
	SHA1_HEADER = <openssl/sha.h>
1374
	EXTLIBS += $(LIB_4_CRYPTO)
1375 1376
endif
endif
1377 1378
endif

1379 1380 1381 1382
ifdef SHA1_MAX_BLOCK_SIZE
	LIB_OBJS += compat/sha1-chunked.o
	BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
1383 1384 1385
ifdef NO_PERL_MAKEMAKER
	export NO_PERL_MAKEMAKER
endif
1386 1387 1388 1389
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1390 1391 1392 1393
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1394 1395 1396
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1397 1398 1399 1400
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
1401 1402 1403
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1404

J
Junio C Hamano 已提交
1405 1406 1407
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1408
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1409
	EXTLIBS += $(PTHREAD_LIBS)
1410
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1411
endif
1412

1413 1414 1415 1416
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1417 1418
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1419
	EXTLIBS += $(CHARSET_LIB)
1420 1421
endif

1422 1423 1424 1425
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1426 1427 1428 1429
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1430 1431 1432
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1433 1434 1435
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1436 1437 1438 1439
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1440 1441 1442
ifdef NATIVE_CRLF
	BASIC_CFLAGS += -DNATIVE_CRLF
endif
N
Nicolas Pitre 已提交
1443

1444
ifdef USE_NED_ALLOCATOR
1445
       COMPAT_CFLAGS += -Icompat/nedmalloc
1446 1447 1448
       COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
endif

1449 1450 1451 1452
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1453 1454 1455 1456
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1457 1458 1459 1460
ifneq (,$(XDL_FAST_HASH))
	BASIC_CFLAGS += -DXDL_FAST_HASH
endif

1461 1462 1463 1464 1465
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1466 1467 1468 1469 1470
ifdef HAVE_CLOCK_GETTIME
	BASIC_CFLAGS += -DHAVE_CLOCK_GETTIME
	EXTLIBS += -lrt
endif

1471 1472 1473 1474
ifdef HAVE_CLOCK_MONOTONIC
	BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif

1475 1476 1477 1478
ifdef HAVE_BSD_SYSCTL
	BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
endif

1479 1480 1481 1482
ifdef HAVE_GETDELIM
	BASIC_CFLAGS += -DHAVE_GETDELIM
endif

1483
ifeq ($(TCLTK_PATH),)
1484
NO_TCLTK = NoThanks
1485 1486
endif

1487
ifeq ($(PERL_PATH),)
1488
NO_PERL = NoThanks
1489 1490
endif

1491
ifeq ($(PYTHON_PATH),)
1492
NO_PYTHON = NoThanks
1493 1494
endif

1495
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1496 1497
QUIET_SUBDIR1  =

1498
ifneq ($(findstring w,$(MAKEFLAGS)),w)
1499 1500 1501 1502 1503
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1504
ifneq ($(findstring s,$(MAKEFLAGS)),s)
S
Shawn O. Pearce 已提交
1505
ifndef V
A
Alex Riesen 已提交
1506
	QUIET_CC       = @echo '   ' CC $@;
1507 1508 1509 1510
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1511
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1512
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1513
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1514
	QUIET_GCOV     = @echo '   ' GCOV $@;
1515
	QUIET_SP       = @echo '   ' SP $<;
1516
	QUIET_RC       = @echo '   ' RC $@;
1517
	QUIET_SUBDIR0  = +@subdir=
1518 1519
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1520
	export V
A
Alex Riesen 已提交
1521
	export QUIET_GEN
1522 1523
	export QUIET_BUILT_IN
endif
1524
endif
1525

J
Junio C Hamano 已提交
1526 1527 1528 1529
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1530 1531 1532 1533 1534 1535 1536
### profile feedback build
#

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

1537
ifeq ("$(PROFILE)","GEN")
1538
	BASIC_CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
1539
	EXTLIBS += -lgcov
1540 1541
	export CCACHE_DISABLE = t
	V = 1
1542 1543
else
ifneq ("$(PROFILE)","")
1544
	BASIC_CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1545 1546
	export CCACHE_DISABLE = t
	V = 1
1547
endif
1548
endif
1549

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

SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
1553
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1554
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1555 1556 1557

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1558
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1559 1560
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1561
localedir_SQ = $(subst ','\'',$(localedir))
1562 1563
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
1564
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1565
prefix_SQ = $(subst ','\'',$(prefix))
1566
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1567 1568 1569

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1570
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1571
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1572
DIFF_SQ = $(subst ','\'',$(DIFF))
1573
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1574

1575 1576
LIBS = $(GITLIBS) $(EXTLIBS)

1577
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
1578
	$(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1579
LIB_OBJS += $(COMPAT_OBJS)
1580

1581 1582 1583 1584 1585 1586 1587 1588 1589
# 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

1590 1591 1592 1593 1594 1595 1596
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

1597 1598 1599 1600 1601 1602 1603
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 已提交
1604 1605 1606
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))
1607 1608 1609 1610
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 已提交
1611

1612 1613 1614 1615
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1616 1617 1618
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1619
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1620 1621


P
Petr Baudis 已提交
1622 1623
### Build rules

1624 1625
SHELL = $(SHELL_PATH)

1626 1627 1628
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
1629 1630 1631 1632
all:: profile
endif

profile:: profile-clean
1633 1634
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
1635 1636 1637 1638 1639
	@if test -n "$$GIT_PERF_REPO" || test -d .git; then \
		$(MAKE) PROFILE=GEN -j1 perf; \
	else \
		echo "Skipping profile of perf tests..."; \
	fi
1640 1641 1642 1643 1644 1645 1646
	$(MAKE) PROFILE=USE all

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

1647 1648

all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS
1649
ifneq (,$X)
1650
	$(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';)
1651
endif
1652

1653
all::
E
Eygene Ryabinkin 已提交
1654
ifndef NO_TCLTK
1655
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1656
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
E
Eygene Ryabinkin 已提交
1657
endif
1658
ifndef NO_PERL
1659
	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' localedir='$(localedir_SQ)' all
1660
endif
1661
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1662

1663 1664 1665 1666 1667
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 已提交
1668
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
1669
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
1670

1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703
### 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.

1704
git.sp git.s git.o: GIT-PREFIX
1705
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1706 1707 1708
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1709

1710
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1711 1712
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) git.o \
		$(BUILTIN_OBJS) $(LIBS)
1713

1714
help.sp help.s help.o: common-cmds.h
1715

1716
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1717
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1718 1719 1720
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1721

1722
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1723
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1724 1725
	'-DGIT_VERSION="$(GIT_VERSION)"' \
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
1726

J
Junio C Hamano 已提交
1727
$(BUILT_INS): git$X
1728
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
1729 1730 1731
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
1732

1733
common-cmds.h: generate-cmdlist.sh command-list.txt
1734

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

1738
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
1739
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
1740
	$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP)
1741 1742 1743 1744
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
1745
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
1746
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
1747
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
1748
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
1749
    -e $(BROKEN_PATH_FIX) \
1750 1751
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
1752
    -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \
1753 1754 1755
    $@.sh >$@+
endef

1756 1757 1758
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
1759
		echo >&2 "    * new script parameters"; \
1760 1761 1762 1763
		echo "$$FLAGS" >$@; \
            fi


1764
$(SCRIPT_SH_GEN) : % : %.sh GIT-SCRIPT-DEFINES
1765
	$(QUIET_GEN)$(cmd_munge_script) && \
1766
	chmod +x $@+ && \
1767
	mv $@+ $@
1768

1769
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1770 1771 1772
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1773
git.res: git.rc GIT-VERSION-FILE
1774
	$(QUIET_RC)$(RC) \
1775
	  $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
1776 1777
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@

1778
# This makes sure we depend on the NO_PERL setting itself.
1779
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS
1780

1781
ifndef NO_PERL
1782
$(SCRIPT_PERL_GEN): perl/perl.mak
1783

1784 1785 1786
perl/perl.mak: perl/PM.stamp

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

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

1794
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ)
1795
$(SCRIPT_PERL_GEN): % : %.perl perl/perl.mak GIT-PERL-DEFINES GIT-VERSION-FILE
1796
	$(QUIET_GEN)$(RM) $@ $@+ && \
1797
	INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
1798 1799
	INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \
	INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \
1800 1801 1802
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
	    -e '	h' \
1803
	    -e '	s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'"));=' \
1804 1805 1806
	    -e '	H' \
	    -e '	x' \
	    -e '}' \
1807
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
1808
	    $< >$@+ && \
1809
	chmod +x $@+ && \
1810
	mv $@+ $@
1811

1812 1813 1814 1815 1816 1817 1818
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

1819 1820 1821 1822 1823

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

1824
git-instaweb: git-instaweb.sh GIT-SCRIPT-DEFINES
1825
	$(QUIET_GEN)$(cmd_munge_script) && \
1826
	chmod +x $@+ && \
1827
	mv $@+ $@
1828
else # NO_PERL
1829
$(SCRIPT_PERL_GEN) git-instaweb: % : unimplemented.sh
1830 1831 1832 1833 1834 1835 1836
	$(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
1837

1838 1839 1840
# This makes sure we depend on the NO_PYTHON setting itself.
$(SCRIPT_PYTHON_GEN): GIT-BUILD-OPTIONS

1841
ifndef NO_PYTHON
F
Felipe Contreras 已提交
1842 1843
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
1844
	$(QUIET_GEN)$(RM) $@ $@+ && \
1845
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
1846
	    $< >$@+ && \
1847 1848 1849
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
1850
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
1851 1852 1853 1854 1855 1856 1857 1858
	$(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

1859 1860 1861 1862 1863 1864
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+

1865
configure: configure.ac GIT-VERSION-FILE
1866
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
1867

1868
ifdef AUTOCONFIGURED
1869 1870 1871 1872 1873 1874
# 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
1875
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
1876
	if test -f config.status; then \
1877 1878 1879 1880 1881 1882 1883 1884 1885
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

1886 1887 1888 1889 1890 1891
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
1892
XDIFF_OBJS += xdiff/xhistogram.o
1893 1894

VCSSVN_OBJS += vcs-svn/line_buffer.o
1895
VCSSVN_OBJS += vcs-svn/sliding_window.o
1896 1897
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1898
VCSSVN_OBJS += vcs-svn/svndiff.o
1899 1900
VCSSVN_OBJS += vcs-svn/svndump.o

1901 1902 1903 1904 1905 1906 1907 1908
TEST_OBJS := $(patsubst test-%$X,test-%.o,$(TEST_PROGRAMS))
OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
	$(XDIFF_OBJS) \
	$(VCSSVN_OBJS) \
	git.o
ifndef NO_CURL
	OBJECTS += http.o http-walker.o remote-curl.o
endif
1909

1910
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1911
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1912

1913
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1914
$(dep_dirs):
1915
	@mkdir -p $@
1916 1917

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
1918
dep_file = $(dir $@).depend/$(notdir $@).d
1919
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
1920 1921
endif

1922
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1923 1924
dep_dirs =
missing_dep_dirs =
1925 1926 1927 1928 1929 1930 1931
dep_args =
endif

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

1932 1933
.SUFFIXES:

1934
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
1935
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1936
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
1937
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1938

1939
%.s: %.c GIT-CFLAGS FORCE
1940
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1941 1942

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
1943 1944
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
1945 1946 1947
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
1948 1949 1950 1951 1952 1953 1954 1955
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 已提交
1956

1957
$(OBJECTS): $(LIB_H)
1958
endif
1959

1960
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
1961
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
1962 1963 1964
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
1965

1966
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
1967
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
1968
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
1969

1970
config.sp config.s config.o: GIT-PREFIX
1971 1972
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
1973

1974
attr.sp attr.s attr.o: GIT-PREFIX
1975 1976
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
1977

1978
gettext.sp gettext.s gettext.o: GIT-PREFIX
1979 1980 1981
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

1982
http-push.sp http.sp http-walker.sp remote-curl.sp imap-send.sp: SPARSE_FLAGS += \
1983 1984
	-DCURL_DISABLE_TYPECHECK

1985
ifdef NO_EXPAT
1986
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
1987 1988
endif

1989
ifdef NO_REGEX
1990 1991
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
1992 1993
endif

1994
ifdef USE_NED_ALLOCATOR
1995
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
1996
	-DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR
1997
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
1998 1999
endif

2000
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2001
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2002

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

2007
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2008
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2009
		$(CURL_LIBCURL) $(LIBS)
2010
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2011
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
R
Remi Pommarel 已提交
2012
		$(CURL_LIBCURL) $(EXPAT_LIBEXPAT) $(LIBS)
2013

2014 2015 2016 2017
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)

2018 2019 2020 2021 2022 2023
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

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

P
Petr Baudis 已提交
2028
$(LIB_FILE): $(LIB_OBJS)
2029
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
P
Petr Baudis 已提交
2030

2031
$(XDIFF_LIB): $(XDIFF_OBJS)
2032
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2033

J
Jonathan Nieder 已提交
2034
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2035
	$(QUIET_AR)$(RM) $@ && $(AR) $(ARFLAGS) $@ $^
2036

2037 2038
export DEFAULT_EDITOR DEFAULT_PAGER

E
Elia Pinto 已提交
2039
.PHONY: doc man html info pdf
P
Petr Baudis 已提交
2040 2041 2042
doc:
	$(MAKE) -C Documentation all

2043 2044 2045 2046 2047 2048
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

2049 2050 2051
info:
	$(MAKE) -C Documentation info

2052 2053 2054
pdf:
	$(MAKE) -C Documentation pdf

2055 2056
XGETTEXT_FLAGS = \
	--force-po \
2057
	--add-comments=TRANSLATORS: \
2058 2059
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2060 2061
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2062 2063
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2064
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
2065
LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2066
LOCALIZED_SH = $(SCRIPT_SH) git-parse-remote.sh
2067
LOCALIZED_PERL = $(SCRIPT_PERL)
2068 2069 2070 2071 2072 2073

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

2075
po/git.pot: $(GENERATED_H) FORCE
2076 2077 2078
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2079 2080
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2081 2082
	mv $@+ $@

E
Elia Pinto 已提交
2083
.PHONY: pot
2084 2085
pot: po/git.pot

2086 2087 2088 2089 2090 2091 2092 2093 2094 2095
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 $@ $<

2096 2097 2098 2099
FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \
			$(FIND) . \( -name .git -type d -prune \) \
				-o \( -name '*.[hcS]' -type f -print \) )

2100 2101
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2102
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2103

2104
tags: FORCE
2105
	$(RM) tags
2106
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2107

K
Kristof Provost 已提交
2108 2109
cscope:
	$(RM) cscope*
2110
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2111

2112
### Detect prefix changes
2113 2114 2115 2116 2117 2118
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 \
2119
		echo >&2 "    * new prefix flags"; \
2120 2121 2122 2123
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2125
GIT-CFLAGS: FORCE
2126 2127
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2128
		echo >&2 "    * new build flags"; \
2129 2130 2131
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2132 2133 2134 2135 2136
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2141 2142 2143
# 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".
2144
GIT-BUILD-OPTIONS: FORCE
2145 2146 2147 2148 2149 2150
	@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)))'\' >>$@+
2151
	@echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@+
2152 2153 2154 2155
	@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)))'\' >>$@+
2156
ifdef TEST_OUTPUT_DIRECTORY
2157
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@+
2158
endif
2159
ifdef GIT_TEST_OPTS
2160
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@+
2161
endif
2162
ifdef GIT_TEST_CMP
2163
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@+
2164 2165
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
2166
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@+
2167
endif
2168 2169
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@+
2170
ifdef GIT_PERF_REPEAT_COUNT
2171
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@+
2172 2173
endif
ifdef GIT_PERF_REPO
2174
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@+
2175 2176
endif
ifdef GIT_PERF_LARGE_REPO
2177
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@+
2178 2179
endif
ifdef GIT_PERF_MAKE_OPTS
2180
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@+
2181
endif
2182
ifdef TEST_GIT_INDEX_VERSION
2183
	@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
2184
endif
2185
	@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
2186

2187 2188 2189
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2190

2191 2192
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2193
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2194
		echo >&2 "    * new Python interpreter location"; \
2195 2196 2197 2198
		echo "$$VARS" >$@; \
            fi
endif

2199 2200 2201
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2202
all:: $(NO_INSTALL)
2203 2204 2205 2206 2207 2208 2209

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)|' \
	     -e 's|@@PROG@@|$(@F)|' < $< > $@ && \
	chmod +x $@
2210

2211 2212 2213 2214
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2215
export NO_SVN_TESTS
2216
export TEST_NO_MALLOC_CHECK
2217

2218 2219
### Testing rules

2220
test: all
P
Petr Baudis 已提交
2221 2222
	$(MAKE) -C t/ all

2223 2224 2225 2226 2227
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

R
René Scharfe 已提交
2228 2229
test-ctype$X: ctype.o

2230
test-date$X: date.o ctype.o
P
Petr Baudis 已提交
2231

2232
test-delta$X: diff-delta.o patch-delta.o
P
Petr Baudis 已提交
2233

D
David Barr 已提交
2234 2235
test-line-buffer$X: vcs-svn/lib.a

2236
test-parse-options$X: parse-options.o parse-options-cb.o
2237

D
David Barr 已提交
2238 2239
test-svn-fe$X: vcs-svn/lib.a

2240
.PRECIOUS: $(TEST_OBJS)
2241

2242
test-%$X: test-%.o GIT-LDFLAGS $(GITLIBS)
D
David Barr 已提交
2243
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
2244

2245 2246 2247
check-sha1:: test-sha1$X
	./test-sha1.sh

2248 2249 2250 2251 2252 2253 2254 2255 2256
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)

2257
check: common-cmds.h
2258
	@if sparse; \
2259
	then \
2260
		echo >&2 "Use 'make sparse' instead"; \
2261
		$(MAKE) --no-print-directory sparse; \
2262
	else \
2263
		echo >&2 "Did you mean 'make test'?"; \
2264 2265
		exit 1; \
	fi
P
Petr Baudis 已提交
2266 2267 2268

### Installation rules

2269
ifneq ($(filter /%,$(firstword $(template_dir))),)
2270
template_instdir = $(template_dir)
2271 2272
else
template_instdir = $(prefix)/$(template_dir)
2273 2274 2275
endif
export template_instdir

2276
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2277
gitexec_instdir = $(gitexecdir)
2278 2279
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2280 2281 2282 2283
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2284 2285 2286 2287 2288 2289 2290
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2291 2292
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

E
Elia Pinto 已提交
2293
.PHONY: profile-install profile-fast-install
2294 2295 2296 2297 2298 2299
profile-install: profile
	$(MAKE) install

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

2300
install: all
2301
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2302 2303
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2304
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2305
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2306
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2307
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2308
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2309 2310 2311 2312 2313
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
2314
ifndef NO_PERL
2315
	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
J
Junio C Hamano 已提交
2316
	$(MAKE) -C gitweb install
2317
endif
E
Eygene Ryabinkin 已提交
2318
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2319
	$(MAKE) -C gitk-git install
2320
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2321
endif
2322
ifneq (,$X)
2323
	$(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';)
2324
endif
2325

2326
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2327
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2328
	{ test "$$bindir/" = "$$execdir/" || \
2329 2330
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2331
		test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
2332 2333 2334 2335
		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
	  done; \
	} && \
2336 2337
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
J
Junio C Hamano 已提交
2338
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2339 2340 2341 2342
		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 && \
2343
	for p in $(BUILT_INS); do \
2344
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2345
		test -z "$(NO_INSTALL_HARDLINKS)" && \
J
Jeff King 已提交
2346 2347 2348
		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; \
2349
	done && \
2350 2351
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2352
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2353
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2354 2355 2356
		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; \
2357
	done && \
2358
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2359

E
Elia Pinto 已提交
2360 2361
.PHONY: install-gitweb install-doc install-man install-html install-info install-pdf
.PHONY: quick-install-doc quick-install-man quick-install-html
2362 2363 2364
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2365 2366 2367
install-doc:
	$(MAKE) -C Documentation install

2368 2369 2370
install-man:
	$(MAKE) -C Documentation install-man

2371 2372 2373
install-html:
	$(MAKE) -C Documentation install-html

2374 2375 2376
install-info:
	$(MAKE) -C Documentation install-info

2377 2378 2379
install-pdf:
	$(MAKE) -C Documentation install-pdf

2380 2381
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2382

2383 2384 2385
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2386 2387 2388
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2389 2390 2391 2392


### Maintainer's dist rules

2393
git.spec: git.spec.in GIT-VERSION-FILE
2394 2395
	sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
	mv $@+ $@
2396

2397
GIT_TARNAME = git-$(GIT_VERSION)
2398
dist: git.spec git-archive$(X) configure
2399 2400
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2401
	@mkdir -p $(GIT_TARNAME)
2402
	@cp git.spec configure $(GIT_TARNAME)
2403
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2404
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2405
	$(TAR) rf $(GIT_TARNAME).tar \
2406
		$(GIT_TARNAME)/git.spec \
2407
		$(GIT_TARNAME)/configure \
2408
		$(GIT_TARNAME)/version \
2409
		$(GIT_TARNAME)/git-gui/version
2410
	@$(RM) -r $(GIT_TARNAME)
2411
	gzip -f -9 $(GIT_TARNAME).tar
2412 2413

rpm: dist
2414 2415 2416 2417
	$(RPMBUILD) \
		--define "_source_filedigest_algorithm md5" \
		--define "_binary_filedigest_algorithm md5" \
		-ta $(GIT_TARNAME).tar.gz
2418

2419 2420
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
E
Elia Pinto 已提交
2421
.PHONY: dist-doc distclean
2422
dist-doc:
2423
	$(RM) -r .doc-tmp-dir
2424 2425 2426 2427 2428
	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
	:
2429
	$(RM) -r .doc-tmp-dir
2430
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2431
	$(MAKE) -C Documentation DESTDIR=./ \
2432
		man1dir=../.doc-tmp-dir/man1 \
2433
		man5dir=../.doc-tmp-dir/man5 \
2434
		man7dir=../.doc-tmp-dir/man7 \
2435 2436 2437
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2438
	$(RM) -r .doc-tmp-dir
2439

P
Petr Baudis 已提交
2440
### Cleaning rules
2441

2442 2443
distclean: clean
	$(RM) configure
2444 2445 2446
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2447

2448 2449 2450 2451
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

2452
clean: profile-clean coverage-clean
2453
	$(RM) *.o *.res refs/*.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o
2454 2455
	$(RM) xdiff/*.o vcs-svn/*.o ewah/*.o builtin/*.o
	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2456
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2457
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
2458
	$(RM) -r bin-wrappers $(dep_dirs)
2459
	$(RM) -r po/build/
2460
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
2461 2462 2463
	$(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
2464
	$(MAKE) -C Documentation/ clean
2465
ifndef NO_PERL
2466
	$(MAKE) -C gitweb clean
2467
	$(MAKE) -C perl clean
2468
endif
P
Petr Baudis 已提交
2469
	$(MAKE) -C templates/ clean
2470
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2471
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2472
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2473 2474
	$(MAKE) -C git-gui clean
endif
2475
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2476 2477
	$(RM) GIT-USER-AGENT GIT-PREFIX
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PYTHON-VARS
2478

2479
.PHONY: all install profile-clean clean strip
2480
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2481
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2482

J
Junio C Hamano 已提交
2483 2484
### Check documentation
#
J
Jeff King 已提交
2485 2486 2487 2488
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2489
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
2490 2491

.PHONY: check-docs
J
Junio C Hamano 已提交
2492
check-docs::
J
Jeff King 已提交
2493
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2494 2495 2496
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2497
		git-merge-resolve | git-merge-subtree | \
2498
		git-fsck-objects | git-init-db | \
2499
		git-remote-* | git-stage | \
2500
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2501 2502 2503
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
2504
		sed -e '1,/^### command list/d' -e '/^#/d' command-list.txt | \
2505
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2506 2507 2508 2509
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2510 2511
	done; \
	( \
2512 2513
		sed -e '1,/^### command list/d' \
		    -e '/^#/d' \
2514
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2515
		    -e 's/^/listed /' command-list.txt; \
2516 2517
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2518 2519 2520 2521
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2522
		case " $(ALL_COMMANDS) " in \
2523 2524 2525 2526
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2527 2528 2529 2530 2531

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

2533 2534
### Test suite coverage testing
#
2535
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
2536
.PHONY: coverage-untested-functions cover_db cover_db_html
2537
.PHONY: coverage-clean-results
2538 2539

coverage:
2540
	$(MAKE) coverage-test
2541
	$(MAKE) coverage-untested-functions
2542

2543
object_dirs := $(sort $(dir $(OBJECTS)))
2544
coverage-clean-results:
2545 2546 2547
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2548
	$(RM) -r cover_db/
2549
	$(RM) -r cover_db_html/
2550

2551 2552 2553
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2554 2555
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2556
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2557

2558
coverage-compile:
2559
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2560 2561

coverage-test: coverage-clean-results coverage-compile
2562
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2563
		DEFAULT_TEST_TARGET=test -j1 test
2564 2565

coverage-report:
2566
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2567
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2568
	done
2569 2570

coverage-untested-functions: coverage-report
2571 2572
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2573
		> coverage-untested-functions
2574 2575 2576

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2577 2578 2579

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