Makefile 74.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 18 19 20
# Define SNPRINTF_RETURNS_BOGUS if your are on a system which snprintf()
# 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 22 23
# Define FREAD_READS_DIRECTORIES if your are on a system which succeeds
# 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.
#
33
# Define NO_CURL if you do not have libcurl installed.  git-http-fetch and
34
# git-http-push are not built, and you cannot use http:// and https://
35
# transports (neither smart nor dumb).
36
#
P
Patrick Mauritz 已提交
37 38 39
# Define CURLDIR=/foo/bar if your curl header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
40
# Define NO_EXPAT if you do not have expat installed.  git-http-push is
41
# not built, and you cannot push using http:// and https:// transports (dumb).
42
#
43 44 45
# Define EXPATDIR=/foo/bar if your expat header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
M
Matt Kraai 已提交
46 47 48
# 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.
#
49 50 51 52
# 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.
#
53 54 55
# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust
# the installed gettext translation of the shell scripts output.
#
56 57 58 59 60 61
# 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.
#
62 63 64 65
# Define CHARSET_LIB to you need to link with library other than -liconv to
# use locale_charset() function.  On some platforms this needs to set to
# -lcharset
#
66 67 68 69 70 71
# 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
#
72 73 74
# Define HAVE_PATHS_H if you have paths.h and want to use the default PATH
# it specifies.
#
75 76
# Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
#
77
# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
78
# d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
79
#
80 81
# Define HAVE_STRINGS_H if you have strings.h and need it for strcasecmp.
#
82 83
# Define NO_STRCASESTR if you don't have strcasestr.
#
R
René Scharfe 已提交
84 85
# Define NO_MEMMEM if you don't have memmem.
#
M
Matt Kraai 已提交
86 87
# Define NO_GETPAGESIZE if you don't have getpagesize.
#
88 89
# Define NO_STRLCPY if you don't have strlcpy.
#
90 91
# 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
92 93
# strtoull, define NO_STRTOULL.
#
J
Jason Riedy 已提交
94 95
# Define NO_SETENV if you don't have setenv in the C library.
#
96 97
# Define NO_UNSETENV if you don't have unsetenv in the C library.
#
98 99
# Define NO_MKDTEMP if you don't have mkdtemp in the C library.
#
100 101
# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
#
102 103
# Define NO_MKSTEMPS if you don't have mkstemps in the C library.
#
104 105
# Define NO_FNMATCH if you don't have fnmatch in the C library.
#
106 107 108
# Define NO_FNMATCH_CASEFOLD if your fnmatch function doesn't have the
# FNM_CASEFOLD GNU extension.
#
109
# Define NO_WILDMATCH if you do not want to use Git's wildmatch
110 111
# implementation as fnmatch
#
112 113 114
# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
# in the C library.
#
115 116
# Define NO_LIBGEN_H if you don't have libgen.h.
#
117 118
# Define NEEDS_LIBGEN if your libgen needs -lgen when linking
#
119 120
# Define NO_SYS_SELECT_H if you don't have sys/select.h.
#
121 122
# 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.
123
#
P
Pavel Roskin 已提交
124
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
E
Eric Wong 已提交
125 126 127
# 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.
#
128 129 130 131 132 133 134 135 136 137 138 139
# 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.
#
140 141 142 143
# 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.
#
144 145
# Define BLK_SHA1 environment variable to make use of the bundled
# optimized C SHA1 routine.
146
#
147 148
# Define PPC_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for PowerPC.
149
#
150 151 152
# 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).
153
#
154 155 156 157
# Define NEEDS_SSL_WITH_CURL if you need -lssl with -lcurl (Minix).
#
# Define NEEDS_IDN_WITH_CURL if you need -lidn when using -lcurl (Minix).
#
158
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
159
#
J
Joachim Schmitz 已提交
160 161 162 163 164 165
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
# Define NO_INTPTR_T if you don't have intptr_t nor uintptr_t.
#
# Define NO_UINTMAX_T if you don't have uintmax_t.
#
166 167 168
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
169 170 171 172
# 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.
#
173 174
# Define NO_MMAP if you want to avoid mmap.
#
175 176 177 178 179
# 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.
#
180 181 182
# 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.
183
#
J
Junio C Hamano 已提交
184 185
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
186
# Define NO_PREAD if you have a problem with pread() system call (e.g.
187
# cygwin1.dll before v1.5.22).
188
#
189 190 191 192 193
# 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
#
194 195 196
# Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
# thread-safe. (e.g. compat/pread.c or cygwin)
#
197 198 199
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
200 201 202
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
# the executable mode bit, but doesn't really do so.
#
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 225 226 227 228
# Define USE_NSEC below if you want git to care about sub-second file mtimes
# and ctimes. Note that you need recent glibc (at least 2.2.4) for this, and
# it will BREAK YOUR LOCAL DIFFS! show-diff and anything using it will likely
# randomly break unless your underlying filesystem supports those sub-second
# times (my ext3 doesn't).
229
#
230 231 232
# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
# "st_ctim"
#
233 234 235
# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
# available.  This automatically turns USE_NSEC off.
#
236
# Define USE_STDEV below if you want git to care about the underlying device
237
# change being considered an inode change from the update-index perspective.
238
#
239 240 241
# 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.
#
242 243 244
# 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 已提交
245 246
# Define ASCIIDOC_ROFF if your DocBook XSL does not escape raw roff directives
# (versions 1.68.1 through v1.72).
247
#
T
Thomas Rast 已提交
248 249 250 251
# 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.
#
252 253
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
254 255 256
# Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
# MakeMaker (e.g. using ActiveState under Cygwin).
#
257 258
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
259 260 261
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
# but /usr/bin/python2.7 on some platforms).
#
262 263
# Define NO_PYTHON if you do not want Python scripts or libraries at all.
#
E
Eygene Ryabinkin 已提交
264 265
# Define NO_TCLTK if you do not want Tcl/Tk GUI.
#
266 267 268 269 270
# 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.
271 272 273
# 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).
#
274 275 276 277
# 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().
#
278 279 280
# 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.
281
#
282 283
# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
# when hardlinking a file to another name and unlinking the original file right
284
# away (some NTFS drivers seem to zero the contents in that scenario).
285
#
286 287
# 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.
288
#
J
Junio C Hamano 已提交
289 290 291
# 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.
#
292 293
# Define USE_NED_ALLOCATOR if you want to replace the platforms default
# memory allocators with the nedmalloc allocator written by Niall Douglas.
294 295
#
# Define NO_REGEX if you have no or inferior regex support in your C library.
296
#
J
Jeff King 已提交
297 298 299
# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
# user.
#
300
# Define GETTEXT_POISON if you are debugging the choice of strings marked
301 302 303
# 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.
304
#
305 306
# Define JSMIN to point to JavaScript minifier that functions as
# a filter to have gitweb.js minified.
J
Junio C Hamano 已提交
307
#
308 309 310
# Define CSSMIN to point to a CSS minifier in order to generate a minified
# version of gitweb.css
#
311 312 313 314
# 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.
#
315 316 317 318 319 320 321
# 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'
322
#
323 324 325 326 327 328
# 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.
#
329 330
# Define CHECK_HEADER_DEPENDENCIES to check for problems in the hard-coded
# dependency rules.
J
Junio C Hamano 已提交
331
#
332
# Define NATIVE_CRLF if your platform uses CRLF for line endings.
333 334 335 336 337
#
# 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 已提交
338 339 340
#
# Define GIT_USER_AGENT if you want to change how git identifies itself during
# network interactions.  The default is "git/$(GIT_VERSION)".
341
#
342 343 344
# 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.
345

346
GIT-VERSION-FILE: FORCE
347
	@$(SHELL_PATH) ./GIT-VERSION-GEN
348
-include GIT-VERSION-FILE
349

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

352
CFLAGS = -g -O2 -Wall
J
Junio C Hamano 已提交
353
LDFLAGS =
354
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
355
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
356
STRIP ?= strip
357

358 359 360
# Among the variables below, these:
#   gitexecdir
#   template_dir
361
#   sysconfdir
362 363
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
364
# runtime figures out where they are based on the path to the executable.
365 366 367 368 369
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
370 371
# This can help installing the suite in a relocatable way.

372
prefix = $(HOME)
373 374
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
375 376
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
377
gitexecdir = libexec/git-core
378
mergetoolsdir = $(gitexecdir)/mergetools
379
sharedir = $(prefix)/share
380
gitwebdir = $(sharedir)/gitweb
381
localedir = $(sharedir)/locale
382
template_dir = share/git-core/templates
383
htmldir = $(prefix)/share/doc/git-doc
384
ETC_GITCONFIG = $(sysconfdir)/gitconfig
385
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
386
lib = lib
387
# DESTDIR =
388
pathsep = :
389

390 391 392 393
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

394
export prefix bindir sharedir sysconfdir gitwebdir localedir
395

396
CC = cc
397
AR = ar
398
RM = rm -f
399
DIFF = diff
400
TAR = tar
401
FIND = find
402 403
INSTALL = install
RPMBUILD = rpmbuild
404
TCL_PATH = tclsh
405
TCLTK_PATH = wish
406
XGETTEXT = xgettext
407
MSGFMT = msgfmt
408
PTHREAD_LIBS = -lpthread
409
PTHREAD_CFLAGS =
410
GCOV = gcov
411

412 413
export TCL_PATH TCLTK_PATH

414
SPARSE_FLAGS =
415

P
Petr Baudis 已提交
416 417 418 419


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

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

426 427 428 429 430
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
431 432
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
433
GENERATED_H =
434
EXTRA_CPPFLAGS =
435 436
LIB_H =
LIB_OBJS =
437
PROGRAM_OBJS =
438 439
PROGRAMS =
SCRIPT_PERL =
440
SCRIPT_PYTHON =
441
SCRIPT_SH =
442
SCRIPT_LIB =
443
TEST_PROGRAMS_NEED_X =
444

J
Jonathan Nieder 已提交
445 446 447 448 449 450
# 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

451 452
SCRIPT_SH += git-am.sh
SCRIPT_SH += git-bisect.sh
453
SCRIPT_SH += git-difftool--helper.sh
454 455 456 457 458 459 460 461
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-pull.sh
SCRIPT_SH += git-quiltimport.sh
SCRIPT_SH += git-rebase.sh
462
SCRIPT_SH += git-remote-testgit.sh
463 464 465 466 467
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

468 469
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
470 471 472
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
473
SCRIPT_LIB += git-sh-setup
474
SCRIPT_LIB += git-sh-i18n
475

476
SCRIPT_PERL += git-add--interactive.perl
477
SCRIPT_PERL += git-difftool.perl
478 479 480 481 482 483 484
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
485

P
Pete Wyckoff 已提交
486
SCRIPT_PYTHON += git-p4.py
487

488
NO_INSTALL += git-remote-testgit
489

490 491 492 493 494
# 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))

495 496 497 498
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))

499 500 501 502 503 504 505 506 507
# 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
508
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
509
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
510
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
511
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
512
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
513
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
514 515 516 517 518 519 520 521 522

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

523 524 525
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
526
	  git-instaweb
527

528 529
ETAGS_TARGET = TAGS

530 531
# Empty...
EXTRA_PROGRAMS =
532

533 534
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
535

536
PROGRAM_OBJS += credential-store.o
537
PROGRAM_OBJS += daemon.o
538
PROGRAM_OBJS += fast-import.o
539
PROGRAM_OBJS += http-backend.o
540
PROGRAM_OBJS += imap-send.o
541
PROGRAM_OBJS += sh-i18n--envsubst.o
542 543 544
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
545
PROGRAM_OBJS += remote-testsvn.o
546

547 548 549
# Binary suffix, set to .exe for Windows builds
X =

550
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
551

552 553 554 555 556 557
TEST_PROGRAMS_NEED_X += test-chmtime
TEST_PROGRAMS_NEED_X += test-ctype
TEST_PROGRAMS_NEED_X += test-date
TEST_PROGRAMS_NEED_X += test-delta
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
TEST_PROGRAMS_NEED_X += test-genrandom
J
Jeff King 已提交
558
TEST_PROGRAMS_NEED_X += test-index-version
D
David Barr 已提交
559
TEST_PROGRAMS_NEED_X += test-line-buffer
560
TEST_PROGRAMS_NEED_X += test-match-trees
R
René Scharfe 已提交
561
TEST_PROGRAMS_NEED_X += test-mergesort
J
Jeff King 已提交
562
TEST_PROGRAMS_NEED_X += test-mktemp
563 564
TEST_PROGRAMS_NEED_X += test-parse-options
TEST_PROGRAMS_NEED_X += test-path-utils
565
TEST_PROGRAMS_NEED_X += test-prio-queue
566
TEST_PROGRAMS_NEED_X += test-read-cache
567
TEST_PROGRAMS_NEED_X += test-regex
568
TEST_PROGRAMS_NEED_X += test-revision-walking
569
TEST_PROGRAMS_NEED_X += test-run-command
570
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
571 572
TEST_PROGRAMS_NEED_X += test-sha1
TEST_PROGRAMS_NEED_X += test-sigchain
573
TEST_PROGRAMS_NEED_X += test-string-list
574
TEST_PROGRAMS_NEED_X += test-subprocess
D
David Barr 已提交
575
TEST_PROGRAMS_NEED_X += test-svn-fe
576
TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
577
TEST_PROGRAMS_NEED_X += test-wildmatch
578

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

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

BUILT_INS += git-cherry$X
586
BUILT_INS += git-cherry-pick$X
587 588 589 590 591
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 已提交
592
BUILT_INS += git-stage$X
593 594
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
595

596 597
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
598
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
599

E
Eygene Ryabinkin 已提交
600
# what 'all' will build but not install in gitexecdir
601
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
602

603 604 605 606 607 608 609 610 611
# 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

612 613 614 615 616 617 618
# 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
619 620 621
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
622

L
Luben Tuikov 已提交
623
export PERL_PATH
624
export PYTHON_PATH
L
Luben Tuikov 已提交
625

626 627 628
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
629

J
Jeff King 已提交
630
GENERATED_H += common-cmds.h
631

632
LIB_H += advice.h
633
LIB_H += archive.h
634
LIB_H += argv-array.h
635
LIB_H += attr.h
J
Jeff King 已提交
636
LIB_H += bisect.h
637
LIB_H += blob.h
J
Jeff King 已提交
638
LIB_H += branch.h
639
LIB_H += builtin.h
640
LIB_H += bulk-checkin.h
J
Jeff King 已提交
641
LIB_H += bundle.h
642
LIB_H += cache-tree.h
J
Jeff King 已提交
643
LIB_H += cache.h
644
LIB_H += color.h
J
Jeff King 已提交
645
LIB_H += column.h
646
LIB_H += commit.h
647
LIB_H += compat/bswap.h
648
LIB_H += compat/mingw.h
649
LIB_H += compat/obstack.h
650
LIB_H += compat/poll/poll.h
651
LIB_H += compat/precompose_utf8.h
J
Jeff King 已提交
652
LIB_H += compat/terminal.h
653
LIB_H += compat/win32/dirent.h
654
LIB_H += compat/win32/pthread.h
M
Mike Pape 已提交
655
LIB_H += compat/win32/syslog.h
656
LIB_H += connected.h
657
LIB_H += convert.h
J
Jeff King 已提交
658
LIB_H += credential.h
659 660 661 662
LIB_H += csum-file.h
LIB_H += decorate.h
LIB_H += delta.h
LIB_H += diff.h
663
LIB_H += diffcore.h
664
LIB_H += dir.h
665
LIB_H += exec_cmd.h
J
Jeff King 已提交
666
LIB_H += fetch-pack.h
667
LIB_H += fmt-merge-msg.h
668
LIB_H += fsck.h
669
LIB_H += gettext.h
670
LIB_H += git-compat-util.h
671
LIB_H += gpg-interface.h
A
Adam Simpkins 已提交
672
LIB_H += graph.h
673 674
LIB_H += grep.h
LIB_H += hash.h
675
LIB_H += help.h
J
Jeff King 已提交
676
LIB_H += http.h
F
Fredrik Kuivinen 已提交
677
LIB_H += kwset.h
678
LIB_H += levenshtein.h
679
LIB_H += line-log.h
B
Bo Yang 已提交
680
LIB_H += line-range.h
681 682 683 684
LIB_H += list-objects.h
LIB_H += ll-merge.h
LIB_H += log-tree.h
LIB_H += mailmap.h
685
LIB_H += merge-blobs.h
686
LIB_H += merge-recursive.h
R
René Scharfe 已提交
687
LIB_H += mergesort.h
J
Jeff King 已提交
688
LIB_H += notes-cache.h
689
LIB_H += notes-merge.h
690
LIB_H += notes-utils.h
J
Jeff King 已提交
691
LIB_H += notes.h
692 693
LIB_H += object.h
LIB_H += pack-revindex.h
J
Jeff King 已提交
694
LIB_H += pack.h
695 696
LIB_H += parse-options.h
LIB_H += patch-ids.h
697
LIB_H += pathspec.h
698
LIB_H += pkt-line.h
699
LIB_H += prio-queue.h
700
LIB_H += progress.h
701
LIB_H += prompt.h
702
LIB_H += quote.h
J
Jeff King 已提交
703
LIB_H += reachable.h
704 705 706
LIB_H += reflog-walk.h
LIB_H += refs.h
LIB_H += remote.h
707
LIB_H += rerere.h
708
LIB_H += resolve-undo.h
709 710
LIB_H += revision.h
LIB_H += run-command.h
J
Jeff King 已提交
711
LIB_H += send-pack.h
712
LIB_H += sequencer.h
713
LIB_H += sha1-array.h
714
LIB_H += sha1-lookup.h
J
Jeff King 已提交
715
LIB_H += shortlog.h
716
LIB_H += sideband.h
717
LIB_H += sigchain.h
718
LIB_H += strbuf.h
719
LIB_H += streaming.h
720
LIB_H += string-list.h
721
LIB_H += submodule.h
722
LIB_H += tag.h
J
Jeff King 已提交
723
LIB_H += tar.h
724
LIB_H += thread-utils.h
725 726
LIB_H += transport.h
LIB_H += tree-walk.h
J
Jeff King 已提交
727
LIB_H += tree.h
728
LIB_H += unpack-trees.h
J
Jeff King 已提交
729
LIB_H += url.h
730
LIB_H += urlmatch.h
731
LIB_H += userdiff.h
732
LIB_H += utf8.h
733
LIB_H += varint.h
734 735 736 737 738 739
LIB_H += vcs-svn/fast_export.h
LIB_H += vcs-svn/line_buffer.h
LIB_H += vcs-svn/repo_tree.h
LIB_H += vcs-svn/sliding_window.h
LIB_H += vcs-svn/svndiff.h
LIB_H += vcs-svn/svndump.h
J
Jeff King 已提交
740
LIB_H += walker.h
741
LIB_H += wildmatch.h
J
Jeff King 已提交
742
LIB_H += wt-status.h
743 744
LIB_H += xdiff-interface.h
LIB_H += xdiff/xdiff.h
745 746 747 748 749 750 751
LIB_H += xdiff/xdiffi.h
LIB_H += xdiff/xemit.h
LIB_H += xdiff/xinclude.h
LIB_H += xdiff/xmacros.h
LIB_H += xdiff/xprepare.h
LIB_H += xdiff/xtypes.h
LIB_H += xdiff/xutils.h
752

753
LIB_OBJS += abspath.o
754
LIB_OBJS += advice.o
755 756 757 758 759
LIB_OBJS += alias.o
LIB_OBJS += alloc.o
LIB_OBJS += archive.o
LIB_OBJS += archive-tar.o
LIB_OBJS += archive-zip.o
760
LIB_OBJS += argv-array.o
761 762
LIB_OBJS += attr.o
LIB_OBJS += base85.o
763
LIB_OBJS += bisect.o
764 765
LIB_OBJS += blob.o
LIB_OBJS += branch.o
766
LIB_OBJS += bulk-checkin.o
767 768 769
LIB_OBJS += bundle.o
LIB_OBJS += cache-tree.o
LIB_OBJS += color.o
770
LIB_OBJS += column.o
771 772
LIB_OBJS += combine-diff.o
LIB_OBJS += commit.o
773
LIB_OBJS += compat/obstack.o
J
Jeff King 已提交
774
LIB_OBJS += compat/terminal.o
775 776
LIB_OBJS += config.o
LIB_OBJS += connect.o
777
LIB_OBJS += connected.o
778 779
LIB_OBJS += convert.o
LIB_OBJS += copy.o
J
Jeff King 已提交
780
LIB_OBJS += credential.o
781 782 783 784 785 786 787 788 789 790 791
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
792
LIB_OBJS += diff-no-index.o
793 794
LIB_OBJS += diff.o
LIB_OBJS += dir.o
795
LIB_OBJS += editor.o
796 797 798
LIB_OBJS += entry.o
LIB_OBJS += environment.o
LIB_OBJS += exec_cmd.o
799
LIB_OBJS += fetch-pack.o
800
LIB_OBJS += fsck.o
801
LIB_OBJS += gettext.o
802
LIB_OBJS += gpg-interface.o
A
Adam Simpkins 已提交
803
LIB_OBJS += graph.o
804 805 806
LIB_OBJS += grep.o
LIB_OBJS += hash.o
LIB_OBJS += help.o
L
Linus Torvalds 已提交
807
LIB_OBJS += hex.o
808
LIB_OBJS += ident.o
F
Fredrik Kuivinen 已提交
809
LIB_OBJS += kwset.o
810
LIB_OBJS += levenshtein.o
811
LIB_OBJS += line-log.o
B
Bo Yang 已提交
812
LIB_OBJS += line-range.o
813 814 815 816 817 818
LIB_OBJS += list-objects.o
LIB_OBJS += ll-merge.o
LIB_OBJS += lockfile.o
LIB_OBJS += log-tree.o
LIB_OBJS += mailmap.o
LIB_OBJS += match-trees.o
819
LIB_OBJS += merge.o
820
LIB_OBJS += merge-blobs.o
821
LIB_OBJS += merge-recursive.o
R
René Scharfe 已提交
822
LIB_OBJS += mergesort.o
823
LIB_OBJS += name-hash.o
J
Johannes Schindelin 已提交
824
LIB_OBJS += notes.o
J
Jeff King 已提交
825
LIB_OBJS += notes-cache.o
826
LIB_OBJS += notes-merge.o
827
LIB_OBJS += notes-utils.o
828 829 830 831 832 833
LIB_OBJS += object.o
LIB_OBJS += pack-check.o
LIB_OBJS += pack-revindex.o
LIB_OBJS += pack-write.o
LIB_OBJS += pager.o
LIB_OBJS += parse-options.o
834
LIB_OBJS += parse-options-cb.o
835 836 837
LIB_OBJS += patch-delta.o
LIB_OBJS += patch-ids.o
LIB_OBJS += path.o
838
LIB_OBJS += pathspec.o
839
LIB_OBJS += pkt-line.o
840
LIB_OBJS += preload-index.o
841
LIB_OBJS += pretty.o
842
LIB_OBJS += prio-queue.o
843
LIB_OBJS += progress.o
844
LIB_OBJS += prompt.o
845 846 847 848 849 850
LIB_OBJS += quote.o
LIB_OBJS += reachable.o
LIB_OBJS += read-cache.o
LIB_OBJS += reflog-walk.o
LIB_OBJS += refs.o
LIB_OBJS += remote.o
851
LIB_OBJS += replace_object.o
852
LIB_OBJS += rerere.o
853
LIB_OBJS += resolve-undo.o
854 855
LIB_OBJS += revision.o
LIB_OBJS += run-command.o
856
LIB_OBJS += send-pack.o
857
LIB_OBJS += sequencer.o
858 859
LIB_OBJS += server-info.o
LIB_OBJS += setup.o
860
LIB_OBJS += sha1-array.o
861
LIB_OBJS += sha1-lookup.o
862
LIB_OBJS += sha1_file.o
863 864 865
LIB_OBJS += sha1_name.o
LIB_OBJS += shallow.o
LIB_OBJS += sideband.o
866
LIB_OBJS += sigchain.o
867
LIB_OBJS += strbuf.o
868
LIB_OBJS += streaming.o
869
LIB_OBJS += string-list.o
870
LIB_OBJS += submodule.o
871 872 873 874
LIB_OBJS += symlinks.o
LIB_OBJS += tag.o
LIB_OBJS += trace.o
LIB_OBJS += transport.o
875
LIB_OBJS += transport-helper.o
876 877 878 879
LIB_OBJS += tree-diff.o
LIB_OBJS += tree.o
LIB_OBJS += tree-walk.o
LIB_OBJS += unpack-trees.o
J
Jeff King 已提交
880
LIB_OBJS += url.o
881
LIB_OBJS += urlmatch.o
882
LIB_OBJS += usage.o
883
LIB_OBJS += userdiff.o
884
LIB_OBJS += utf8.o
885
LIB_OBJS += varint.o
886
LIB_OBJS += version.o
887
LIB_OBJS += walker.o
888
LIB_OBJS += wildmatch.o
889
LIB_OBJS += wrapper.o
890 891 892 893
LIB_OBJS += write_or_die.o
LIB_OBJS += ws.o
LIB_OBJS += wt-status.o
LIB_OBJS += xdiff-interface.o
894
LIB_OBJS += zlib.o
895

896 897 898 899 900 901 902 903 904 905
BUILTIN_OBJS += builtin/add.o
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 已提交
906
BUILTIN_OBJS += builtin/check-ignore.o
907
BUILTIN_OBJS += builtin/check-mailmap.o
908 909 910 911 912
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
913
BUILTIN_OBJS += builtin/column.o
914 915 916 917
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
918
BUILTIN_OBJS += builtin/credential.o
919 920 921 922 923 924 925 926 927 928 929 930
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
931
BUILTIN_OBJS += builtin/get-tar-commit-id.o
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
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
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 已提交
954
BUILTIN_OBJS += builtin/notes.o
955 956 957 958 959 960 961 962 963 964 965
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
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 已提交
966
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
967
BUILTIN_OBJS += builtin/remote-fd.o
968
BUILTIN_OBJS += builtin/repack.o
969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
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
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
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
BUILTIN_OBJS += builtin/write-tree.o
993

994
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
995
EXTLIBS =
996

J
Jeff King 已提交
997 998
GIT_USER_AGENT = git/$(GIT_VERSION)

999
include config.mak.uname
1000
-include config.mak.autogen
1001
-include config.mak
1002

1003 1004 1005 1006 1007 1008 1009 1010
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

1011
ifdef CHECK_HEADER_DEPENDENCIES
1012
COMPUTE_HEADER_DEPENDENCIES = no
1013
USE_COMPUTED_HEADER_DEPENDENCIES =
1014 1015
endif

1016
ifndef COMPUTE_HEADER_DEPENDENCIES
1017 1018 1019 1020
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
1021
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
1022 1023
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
1024
	echo $$?)
1025
ifeq ($(dep_check),0)
1026 1027 1028
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1029
endif
1030 1031
endif

1032
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1033
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1034 1035 1036 1037 1038
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1039 1040
endif

1041
ifdef SANE_TOOL_PATH
1042 1043
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1044 1045
PATH := $(SANE_TOOL_PATH):${PATH}
else
1046
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1047 1048
endif

G
Gary V. Vaughan 已提交
1049 1050 1051 1052
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1053 1054 1055 1056
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
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
1070 1071 1072 1073
	ifndef NO_APPLE_COMMON_CRYPTO
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1074
	NO_REGEX = YesPlease
1075
	PTHREAD_LIBS =
1076 1077
endif

1078 1079 1080 1081 1082 1083 1084 1085
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
1086 1087
endif

1088 1089 1090 1091 1092
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

M
Michał Kiedrowicz 已提交
1093 1094 1095 1096 1097 1098 1099 1100 1101
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

D
Daniel Barkalow 已提交
1102 1103
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1104 1105 1106
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1107
else
1108
	ifdef CURLDIR
1109
		# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
1110
		BASIC_CFLAGS += -I$(CURLDIR)/include
1111
		CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib) -lcurl
1112 1113 1114
	else
		CURL_LIBCURL = -lcurl
	endif
1115
	ifdef NEEDS_SSL_WITH_CURL
1116
		CURL_LIBCURL += -lssl
1117 1118 1119 1120 1121 1122 1123 1124
		ifdef NEEDS_CRYPTO_WITH_SSL
			CURL_LIBCURL += -lcrypto
		endif
	endif
	ifdef NEEDS_IDN_WITH_CURL
		CURL_LIBCURL += -lidn
	endif

1125 1126 1127
	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)
1128 1129
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1130
	curl_check := $(shell (echo 070908; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p)
1131 1132
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1133
			PROGRAM_OBJS += http-push.o
1134
		endif
1135
	endif
1136
	ifndef NO_EXPAT
1137 1138 1139 1140 1141 1142
		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 已提交
1143 1144 1145
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1146
	endif
1147 1148
endif

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

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

1386
ifdef NO_ICONV
1387
	BASIC_CFLAGS += -DNO_ICONV
1388 1389
endif

1390 1391 1392 1393
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1394 1395 1396 1397
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1398 1399 1400 1401
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1402 1403 1404
ifdef BLK_SHA1
	SHA1_HEADER = "block-sha1/sha1.h"
	LIB_OBJS += block-sha1/sha1.o
1405
	LIB_H += block-sha1/sha1.h
1406
else
1407 1408 1409
ifdef PPC_SHA1
	SHA1_HEADER = "ppc/sha1.h"
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1410
	LIB_H += ppc/sha1.h
1411 1412 1413 1414
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
	SHA1_HEADER = <CommonCrypto/CommonDigest.h>
1415 1416
else
	SHA1_HEADER = <openssl/sha.h>
1417
	EXTLIBS += $(LIB_4_CRYPTO)
1418 1419
endif
endif
1420 1421
endif

1422 1423 1424
ifdef NO_PERL_MAKEMAKER
	export NO_PERL_MAKEMAKER
endif
1425 1426 1427 1428
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1429 1430 1431 1432
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1433 1434 1435
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1436 1437 1438 1439
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
1440 1441 1442
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1443

J
Junio C Hamano 已提交
1444 1445 1446
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1447
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1448
	EXTLIBS += $(PTHREAD_LIBS)
1449
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1450
endif
1451

1452 1453 1454 1455
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1456 1457
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1458
	EXTLIBS += $(CHARSET_LIB)
1459 1460
endif

1461 1462 1463 1464
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1465 1466 1467 1468
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1469 1470 1471
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1472 1473 1474
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1475 1476 1477 1478
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
N
Nicolas Pitre 已提交
1479

1480
ifdef USE_NED_ALLOCATOR
1481
       COMPAT_CFLAGS += -Icompat/nedmalloc
1482 1483 1484
       COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
endif

1485 1486 1487 1488
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1489 1490 1491 1492
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1493 1494 1495 1496
ifneq (,$(XDL_FAST_HASH))
	BASIC_CFLAGS += -DXDL_FAST_HASH
endif

1497
ifeq ($(TCLTK_PATH),)
1498
NO_TCLTK = NoThanks
1499 1500
endif

1501
ifeq ($(PERL_PATH),)
1502
NO_PERL = NoThanks
1503 1504
endif

1505
ifeq ($(PYTHON_PATH),)
1506
NO_PYTHON = NoThanks
1507 1508
endif

1509
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1510 1511
QUIET_SUBDIR1  =

1512 1513 1514 1515 1516 1517
ifneq ($(findstring $(MAKEFLAGS),w),w)
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1518
ifneq ($(findstring $(MAKEFLAGS),s),s)
S
Shawn O. Pearce 已提交
1519
ifndef V
A
Alex Riesen 已提交
1520
	QUIET_CC       = @echo '   ' CC $@;
1521 1522 1523 1524
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1525
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1526
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1527
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1528
	QUIET_GCOV     = @echo '   ' GCOV $@;
1529
	QUIET_SP       = @echo '   ' SP $<;
1530
	QUIET_RC       = @echo '   ' RC $@;
1531
	QUIET_SUBDIR0  = +@subdir=
1532 1533
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1534
	export V
A
Alex Riesen 已提交
1535
	export QUIET_GEN
1536 1537
	export QUIET_BUILT_IN
endif
1538
endif
1539

J
Junio C Hamano 已提交
1540 1541 1542 1543
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1544 1545 1546 1547 1548 1549 1550
### profile feedback build
#

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

1551
ifeq ("$(PROFILE)","GEN")
1552 1553
	CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
	EXTLIBS += -lgcov
1554 1555
	export CCACHE_DISABLE = t
	V = 1
1556 1557
else
ifneq ("$(PROFILE)","")
1558
	CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1559 1560
	export CCACHE_DISABLE = t
	V = 1
1561
endif
1562
endif
1563

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

SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
1567
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1568
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1569 1570 1571

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1572
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1573 1574
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1575
localedir_SQ = $(subst ','\'',$(localedir))
1576 1577
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
1578
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1579
prefix_SQ = $(subst ','\'',$(prefix))
1580
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1581 1582 1583

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1584
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1585
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1586
DIFF_SQ = $(subst ','\'',$(DIFF))
1587
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1588

1589 1590
LIBS = $(GITLIBS) $(EXTLIBS)

1591
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
1592
	$(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1593
LIB_OBJS += $(COMPAT_OBJS)
1594

1595 1596 1597 1598 1599 1600 1601 1602 1603
# 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

1604 1605 1606 1607 1608 1609 1610
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

1611 1612 1613 1614 1615 1616 1617
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 已提交
1618 1619 1620
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))
1621 1622 1623 1624
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 已提交
1625

1626 1627 1628 1629
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1630 1631 1632
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1633
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1634 1635


P
Petr Baudis 已提交
1636 1637
### Build rules

1638 1639
SHELL = $(SHELL_PATH)

1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
all:: shell_compatibility_test

ifeq "$(PROFILE)" "BUILD"
ifeq ($(filter all,$(MAKECMDGOALS)),all)
all:: profile-clean
	$(MAKE) PROFILE=GEN all
	$(MAKE) PROFILE=GEN -j1 test
endif
endif

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

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

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

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

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

1716
help.sp help.s help.o: common-cmds.h
1717

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

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

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

J
Junio C Hamano 已提交
1735
common-cmds.h: ./generate-cmdlist.sh command-list.txt
1736

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

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

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


$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh GIT-SCRIPT-DEFINES
1766
	$(QUIET_GEN)$(cmd_munge_script) && \
1767
	chmod +x $@+ && \
1768
	mv $@+ $@
1769

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

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

1779
ifndef NO_PERL
1780 1781
$(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak

1782 1783 1784
perl/perl.mak: perl/PM.stamp

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

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

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

1810 1811 1812 1813 1814 1815 1816
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

1817 1818 1819 1820 1821

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

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

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

1854 1855 1856 1857 1858 1859
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+

1860
configure: configure.ac GIT-VERSION-FILE
1861
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
1862

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

1881 1882 1883 1884 1885 1886
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
1887
XDIFF_OBJS += xdiff/xhistogram.o
1888 1889

VCSSVN_OBJS += vcs-svn/line_buffer.o
1890
VCSSVN_OBJS += vcs-svn/sliding_window.o
1891 1892
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1893
VCSSVN_OBJS += vcs-svn/svndiff.o
1894 1895
VCSSVN_OBJS += vcs-svn/svndump.o

1896 1897 1898 1899 1900 1901 1902 1903
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
1904

1905
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1906
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1907

1908
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1909
$(dep_dirs):
1910
	@mkdir -p $@
1911 1912

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
1913
dep_file = $(dir $@).depend/$(notdir $@).d
1914
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
1915 1916 1917 1918 1919 1920
ifdef CHECK_HEADER_DEPENDENCIES
$(error cannot compute header dependencies outside a normal build. \
Please unset CHECK_HEADER_DEPENDENCIES and try again)
endif
endif

1921
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1922
ifndef CHECK_HEADER_DEPENDENCIES
1923 1924
dep_dirs =
missing_dep_dirs =
1925 1926
dep_args =
endif
1927 1928
endif

1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942
ifdef CHECK_HEADER_DEPENDENCIES
ifndef PRINT_HEADER_DEPENDENCIES
missing_deps = $(filter-out $(notdir $^), \
	$(notdir $(shell $(MAKE) -s $@ \
		CHECK_HEADER_DEPENDENCIES=YesPlease \
		USE_COMPUTED_HEADER_DEPENDENCIES=YesPlease \
		PRINT_HEADER_DEPENDENCIES=YesPlease)))
endif
endif

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

1943 1944
.SUFFIXES:

1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978
ifdef PRINT_HEADER_DEPENDENCIES
$(C_OBJ): %.o: %.c FORCE
	echo $^
$(ASM_OBJ): %.o: %.S FORCE
	echo $^

ifndef CHECK_HEADER_DEPENDENCIES
$(error cannot print header dependencies during a normal build. \
Please set CHECK_HEADER_DEPENDENCIES and try again)
endif
endif

ifndef PRINT_HEADER_DEPENDENCIES
ifdef CHECK_HEADER_DEPENDENCIES
$(C_OBJ): %.o: %.c $(dep_files) FORCE
	@set -e; echo CHECK $@; \
	missing_deps="$(missing_deps)"; \
	if test "$$missing_deps"; \
	then \
		echo missing dependencies: $$missing_deps; \
		false; \
	fi
$(ASM_OBJ): %.o: %.S $(dep_files) FORCE
	@set -e; echo CHECK $@; \
	missing_deps="$(missing_deps)"; \
	if test "$$missing_deps"; \
	then \
		echo missing dependencies: $$missing_deps; \
		false; \
	fi
endif
endif

ifndef CHECK_HEADER_DEPENDENCIES
1979
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
1980
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1981
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
1982
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1983
endif
1984

1985
%.s: %.c GIT-CFLAGS FORCE
1986
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1987 1988

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

2003
$(OBJECTS): $(LIB_H)
2004
endif
2005

2006
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
2007
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
2008 2009 2010
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
2011

2012
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2013
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2014
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2015

2016
config.sp config.s config.o: GIT-PREFIX
2017 2018
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2019

2020
attr.sp attr.s attr.o: GIT-PREFIX
2021 2022
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2023

2024
gettext.sp gettext.s gettext.o: GIT-PREFIX
2025 2026 2027
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2028 2029 2030
http-push.sp http.sp http-walker.sp remote-curl.sp: SPARSE_FLAGS += \
	-DCURL_DISABLE_TYPECHECK

2031
ifdef NO_EXPAT
2032
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2033 2034
endif

2035
ifdef NO_REGEX
2036 2037
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2038 2039
endif

2040
ifdef USE_NED_ALLOCATOR
2041
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2042
	-DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR
2043
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2044 2045
endif

2046
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2047
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2048

2049
git-imap-send$X: imap-send.o GIT-LDFLAGS $(GITLIBS)
R
Robert Shearman 已提交
2050
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
2051
		$(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)
2052

2053
git-http-fetch$X: revision.o http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2054
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
2055
		$(LIBS) $(CURL_LIBCURL)
2056
git-http-push$X: revision.o http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2057
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
2058 2059
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)

2060 2061 2062 2063
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)

2064 2065 2066 2067 2068 2069
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

2070
$(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o GIT-LDFLAGS $(GITLIBS)
2071 2072 2073
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)

P
Petr Baudis 已提交
2074
$(LIB_FILE): $(LIB_OBJS)
2075
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
P
Petr Baudis 已提交
2076

2077
$(XDIFF_LIB): $(XDIFF_OBJS)
2078
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
2079

J
Jonathan Nieder 已提交
2080
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2081
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
2082

2083 2084
export DEFAULT_EDITOR DEFAULT_PAGER

P
Petr Baudis 已提交
2085 2086 2087
doc:
	$(MAKE) -C Documentation all

2088 2089 2090 2091 2092 2093
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

2094 2095 2096
info:
	$(MAKE) -C Documentation info

2097 2098 2099
pdf:
	$(MAKE) -C Documentation pdf

2100 2101 2102 2103 2104
XGETTEXT_FLAGS = \
	--force-po \
	--add-comments \
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2105 2106
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2107 2108
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2109
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
2110
LOCALIZED_C := $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2111
LOCALIZED_SH := $(SCRIPT_SH)
2112 2113 2114 2115 2116 2117 2118
LOCALIZED_PERL := $(SCRIPT_PERL)

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

po/git.pot: $(LOCALIZED_C)
2121 2122 2123
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2124 2125
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2126 2127 2128 2129
	mv $@+ $@

pot: po/git.pot

2130 2131 2132 2133 2134 2135 2136 2137 2138 2139
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 $@ $<

2140 2141 2142 2143
FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \
			$(FIND) . \( -name .git -type d -prune \) \
				-o \( -name '*.[hcS]' -type f -print \) )

2144 2145
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2146
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2147

2148
tags: FORCE
2149
	$(RM) tags
2150
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2151

K
Kristof Provost 已提交
2152 2153
cscope:
	$(RM) cscope*
2154
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2155

2156
### Detect prefix changes
2157 2158 2159 2160 2161 2162
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 \
2163
		echo >&2 "    * new prefix flags"; \
2164 2165 2166 2167
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2169
GIT-CFLAGS: FORCE
2170 2171
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2172
		echo >&2 "    * new build flags"; \
2173 2174 2175
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2176 2177 2178 2179 2180
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2185 2186 2187
# 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".
2188
GIT-BUILD-OPTIONS: FORCE
J
Junio C Hamano 已提交
2189
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@
2190
	@echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@
2191
	@echo DIFF=\''$(subst ','\'',$(subst ','\'',$(DIFF)))'\' >>$@
2192
	@echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@
J
Junio C Hamano 已提交
2193
	@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@
J
Jeff King 已提交
2194
	@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@
2195
	@echo USE_LIBPCRE=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE)))'\' >>$@
2196
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@
J
Jeff King 已提交
2197
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@
2198
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@
2199 2200 2201
ifdef TEST_OUTPUT_DIRECTORY
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@
endif
2202 2203 2204
ifdef GIT_TEST_OPTS
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@
endif
2205 2206 2207 2208 2209 2210
ifdef GIT_TEST_CMP
	@echo GIT_TEST_CMP=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_CMP)))'\' >>$@
endif
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	@echo GIT_TEST_CMP_USE_COPIED_CONTEXT=YesPlease >>$@
endif
2211
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@
2212
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@
2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224
ifdef GIT_PERF_REPEAT_COUNT
	@echo GIT_PERF_REPEAT_COUNT=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPEAT_COUNT)))'\' >>$@
endif
ifdef GIT_PERF_REPO
	@echo GIT_PERF_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_REPO)))'\' >>$@
endif
ifdef GIT_PERF_LARGE_REPO
	@echo GIT_PERF_LARGE_REPO=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_LARGE_REPO)))'\' >>$@
endif
ifdef GIT_PERF_MAKE_OPTS
	@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@
endif
2225

2226 2227 2228
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2229

2230 2231
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2232
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2233
		echo >&2 "    * new Python interpreter location"; \
2234 2235 2236 2237
		echo "$$VARS" >$@; \
            fi
endif

2238 2239 2240
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2241
all:: $(NO_INSTALL)
2242 2243 2244 2245 2246 2247 2248

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 $@
2249

2250 2251 2252 2253
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2254
export NO_SVN_TESTS
2255
export TEST_NO_MALLOC_CHECK
2256

2257 2258
### Testing rules

2259
test: all
P
Petr Baudis 已提交
2260 2261
	$(MAKE) -C t/ all

2262 2263 2264 2265 2266
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

R
René Scharfe 已提交
2267 2268
test-ctype$X: ctype.o

2269
test-date$X: date.o ctype.o
P
Petr Baudis 已提交
2270

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

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

2275
test-parse-options$X: parse-options.o parse-options-cb.o
2276

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

2279
.PRECIOUS: $(TEST_OBJS)
2280

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

2284 2285 2286
check-sha1:: test-sha1$X
	./test-sha1.sh

2287 2288 2289 2290 2291 2292 2293 2294 2295
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)

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

### Installation rules

2308
ifneq ($(filter /%,$(firstword $(template_dir))),)
2309
template_instdir = $(template_dir)
2310 2311
else
template_instdir = $(prefix)/$(template_dir)
2312 2313 2314
endif
export template_instdir

2315
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2316
gitexec_instdir = $(gitexecdir)
2317 2318
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2319 2320 2321 2322
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2323 2324 2325 2326 2327 2328 2329
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2330 2331
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

2332
install: all
2333
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2334 2335
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2336
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2337
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2338
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2339
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2340
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2341 2342 2343 2344 2345
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
2346
ifndef NO_PERL
2347
	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
J
Junio C Hamano 已提交
2348
	$(MAKE) -C gitweb install
2349
endif
E
Eygene Ryabinkin 已提交
2350
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2351
	$(MAKE) -C gitk-git install
2352
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2353
endif
2354
ifneq (,$X)
2355
	$(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';)
2356
endif
2357

2358
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2359
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2360
	{ test "$$bindir/" = "$$execdir/" || \
2361 2362
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2363
		test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
2364 2365 2366 2367
		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
	  done; \
	} && \
2368 2369
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
J
Junio C Hamano 已提交
2370
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2371 2372 2373 2374
		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 && \
2375
	for p in $(BUILT_INS); do \
2376
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2377
		test -z "$(NO_INSTALL_HARDLINKS)" && \
J
Jeff King 已提交
2378 2379 2380
		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; \
2381
	done && \
2382 2383
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2384
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2385
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2386 2387 2388
		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; \
2389
	done && \
2390
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2391

2392 2393 2394
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2395 2396 2397
install-doc:
	$(MAKE) -C Documentation install

2398 2399 2400
install-man:
	$(MAKE) -C Documentation install-man

2401 2402 2403
install-html:
	$(MAKE) -C Documentation install-html

2404 2405 2406
install-info:
	$(MAKE) -C Documentation install-info

2407 2408 2409
install-pdf:
	$(MAKE) -C Documentation install-pdf

2410 2411
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2412

2413 2414 2415
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2416 2417 2418
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2419 2420 2421 2422


### Maintainer's dist rules

2423
git.spec: git.spec.in GIT-VERSION-FILE
2424 2425
	sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
	mv $@+ $@
2426

2427
GIT_TARNAME = git-$(GIT_VERSION)
2428
dist: git.spec git-archive$(X) configure
2429 2430
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2431
	@mkdir -p $(GIT_TARNAME)
2432
	@cp git.spec configure $(GIT_TARNAME)
2433
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2434
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2435
	$(TAR) rf $(GIT_TARNAME).tar \
2436
		$(GIT_TARNAME)/git.spec \
2437
		$(GIT_TARNAME)/configure \
2438
		$(GIT_TARNAME)/version \
2439
		$(GIT_TARNAME)/git-gui/version
2440
	@$(RM) -r $(GIT_TARNAME)
2441
	gzip -f -9 $(GIT_TARNAME).tar
2442 2443

rpm: dist
2444 2445 2446 2447
	$(RPMBUILD) \
		--define "_source_filedigest_algorithm md5" \
		--define "_binary_filedigest_algorithm md5" \
		-ta $(GIT_TARNAME).tar.gz
2448

2449 2450 2451
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
dist-doc:
2452
	$(RM) -r .doc-tmp-dir
2453 2454 2455 2456 2457
	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
	:
2458
	$(RM) -r .doc-tmp-dir
2459
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2460
	$(MAKE) -C Documentation DESTDIR=./ \
2461
		man1dir=../.doc-tmp-dir/man1 \
2462
		man5dir=../.doc-tmp-dir/man5 \
2463
		man7dir=../.doc-tmp-dir/man7 \
2464 2465 2466
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2467
	$(RM) -r .doc-tmp-dir
2468

P
Petr Baudis 已提交
2469
### Cleaning rules
2470

2471 2472
distclean: clean
	$(RM) configure
2473 2474 2475
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2476

2477 2478 2479 2480
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

2481
clean: profile-clean coverage-clean
2482
	$(RM) *.o *.res block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \
2483
		builtin/*.o $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2484
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2485
	$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
2486
	$(RM) -r bin-wrappers $(dep_dirs)
2487
	$(RM) -r po/build/
2488
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
2489 2490 2491
	$(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
2492
	$(MAKE) -C Documentation/ clean
2493
ifndef NO_PERL
2494
	$(MAKE) -C gitweb clean
2495
	$(MAKE) -C perl clean
2496
endif
P
Petr Baudis 已提交
2497
	$(MAKE) -C templates/ clean
2498
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2499
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2500
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2501 2502
	$(MAKE) -C git-gui clean
endif
2503
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2504 2505
	$(RM) GIT-USER-AGENT GIT-PREFIX
	$(RM) GIT-SCRIPT-DEFINES GIT-PERL-DEFINES GIT-PYTHON-VARS
2506

2507
.PHONY: all install profile-clean clean strip
2508
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2509
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2510

J
Junio C Hamano 已提交
2511 2512
### Check documentation
#
J
Jeff King 已提交
2513 2514 2515 2516
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2517
ALL_COMMANDS += git-gui git-citool
J
Junio C Hamano 已提交
2518
check-docs::
J
Jeff King 已提交
2519
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2520 2521 2522
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2523
		git-merge-resolve | git-merge-subtree | \
2524
		git-fsck-objects | git-init-db | \
2525
		git-remote-* | git-stage | \
2526
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2527 2528 2529
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
J
Junio C Hamano 已提交
2530
		sed -e '/^#/d' command-list.txt | \
2531
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2532 2533 2534 2535
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2536 2537
	done; \
	( \
J
Junio C Hamano 已提交
2538
		sed -e '/^#/d' \
2539
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2540
		    -e 's/^/listed /' command-list.txt; \
2541 2542
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2543 2544 2545 2546
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2547
		case " $(ALL_COMMANDS) " in \
2548 2549 2550 2551
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2552 2553 2554 2555 2556

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

2558 2559
### Test suite coverage testing
#
2560
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
2561
.PHONY: coverage-clean-results
2562 2563

coverage:
2564
	$(MAKE) coverage-test
2565
	$(MAKE) coverage-untested-functions
2566

2567
object_dirs := $(sort $(dir $(OBJECTS)))
2568
coverage-clean-results:
2569 2570 2571
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2572
	$(RM) -r cover_db/
2573
	$(RM) -r cover_db_html/
2574

2575 2576 2577
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2578 2579
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2580
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2581

2582
coverage-compile:
2583
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2584 2585

coverage-test: coverage-clean-results coverage-compile
2586
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2587
		DEFAULT_TEST_TARGET=test -j1 test
2588 2589

coverage-report:
2590
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2591
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2592
	done
2593 2594

coverage-untested-functions: coverage-report
2595 2596
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2597
		> coverage-untested-functions
2598 2599 2600

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2601 2602 2603

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