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

S
Shawn O. Pearce 已提交
4
# Define V=1 to have a more verbose compile.
5
#
6 7 8 9 10
# Define SHELL_PATH to a POSIX shell if your /bin/sh is broken.
#
# Define SANE_TOOL_PATH to a colon-separated list of paths to prepend
# to PATH if your tools in /usr/bin are broken.
#
11 12 13
# Define SOCKLEN_T to a suitable type (such as 'size_t') if your
# system headers do not define a socklen_t type.
#
G
Gary V. Vaughan 已提交
14 15 16
# Define INLINE to a suitable substitute (such as '__inline' or '') if git
# fails to compile with errors about undefined inline functions or similar.
#
17 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
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
J
Justin Lebar 已提交
162
# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t.
J
Joachim Schmitz 已提交
163 164 165
#
# 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 347
#
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
348

349
GIT-VERSION-FILE: FORCE
350
	@$(SHELL_PATH) ./GIT-VERSION-GEN
351
-include GIT-VERSION-FILE
352

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

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

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

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

393 394 395 396
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

397
export prefix bindir sharedir sysconfdir gitwebdir localedir
398

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

415 416
export TCL_PATH TCLTK_PATH

417
SPARSE_FLAGS =
418

P
Petr Baudis 已提交
419 420 421 422


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

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

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

J
Jonathan Nieder 已提交
448 449 450 451 452 453
# 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

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

471 472
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
473 474 475
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
476
SCRIPT_LIB += git-sh-setup
477
SCRIPT_LIB += git-sh-i18n
478

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

P
Pete Wyckoff 已提交
489
SCRIPT_PYTHON += git-p4.py
490

491
NO_INSTALL += git-remote-testgit
492

493 494 495 496 497
# 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))

498 499 500 501
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))

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

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

526 527 528
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
529
	  git-instaweb
530

531 532
ETAGS_TARGET = TAGS

533 534
# Empty...
EXTRA_PROGRAMS =
535

536 537
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
538

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

550 551 552
# Binary suffix, set to .exe for Windows builds
X =

553
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
554

555 556 557 558 559 560
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 已提交
561
TEST_PROGRAMS_NEED_X += test-index-version
D
David Barr 已提交
562
TEST_PROGRAMS_NEED_X += test-line-buffer
563
TEST_PROGRAMS_NEED_X += test-match-trees
R
René Scharfe 已提交
564
TEST_PROGRAMS_NEED_X += test-mergesort
J
Jeff King 已提交
565
TEST_PROGRAMS_NEED_X += test-mktemp
566 567
TEST_PROGRAMS_NEED_X += test-parse-options
TEST_PROGRAMS_NEED_X += test-path-utils
568
TEST_PROGRAMS_NEED_X += test-prio-queue
569
TEST_PROGRAMS_NEED_X += test-read-cache
570
TEST_PROGRAMS_NEED_X += test-regex
571
TEST_PROGRAMS_NEED_X += test-revision-walking
572
TEST_PROGRAMS_NEED_X += test-run-command
573
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
574 575
TEST_PROGRAMS_NEED_X += test-sha1
TEST_PROGRAMS_NEED_X += test-sigchain
576
TEST_PROGRAMS_NEED_X += test-string-list
577
TEST_PROGRAMS_NEED_X += test-subprocess
D
David Barr 已提交
578
TEST_PROGRAMS_NEED_X += test-svn-fe
579
TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
580
TEST_PROGRAMS_NEED_X += test-wildmatch
581

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

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

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

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

E
Eygene Ryabinkin 已提交
603
# what 'all' will build but not install in gitexecdir
604
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
605

606 607 608 609 610 611 612 613 614
# 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

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

L
Luben Tuikov 已提交
626
export PERL_PATH
627
export PYTHON_PATH
L
Luben Tuikov 已提交
628

629 630 631
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
632

J
Jeff King 已提交
633
GENERATED_H += common-cmds.h
634

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

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

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

997
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
998
EXTLIBS =
999

J
Jeff King 已提交
1000 1001
GIT_USER_AGENT = git/$(GIT_VERSION)

1002
include config.mak.uname
1003
-include config.mak.autogen
1004
-include config.mak
1005

1006 1007 1008 1009 1010 1011 1012 1013
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

1014
ifdef CHECK_HEADER_DEPENDENCIES
1015
COMPUTE_HEADER_DEPENDENCIES = no
1016
USE_COMPUTED_HEADER_DEPENDENCIES =
1017 1018
endif

1019
ifndef COMPUTE_HEADER_DEPENDENCIES
1020 1021 1022 1023
COMPUTE_HEADER_DEPENDENCIES = auto
endif

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

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

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

G
Gary V. Vaughan 已提交
1052 1053 1054 1055
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1056 1057 1058 1059
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

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

1081 1082 1083 1084 1085 1086 1087 1088
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
1089 1090
endif

1091 1092 1093 1094 1095
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

M
Michał Kiedrowicz 已提交
1096 1097 1098 1099 1100 1101 1102 1103 1104
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 已提交
1105 1106
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1107 1108 1109
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1110
else
1111
	ifdef CURLDIR
1112
		# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
1113
		BASIC_CFLAGS += -I$(CURLDIR)/include
1114
		CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib) -lcurl
1115 1116 1117
	else
		CURL_LIBCURL = -lcurl
	endif
1118
	ifdef NEEDS_SSL_WITH_CURL
1119
		CURL_LIBCURL += -lssl
1120 1121 1122 1123 1124 1125 1126 1127
		ifdef NEEDS_CRYPTO_WITH_SSL
			CURL_LIBCURL += -lcrypto
		endif
	endif
	ifdef NEEDS_IDN_WITH_CURL
		CURL_LIBCURL += -lidn
	endif

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

1152 1153
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1154
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1155 1156 1157
endif
EXTLIBS += -lz

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

1389
ifdef NO_ICONV
1390
	BASIC_CFLAGS += -DNO_ICONV
1391 1392
endif

1393 1394 1395 1396
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1397 1398 1399 1400
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1401 1402 1403 1404
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

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

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

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

1455 1456 1457 1458
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1459 1460
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1461
	EXTLIBS += $(CHARSET_LIB)
1462 1463
endif

1464 1465 1466 1467
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1468 1469 1470 1471
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

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

1483
ifdef USE_NED_ALLOCATOR
1484
       COMPAT_CFLAGS += -Icompat/nedmalloc
1485 1486 1487
       COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
endif

1488 1489 1490 1491
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

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

1496 1497 1498 1499
ifneq (,$(XDL_FAST_HASH))
	BASIC_CFLAGS += -DXDL_FAST_HASH
endif

1500 1501 1502 1503 1504
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1505
ifeq ($(TCLTK_PATH),)
1506
NO_TCLTK = NoThanks
1507 1508
endif

1509
ifeq ($(PERL_PATH),)
1510
NO_PERL = NoThanks
1511 1512
endif

1513
ifeq ($(PYTHON_PATH),)
1514
NO_PYTHON = NoThanks
1515 1516
endif

1517
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1518 1519
QUIET_SUBDIR1  =

1520 1521 1522 1523 1524 1525
ifneq ($(findstring $(MAKEFLAGS),w),w)
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

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

J
Junio C Hamano 已提交
1548 1549 1550 1551
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1552 1553 1554 1555 1556 1557 1558
### profile feedback build
#

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

1559
ifeq ("$(PROFILE)","GEN")
1560 1561
	CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
	EXTLIBS += -lgcov
1562 1563
	export CCACHE_DISABLE = t
	V = 1
1564 1565
else
ifneq ("$(PROFILE)","")
1566
	CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1567 1568
	export CCACHE_DISABLE = t
	V = 1
1569
endif
1570
endif
1571

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

SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
1575
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1576
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1577 1578 1579

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1580
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1581 1582
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
1583
localedir_SQ = $(subst ','\'',$(localedir))
1584 1585
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
1586
htmldir_relative_SQ = $(subst ','\'',$(htmldir_relative))
1587
prefix_SQ = $(subst ','\'',$(prefix))
1588
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1589 1590 1591

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1592
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1593
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1594
DIFF_SQ = $(subst ','\'',$(DIFF))
1595
PERLLIB_EXTRA_SQ = $(subst ','\'',$(PERLLIB_EXTRA))
1596

1597 1598
LIBS = $(GITLIBS) $(EXTLIBS)

1599
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
1600
	$(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1601
LIB_OBJS += $(COMPAT_OBJS)
1602

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

1612 1613 1614 1615 1616 1617 1618
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

1619 1620 1621 1622 1623 1624 1625
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 已提交
1626 1627 1628
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))
1629 1630 1631 1632
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 已提交
1633

1634 1635 1636 1637
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1638 1639 1640
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1641
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1642 1643


P
Petr Baudis 已提交
1644 1645
### Build rules

1646 1647
SHELL = $(SHELL_PATH)

1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658
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
1659
ifneq (,$X)
1660
	$(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';)
1661
endif
1662

1663
all::
E
Eygene Ryabinkin 已提交
1664
ifndef NO_TCLTK
1665
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1666
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
E
Eygene Ryabinkin 已提交
1667
endif
1668
ifndef NO_PERL
1669
	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' localedir='$(localedir_SQ)' all
1670
endif
1671
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1672

1673 1674 1675 1676 1677
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 已提交
1678
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
1679
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
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 1706 1707 1708 1709 1710 1711 1712 1713
### 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.

1714
git.sp git.s git.o: GIT-PREFIX
1715
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1716 1717 1718
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1719

1720
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1721
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
1722
		$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
1723

1724
help.sp help.s help.o: common-cmds.h
1725

1726
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1727
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1728 1729 1730
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1731

1732
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1733
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1734 1735
	'-DGIT_VERSION="$(GIT_VERSION)"' \
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
1736

J
Junio C Hamano 已提交
1737
$(BUILT_INS): git$X
1738
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
1739 1740 1741
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
1742

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

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

1748
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
1749 1750
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
	$(gitwebdir_SQ):$(PERL_PATH_SQ)
1751 1752 1753 1754
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
1755
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
1756
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
1757
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
1758
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
1759
    -e $(BROKEN_PATH_FIX) \
1760 1761
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
1762 1763 1764
    $@.sh >$@+
endef

1765 1766 1767
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
1768
		echo >&2 "    * new script parameters"; \
1769 1770 1771 1772 1773
		echo "$$FLAGS" >$@; \
            fi


$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh GIT-SCRIPT-DEFINES
1774
	$(QUIET_GEN)$(cmd_munge_script) && \
1775
	chmod +x $@+ && \
1776
	mv $@+ $@
1777

1778
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1779 1780 1781
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1782
git.res: git.rc GIT-VERSION-FILE
1783
	$(QUIET_RC)$(RC) \
1784
	  $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
1785 1786
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@

1787
ifndef NO_PERL
1788 1789
$(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak

1790 1791 1792
perl/perl.mak: perl/PM.stamp

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

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

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

1818 1819 1820 1821 1822 1823 1824
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

1825 1826 1827 1828 1829

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

1830 1831
git-instaweb: git-instaweb.sh gitweb GIT-SCRIPT-DEFINES
	$(QUIET_GEN)$(cmd_munge_script) && \
1832
	chmod +x $@+ && \
1833
	mv $@+ $@
1834 1835 1836 1837 1838 1839 1840 1841 1842
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
1843

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

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

1868
configure: configure.ac GIT-VERSION-FILE
1869
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
1870

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

1889 1890 1891 1892 1893 1894
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
1895
XDIFF_OBJS += xdiff/xhistogram.o
1896 1897

VCSSVN_OBJS += vcs-svn/line_buffer.o
1898
VCSSVN_OBJS += vcs-svn/sliding_window.o
1899 1900
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1901
VCSSVN_OBJS += vcs-svn/svndiff.o
1902 1903
VCSSVN_OBJS += vcs-svn/svndump.o

1904 1905 1906 1907 1908 1909 1910 1911
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
1912

1913
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1914
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1915

1916
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1917
$(dep_dirs):
1918
	@mkdir -p $@
1919 1920

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
1921
dep_file = $(dir $@).depend/$(notdir $@).d
1922
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
1923 1924 1925 1926 1927 1928
ifdef CHECK_HEADER_DEPENDENCIES
$(error cannot compute header dependencies outside a normal build. \
Please unset CHECK_HEADER_DEPENDENCIES and try again)
endif
endif

1929
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1930
ifndef CHECK_HEADER_DEPENDENCIES
1931 1932
dep_dirs =
missing_dep_dirs =
1933 1934
dep_args =
endif
1935 1936
endif

1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950
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))

1951 1952
.SUFFIXES:

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 1979 1980 1981 1982 1983 1984 1985 1986
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
1987
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
1988
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1989
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
1990
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1991
endif
1992

1993
%.s: %.c GIT-CFLAGS FORCE
1994
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1995 1996

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

2011
$(OBJECTS): $(LIB_H)
2012
endif
2013

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

2020
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2021
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2022
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2023

2024
config.sp config.s config.o: GIT-PREFIX
2025 2026
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2027

2028
attr.sp attr.s attr.o: GIT-PREFIX
2029 2030
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2031

2032
gettext.sp gettext.s gettext.o: GIT-PREFIX
2033 2034 2035
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2036 2037 2038
http-push.sp http.sp http-walker.sp remote-curl.sp: SPARSE_FLAGS += \
	-DCURL_DISABLE_TYPECHECK

2039
ifdef NO_EXPAT
2040
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2041 2042
endif

2043
ifdef NO_REGEX
2044 2045
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2046 2047
endif

2048
ifdef USE_NED_ALLOCATOR
2049
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2050
	-DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR
2051
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2052 2053
endif

2054
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2055
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2056

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

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

2068 2069 2070 2071
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)

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

2078
$(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o GIT-LDFLAGS $(GITLIBS)
2079 2080 2081
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)

P
Petr Baudis 已提交
2082
$(LIB_FILE): $(LIB_OBJS)
2083
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
P
Petr Baudis 已提交
2084

2085
$(XDIFF_LIB): $(XDIFF_OBJS)
2086
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
2087

J
Jonathan Nieder 已提交
2088
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2089
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
2090

2091 2092
export DEFAULT_EDITOR DEFAULT_PAGER

P
Petr Baudis 已提交
2093 2094 2095
doc:
	$(MAKE) -C Documentation all

2096 2097 2098 2099 2100 2101
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

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

2105 2106 2107
pdf:
	$(MAKE) -C Documentation pdf

2108 2109 2110 2111 2112
XGETTEXT_FLAGS = \
	--force-po \
	--add-comments \
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2113 2114
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2115 2116
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2117
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
2118
LOCALIZED_C := $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2119
LOCALIZED_SH := $(SCRIPT_SH)
2120 2121 2122 2123 2124 2125 2126
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
2127 2128

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

pot: po/git.pot

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

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

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

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

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

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

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

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

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

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

J
Junio C Hamano 已提交
2193 2194 2195
# 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".
2196
GIT-BUILD-OPTIONS: FORCE
J
Junio C Hamano 已提交
2197
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@
2198
	@echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@
2199
	@echo DIFF=\''$(subst ','\'',$(subst ','\'',$(DIFF)))'\' >>$@
2200
	@echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@
J
Junio C Hamano 已提交
2201
	@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@
J
Jeff King 已提交
2202
	@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@
2203
	@echo USE_LIBPCRE=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE)))'\' >>$@
2204
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@
J
Jeff King 已提交
2205
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@
2206
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@
2207 2208 2209
ifdef TEST_OUTPUT_DIRECTORY
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@
endif
2210 2211 2212
ifdef GIT_TEST_OPTS
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@
endif
2213 2214 2215 2216 2217 2218
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
2219
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@
2220
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@
2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232
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
2233

2234 2235 2236
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2237

2238 2239
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2240
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2241
		echo >&2 "    * new Python interpreter location"; \
2242 2243 2244 2245
		echo "$$VARS" >$@; \
            fi
endif

2246 2247 2248
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2249
all:: $(NO_INSTALL)
2250 2251 2252 2253 2254 2255 2256

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

2258 2259 2260 2261
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2262
export NO_SVN_TESTS
2263
export TEST_NO_MALLOC_CHECK
2264

2265 2266
### Testing rules

2267
test: all
P
Petr Baudis 已提交
2268 2269
	$(MAKE) -C t/ all

2270 2271 2272 2273 2274
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

R
René Scharfe 已提交
2275 2276
test-ctype$X: ctype.o

2277
test-date$X: date.o ctype.o
P
Petr Baudis 已提交
2278

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

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

2283
test-parse-options$X: parse-options.o parse-options-cb.o
2284

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

2287
.PRECIOUS: $(TEST_OBJS)
2288

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

2292 2293 2294
check-sha1:: test-sha1$X
	./test-sha1.sh

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

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

### Installation rules

2316
ifneq ($(filter /%,$(firstword $(template_dir))),)
2317
template_instdir = $(template_dir)
2318 2319
else
template_instdir = $(prefix)/$(template_dir)
2320 2321 2322
endif
export template_instdir

2323
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2324
gitexec_instdir = $(gitexecdir)
2325 2326
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2327 2328 2329 2330
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2331 2332 2333 2334 2335 2336 2337
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2338 2339
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

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

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

2400 2401 2402
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2403 2404 2405
install-doc:
	$(MAKE) -C Documentation install

2406 2407 2408
install-man:
	$(MAKE) -C Documentation install-man

2409 2410 2411
install-html:
	$(MAKE) -C Documentation install-html

2412 2413 2414
install-info:
	$(MAKE) -C Documentation install-info

2415 2416 2417
install-pdf:
	$(MAKE) -C Documentation install-pdf

2418 2419
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2420

2421 2422 2423
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2424 2425 2426
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2427 2428 2429 2430


### Maintainer's dist rules

2431
git.spec: git.spec.in GIT-VERSION-FILE
2432 2433
	sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
	mv $@+ $@
2434

2435
GIT_TARNAME = git-$(GIT_VERSION)
2436
dist: git.spec git-archive$(X) configure
2437 2438
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2439
	@mkdir -p $(GIT_TARNAME)
2440
	@cp git.spec configure $(GIT_TARNAME)
2441
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2442
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2443
	$(TAR) rf $(GIT_TARNAME).tar \
2444
		$(GIT_TARNAME)/git.spec \
2445
		$(GIT_TARNAME)/configure \
2446
		$(GIT_TARNAME)/version \
2447
		$(GIT_TARNAME)/git-gui/version
2448
	@$(RM) -r $(GIT_TARNAME)
2449
	gzip -f -9 $(GIT_TARNAME).tar
2450 2451

rpm: dist
2452 2453 2454 2455
	$(RPMBUILD) \
		--define "_source_filedigest_algorithm md5" \
		--define "_binary_filedigest_algorithm md5" \
		-ta $(GIT_TARNAME).tar.gz
2456

2457 2458 2459
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
dist-doc:
2460
	$(RM) -r .doc-tmp-dir
2461 2462 2463 2464 2465
	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
	:
2466
	$(RM) -r .doc-tmp-dir
2467
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2468
	$(MAKE) -C Documentation DESTDIR=./ \
2469
		man1dir=../.doc-tmp-dir/man1 \
2470
		man5dir=../.doc-tmp-dir/man5 \
2471
		man7dir=../.doc-tmp-dir/man7 \
2472 2473 2474
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2475
	$(RM) -r .doc-tmp-dir
2476

P
Petr Baudis 已提交
2477
### Cleaning rules
2478

2479 2480
distclean: clean
	$(RM) configure
2481 2482 2483
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2484

2485 2486 2487 2488
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

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

2515
.PHONY: all install profile-clean clean strip
2516
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2517
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2518

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

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

2566 2567
### Test suite coverage testing
#
2568
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
2569
.PHONY: coverage-clean-results
2570 2571

coverage:
2572
	$(MAKE) coverage-test
2573
	$(MAKE) coverage-untested-functions
2574

2575
object_dirs := $(sort $(dir $(OBJECTS)))
2576
coverage-clean-results:
2577 2578 2579
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2580
	$(RM) -r cover_db/
2581
	$(RM) -r cover_db_html/
2582

2583 2584 2585
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2586 2587
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2588
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2589

2590
coverage-compile:
2591
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2592 2593

coverage-test: coverage-clean-results coverage-compile
2594
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2595
		DEFAULT_TEST_TARGET=test -j1 test
2596 2597

coverage-report:
2598
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2599
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2600
	done
2601 2602

coverage-untested-functions: coverage-report
2603 2604
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2605
		> coverage-untested-functions
2606 2607 2608

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2609 2610 2611

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