Makefile 76.2 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
#
37
# Define CURL_CONFIG to the path to a curl-config binary other than the
38 39
# default 'curl-config'.  If CURL_CONFIG is unset or points to a binary that
# is not found, defaults to the CURLDIR behavior.
40
#
41 42 43
# Define CURL_STATIC to statically link libcurl.  Only applies if
# CURL_CONFIG is used.
#
P
Patrick Mauritz 已提交
44
# Define CURLDIR=/foo/bar if your curl header and library files are in
45 46 47 48
# /foo/bar/include and /foo/bar/lib directories.  This overrides
# CURL_CONFIG, but is less robust.  If not set, and CURL_CONFIG is not set,
# uses -lcurl with no additional library detection (other than
# NEEDS_*_WITH_CURL).
P
Patrick Mauritz 已提交
49
#
50
# Define NO_EXPAT if you do not have expat installed.  git-http-push is
51
# not built, and you cannot push using http:// and https:// transports (dumb).
52
#
53 54 55
# Define EXPATDIR=/foo/bar if your expat header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
M
Matt Kraai 已提交
56 57 58
# 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.
#
59 60 61 62
# 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.
#
63 64 65
# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust
# the installed gettext translation of the shell scripts output.
#
66 67 68 69 70 71
# 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.
#
72
# Define CHARSET_LIB to the library you need to link with in order to
73
# use locale_charset() function.  On some platforms this needs to set to
74
# -lcharset, on others to -liconv .
75
#
76 77 78 79 80 81
# 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
#
82 83 84
# Define HAVE_PATHS_H if you have paths.h and want to use the default PATH
# it specifies.
#
85 86
# Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
#
87
# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
88
# d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
89
#
90 91
# Define HAVE_STRINGS_H if you have strings.h and need it for strcasecmp.
#
92 93
# Define NO_STRCASESTR if you don't have strcasestr.
#
R
René Scharfe 已提交
94 95
# Define NO_MEMMEM if you don't have memmem.
#
M
Matt Kraai 已提交
96 97
# Define NO_GETPAGESIZE if you don't have getpagesize.
#
98 99
# Define NO_STRLCPY if you don't have strlcpy.
#
100 101
# 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
102 103
# strtoull, define NO_STRTOULL.
#
J
Jason Riedy 已提交
104 105
# Define NO_SETENV if you don't have setenv in the C library.
#
106 107
# Define NO_UNSETENV if you don't have unsetenv in the C library.
#
108 109
# Define NO_MKDTEMP if you don't have mkdtemp in the C library.
#
110 111
# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
#
112 113
# Define NO_MKSTEMPS if you don't have mkstemps in the C library.
#
114 115 116
# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
# in the C library.
#
117 118
# Define NO_LIBGEN_H if you don't have libgen.h.
#
119 120
# Define NEEDS_LIBGEN if your libgen needs -lgen when linking
#
121 122
# Define NO_SYS_SELECT_H if you don't have sys/select.h.
#
123 124
# 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.
125
#
P
Pavel Roskin 已提交
126
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
E
Eric Wong 已提交
127 128 129
# 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.
#
130 131 132 133 134 135 136 137 138 139 140 141
# 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.
#
142 143 144 145
# 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.
#
146 147
# Define BLK_SHA1 environment variable to make use of the bundled
# optimized C SHA1 routine.
148
#
149 150
# Define PPC_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for PowerPC.
151
#
152 153 154
# 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).
155
#
156 157
# Define NEEDS_SSL_WITH_CURL if you need -lssl with -lcurl (Minix).  Only used
# if CURLDIR is set.
158
#
159 160
# Define NEEDS_IDN_WITH_CURL if you need -lidn when using -lcurl (Minix).  Only
# used if CURLDIR is set.
161
#
162
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
163
#
J
Joachim Schmitz 已提交
164 165
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
J
Justin Lebar 已提交
166
# Define NO_INTPTR_T if you don't have intptr_t or uintptr_t.
J
Joachim Schmitz 已提交
167 168 169
#
# Define NO_UINTMAX_T if you don't have uintmax_t.
#
170 171 172
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
173 174 175 176
# Define NEEDS_RESOLV if linking with -lnsl and/or -lsocket is not enough.
# Notably on Solaris hstrerror resides in libresolv and on Solaris 7
# inet_ntop and inet_pton additionally reside there.
#
177 178
# Define NO_MMAP if you want to avoid mmap.
#
179 180 181 182 183
# Define NO_SYS_POLL_H if you don't have sys/poll.h.
#
# Define NO_POLL if you do not have or don't want to use poll().
# This also implies NO_SYS_POLL_H.
#
184 185 186
# Define NEEDS_SYS_PARAM_H if you need to include sys/param.h to compile,
# *PLEASE* REPORT to git@vger.kernel.org if your platform needs this;
# we want to know more about the issue.
187
#
J
Junio C Hamano 已提交
188 189
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
190
# Define NO_PREAD if you have a problem with pread() system call (e.g.
191
# cygwin1.dll before v1.5.22).
192
#
193 194 195 196 197
# Define NO_SETITIMER if you don't have setitimer()
#
# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
# This also implies NO_SETITIMER
#
198 199 200
# Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
# thread-safe. (e.g. compat/pread.c or cygwin)
#
201 202 203
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
204 205 206
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
# the executable mode bit, but doesn't really do so.
#
207 208
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
#
209 210
# Define NO_UNIX_SOCKETS if your system does not offer unix sockets.
#
211 212 213
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
214 215
# Define NO_ICONV if your libc does not properly support iconv.
#
216 217 218
# Define OLD_ICONV if your library has an old iconv(), where the second
# (input buffer pointer) parameter is declared with type (const char **).
#
219 220
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
#
221 222 223
# 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.
224
#
J
Junio C Hamano 已提交
225 226 227
# 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)
#
228 229 230 231 232
# 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).
233
#
234 235 236
# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
# "st_ctim"
#
237 238 239
# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
# available.  This automatically turns USE_NSEC off.
#
240
# Define USE_STDEV below if you want git to care about the underlying device
241
# change being considered an inode change from the update-index perspective.
242
#
243 244 245
# 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.
#
246 247 248
# 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 已提交
249 250
# Define ASCIIDOC_ROFF if your DocBook XSL does not escape raw roff directives
# (versions 1.68.1 through v1.72).
251
#
T
Thomas Rast 已提交
252 253 254 255
# 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.
#
256 257
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
258 259 260
# Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
# MakeMaker (e.g. using ActiveState under Cygwin).
#
261 262
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
263 264 265
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
# but /usr/bin/python2.7 on some platforms).
#
266 267
# Define NO_PYTHON if you do not want Python scripts or libraries at all.
#
E
Eygene Ryabinkin 已提交
268 269
# Define NO_TCLTK if you do not want Tcl/Tk GUI.
#
270 271 272 273 274
# The TCL_PATH variable governs the location of the Tcl interpreter
# used to optimize git-gui for your system.  Only used if NO_TCLTK
# is not set.  Defaults to the bare 'tclsh'.
#
# The TCLTK_PATH variable governs the location of the Tcl/Tk interpreter.
275 276 277
# If not set it defaults to the bare 'wish'. If it is set to the empty
# string then NO_TCLTK will be forced (this is used by configure script).
#
278 279 280 281
# Define INTERNAL_QSORT to use Git's implementation of qsort(), which
# is a simplified version of the merge sort used in glibc. This is
# recommended if Git triggers O(n^2) behavior in your platform's qsort().
#
282 283 284
# Define UNRELIABLE_FSTAT if your system's fstat does not return the same
# information on a not yet closed file that lstat would return for the same
# file after it was closed.
285
#
286 287
# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
# when hardlinking a file to another name and unlinking the original file right
288
# away (some NTFS drivers seem to zero the contents in that scenario).
289
#
290 291
# Define NO_CROSS_DIRECTORY_HARDLINKS if you plan to distribute the installed
# programs as a tar, where bin/ and libexec/ might be on different file systems.
292
#
J
Junio C Hamano 已提交
293 294 295
# Define NO_INSTALL_HARDLINKS if you prefer to use either symbolic links or
# copies to install built-in git commands e.g. git-cat-file.
#
296 297
# Define USE_NED_ALLOCATOR if you want to replace the platforms default
# memory allocators with the nedmalloc allocator written by Niall Douglas.
298 299
#
# Define NO_REGEX if you have no or inferior regex support in your C library.
300
#
J
Jeff King 已提交
301 302 303
# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
# user.
#
304
# Define GETTEXT_POISON if you are debugging the choice of strings marked
305 306 307
# for translation.  In a GETTEXT_POISON build, you can turn all strings marked
# for translation into gibberish by setting the GIT_GETTEXT_POISON variable
# (to any value) in your environment.
308
#
309 310
# Define JSMIN to point to JavaScript minifier that functions as
# a filter to have gitweb.js minified.
J
Junio C Hamano 已提交
311
#
312 313 314
# Define CSSMIN to point to a CSS minifier in order to generate a minified
# version of gitweb.css
#
315 316 317 318
# Define DEFAULT_PAGER to a sensible pager command (defaults to "less") if
# you want to use something different.  The value will be interpreted by the
# shell at runtime when it is used.
#
319 320 321 322 323 324 325
# Define DEFAULT_EDITOR to a sensible editor command (defaults to "vi") if you
# want to use something different.  The value will be interpreted by the shell
# if necessary when it is used.  Examples:
#
#   DEFAULT_EDITOR='~/bin/vi',
#   DEFAULT_EDITOR='$GIT_FALLBACK_EDITOR',
#   DEFAULT_EDITOR='"C:\Program Files\Vim\gvim.exe" --nofork'
326
#
327 328 329 330 331 332
# Define COMPUTE_HEADER_DEPENDENCIES to "yes" if you want dependencies on
# header files to be automatically computed, to avoid rebuilding objects when
# an unrelated header file changes.  Define it to "no" to use the hard-coded
# dependency rules.  The default is "auto", which means to use computed header
# dependencies if your compiler is detected to support it.
#
333 334
# Define CHECK_HEADER_DEPENDENCIES to check for problems in the hard-coded
# dependency rules.
J
Junio C Hamano 已提交
335
#
336
# Define NATIVE_CRLF if your platform uses CRLF for line endings.
337 338 339 340 341
#
# 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 已提交
342 343 344
#
# Define GIT_USER_AGENT if you want to change how git identifies itself during
# network interactions.  The default is "git/$(GIT_VERSION)".
345
#
346 347 348
# 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.
349 350 351 352
#
# Define TEST_GIT_INDEX_VERSION to 2, 3 or 4 to run the test suite
# with a different indexfile format version.  If it isn't set the index
# file format used is index-v[23].
353
#
354 355
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
356

357
GIT-VERSION-FILE: FORCE
358
	@$(SHELL_PATH) ./GIT-VERSION-GEN
359
-include GIT-VERSION-FILE
360

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

363
CFLAGS = -g -O2 -Wall
J
Junio C Hamano 已提交
364
LDFLAGS =
365
ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
J
Junio C Hamano 已提交
366
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
367
STRIP ?= strip
368

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

383
prefix = $(HOME)
384 385
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
386 387
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
388
gitexecdir = libexec/git-core
389
mergetoolsdir = $(gitexecdir)/mergetools
390
sharedir = $(prefix)/share
391
gitwebdir = $(sharedir)/gitweb
392
localedir = $(sharedir)/locale
393
template_dir = share/git-core/templates
394
htmldir = $(prefix)/share/doc/git-doc
395
ETC_GITCONFIG = $(sysconfdir)/gitconfig
396
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
397
lib = lib
398
# DESTDIR =
399
pathsep = :
400

401 402 403 404
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

405
export prefix bindir sharedir sysconfdir gitwebdir localedir
406

407
CC = cc
408
AR = ar
409
RM = rm -f
410
DIFF = diff
411
TAR = tar
412
FIND = find
413 414
INSTALL = install
RPMBUILD = rpmbuild
415
TCL_PATH = tclsh
416
TCLTK_PATH = wish
417
XGETTEXT = xgettext
418
MSGFMT = msgfmt
419
PTHREAD_LIBS = -lpthread
420
PTHREAD_CFLAGS =
421
GCOV = gcov
422

423 424
export TCL_PATH TCLTK_PATH

425
SPARSE_FLAGS =
426

P
Petr Baudis 已提交
427 428 429 430


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

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

437 438 439 440 441
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
442 443
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
444
GENERATED_H =
445
EXTRA_CPPFLAGS =
446 447
LIB_H =
LIB_OBJS =
448
PROGRAM_OBJS =
449 450
PROGRAMS =
SCRIPT_PERL =
451
SCRIPT_PYTHON =
452
SCRIPT_SH =
453
SCRIPT_LIB =
454
TEST_PROGRAMS_NEED_X =
455

J
Jonathan Nieder 已提交
456 457 458 459 460 461
# 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

462 463
SCRIPT_SH += git-am.sh
SCRIPT_SH += git-bisect.sh
464
SCRIPT_SH += git-difftool--helper.sh
465 466 467 468 469 470 471 472
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
473
SCRIPT_SH += git-remote-testgit.sh
474 475 476 477 478
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

479 480
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
481 482 483
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
484
SCRIPT_LIB += git-sh-setup
485
SCRIPT_LIB += git-sh-i18n
486

487
SCRIPT_PERL += git-add--interactive.perl
488
SCRIPT_PERL += git-difftool.perl
489 490 491 492 493 494 495
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
496

P
Pete Wyckoff 已提交
497
SCRIPT_PYTHON += git-p4.py
498

499
NO_INSTALL += git-remote-testgit
500

501 502 503 504 505
# 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))

506 507 508 509
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))

510 511 512 513 514 515 516 517 518
# 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
519
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
520
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
521
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
522
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
523
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
524
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
525 526 527 528 529 530 531 532 533

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

534 535 536
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
537
	  git-instaweb
538

539 540
ETAGS_TARGET = TAGS

541 542
# Empty...
EXTRA_PROGRAMS =
543

544 545
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
546

547
PROGRAM_OBJS += credential-store.o
548
PROGRAM_OBJS += daemon.o
549
PROGRAM_OBJS += fast-import.o
550
PROGRAM_OBJS += http-backend.o
551
PROGRAM_OBJS += imap-send.o
552
PROGRAM_OBJS += sh-i18n--envsubst.o
553 554 555
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
556
PROGRAM_OBJS += remote-testsvn.o
557

558 559 560
# Binary suffix, set to .exe for Windows builds
X =

561
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
562

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

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

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

BUILT_INS += git-cherry$X
598
BUILT_INS += git-cherry-pick$X
599 600 601 602 603
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 已提交
604
BUILT_INS += git-stage$X
605 606
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
607

608 609
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
610
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
611

E
Eygene Ryabinkin 已提交
612
# what 'all' will build but not install in gitexecdir
613
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
614

615 616 617 618 619 620 621 622 623
# 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

624 625 626 627 628 629 630
# 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
631 632 633
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
634

L
Luben Tuikov 已提交
635
export PERL_PATH
636
export PYTHON_PATH
L
Luben Tuikov 已提交
637

638 639 640
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
641

J
Jeff King 已提交
642
GENERATED_H += common-cmds.h
643

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

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

921 922 923 924 925 926 927 928 929 930
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 已提交
931
BUILTIN_OBJS += builtin/check-ignore.o
932
BUILTIN_OBJS += builtin/check-mailmap.o
933 934 935 936 937
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
938
BUILTIN_OBJS += builtin/column.o
939 940 941 942
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
943
BUILTIN_OBJS += builtin/credential.o
944 945 946 947 948 949 950 951 952 953 954 955
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
956
BUILTIN_OBJS += builtin/get-tar-commit-id.o
957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978
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 已提交
979
BUILTIN_OBJS += builtin/notes.o
980 981 982 983 984 985 986 987 988 989 990
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 已提交
991
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
992
BUILTIN_OBJS += builtin/remote-fd.o
993
BUILTIN_OBJS += builtin/repack.o
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
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
1018

1019
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
1020
EXTLIBS =
1021

J
Jeff King 已提交
1022 1023
GIT_USER_AGENT = git/$(GIT_VERSION)

1024
include config.mak.uname
1025
-include config.mak.autogen
1026
-include config.mak
1027

1028 1029 1030 1031 1032 1033 1034 1035
ifndef sysconfdir
ifeq ($(prefix),/usr)
sysconfdir = /etc
else
sysconfdir = etc
endif
endif

1036
ifdef CHECK_HEADER_DEPENDENCIES
1037
COMPUTE_HEADER_DEPENDENCIES = no
1038
USE_COMPUTED_HEADER_DEPENDENCIES =
1039 1040
endif

1041
ifndef COMPUTE_HEADER_DEPENDENCIES
1042 1043 1044 1045
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
1046
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
1047 1048
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
1049
	echo $$?)
1050
ifeq ($(dep_check),0)
1051 1052 1053
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
1054
endif
1055 1056
endif

1057
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1058
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
1059 1060 1061 1062 1063
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
1064 1065
endif

1066
ifdef SANE_TOOL_PATH
1067 1068
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
1069 1070
PATH := $(SANE_TOOL_PATH):${PATH}
else
1071
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1072 1073
endif

G
Gary V. Vaughan 已提交
1074 1075 1076 1077
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1078 1079 1080 1081
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094
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
1095 1096 1097 1098
	ifndef NO_APPLE_COMMON_CRYPTO
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1099
	NO_REGEX = YesPlease
1100
	PTHREAD_LIBS =
1101 1102
endif

1103 1104 1105 1106 1107 1108 1109 1110
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
1111 1112
endif

1113 1114 1115 1116 1117
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

M
Michał Kiedrowicz 已提交
1118 1119 1120 1121 1122 1123 1124 1125 1126
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 已提交
1127 1128
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1129 1130 1131
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1132
else
1133
	ifdef CURLDIR
1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
		CURL_LIBCURL =
	else
		CURL_CONFIG = curl-config
		ifeq "$(CURL_CONFIG)" ""
			CURL_LIBCURL =
		else
			CURL_LIBCURL := $(shell $(CURL_CONFIG) --libs)
		endif
	endif

	ifeq "$(CURL_LIBCURL)" ""
		ifdef CURL_STATIC
$(error "CURL_STATIC must be used with CURL_CONFIG")
		endif
		ifdef CURLDIR
			# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
			BASIC_CFLAGS += -I$(CURLDIR)/include
			CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib) -lcurl
		else
			CURL_LIBCURL = -lcurl
		endif
1155 1156 1157 1158 1159 1160 1161 1162 1163
		ifdef NEEDS_SSL_WITH_CURL
			CURL_LIBCURL += -lssl
			ifdef NEEDS_CRYPTO_WITH_SSL
				CURL_LIBCURL += -lcrypto
			endif
		endif
		ifdef NEEDS_IDN_WITH_CURL
			CURL_LIBCURL += -lidn
		endif
1164
	else
1165
		BASIC_CFLAGS += $(shell $(CURL_CONFIG) --cflags)
1166 1167 1168
		ifdef CURL_STATIC
			CURL_LIBCURL = $(shell $(CURL_CONFIG) --static-libs)
			ifeq "$(CURL_LIBCURL)" ""
1169
$(error libcurl not detected or not compiled with static support)
1170
			endif
1171 1172 1173
		endif
	endif

1174 1175 1176
	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)
1177 1178
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1179
	curl_check := $(shell (echo 070908; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p)
1180 1181
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1182
			PROGRAM_OBJS += http-push.o
1183
		endif
1184
	endif
1185
	ifndef NO_EXPAT
1186 1187 1188 1189 1190 1191
		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 已提交
1192 1193 1194
		ifdef EXPAT_NEEDS_XMLPARSE_H
			BASIC_CFLAGS += -DEXPAT_NEEDS_XMLPARSE_H
		endif
1195
	endif
1196 1197
endif

1198 1199
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1200
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1201 1202 1203
endif
EXTLIBS += -lz

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

1421
ifdef NO_ICONV
1422
	BASIC_CFLAGS += -DNO_ICONV
1423 1424
endif

1425 1426 1427 1428
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1429 1430 1431 1432
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1433 1434 1435 1436
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1437 1438 1439
ifdef BLK_SHA1
	SHA1_HEADER = "block-sha1/sha1.h"
	LIB_OBJS += block-sha1/sha1.o
1440
	LIB_H += block-sha1/sha1.h
1441
else
1442 1443 1444
ifdef PPC_SHA1
	SHA1_HEADER = "ppc/sha1.h"
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1445
	LIB_H += ppc/sha1.h
1446 1447 1448 1449
else
ifdef APPLE_COMMON_CRYPTO
	COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
	SHA1_HEADER = <CommonCrypto/CommonDigest.h>
1450 1451
else
	SHA1_HEADER = <openssl/sha.h>
1452
	EXTLIBS += $(LIB_4_CRYPTO)
1453 1454
endif
endif
1455 1456
endif

1457 1458 1459
ifdef NO_PERL_MAKEMAKER
	export NO_PERL_MAKEMAKER
endif
1460 1461 1462 1463
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1464 1465 1466 1467
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1468 1469 1470
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1471 1472 1473 1474
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
1475 1476 1477
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1478

J
Junio C Hamano 已提交
1479 1480 1481
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1482
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1483
	EXTLIBS += $(PTHREAD_LIBS)
1484
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1485
endif
1486

1487 1488 1489 1490
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1491 1492
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1493
	EXTLIBS += $(CHARSET_LIB)
1494 1495
endif

1496 1497 1498 1499
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1500 1501 1502 1503
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1504 1505 1506
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1507 1508 1509
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1510 1511 1512 1513
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
N
Nicolas Pitre 已提交
1514

1515
ifdef USE_NED_ALLOCATOR
1516
       COMPAT_CFLAGS += -Icompat/nedmalloc
1517 1518 1519
       COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
endif

1520 1521 1522 1523
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1524 1525 1526 1527
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1528 1529 1530 1531
ifneq (,$(XDL_FAST_HASH))
	BASIC_CFLAGS += -DXDL_FAST_HASH
endif

1532 1533 1534 1535 1536
ifdef GMTIME_UNRELIABLE_ERRORS
	COMPAT_OBJS += compat/gmtime.o
	BASIC_CFLAGS += -DGMTIME_UNRELIABLE_ERRORS
endif

1537
ifeq ($(TCLTK_PATH),)
1538
NO_TCLTK = NoThanks
1539 1540
endif

1541
ifeq ($(PERL_PATH),)
1542
NO_PERL = NoThanks
1543 1544
endif

1545
ifeq ($(PYTHON_PATH),)
1546
NO_PYTHON = NoThanks
1547 1548
endif

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

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

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

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

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

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

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

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

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

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

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

1629 1630
LIBS = $(GITLIBS) $(EXTLIBS)

1631
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
1632
	$(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1633
LIB_OBJS += $(COMPAT_OBJS)
1634

1635 1636 1637 1638 1639 1640 1641 1642 1643
# 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

1644 1645 1646 1647 1648 1649 1650
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

1651 1652 1653 1654 1655 1656 1657
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 已提交
1658 1659 1660
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))
1661 1662 1663 1664
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 已提交
1665

1666 1667 1668 1669
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

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

1673
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1674 1675


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

1678 1679
SHELL = $(SHELL_PATH)

1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690
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
1691
ifneq (,$X)
1692
	$(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';)
1693
endif
1694

1695
all::
E
Eygene Ryabinkin 已提交
1696
ifndef NO_TCLTK
1697
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1698
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
E
Eygene Ryabinkin 已提交
1699
endif
1700
ifndef NO_PERL
1701
	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' localedir='$(localedir_SQ)' all
1702
endif
1703
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1704

1705 1706 1707 1708 1709
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 已提交
1710
strip: $(PROGRAMS) git$X
F
Felipe Contreras 已提交
1711
	$(STRIP) $(STRIP_OPTS) $^
J
Junio C Hamano 已提交
1712

1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745
### 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.

1746
git.sp git.s git.o: GIT-PREFIX
1747
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1748 1749 1750
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1751

1752
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1753
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
1754
		$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
1755

1756
help.sp help.s help.o: common-cmds.h
1757

1758
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1759
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1760 1761 1762
	'-DGIT_HTML_PATH="$(htmldir_relative_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_relative_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_relative_SQ)"'
1763

1764
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1765
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1766 1767
	'-DGIT_VERSION="$(GIT_VERSION)"' \
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
1768

J
Junio C Hamano 已提交
1769
$(BUILT_INS): git$X
1770
	$(QUIET_BUILT_IN)$(RM) $@ && \
F
Felipe Contreras 已提交
1771 1772 1773
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@
J
Junio C Hamano 已提交
1774

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

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

1780
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
1781 1782
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
	$(gitwebdir_SQ):$(PERL_PATH_SQ)
1783 1784 1785 1786
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
1787
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
1788
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
1789
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
1790
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
1791
    -e $(BROKEN_PATH_FIX) \
1792 1793
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
1794 1795 1796
    $@.sh >$@+
endef

1797 1798 1799
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
1800
		echo >&2 "    * new script parameters"; \
1801 1802 1803 1804 1805
		echo "$$FLAGS" >$@; \
            fi


$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh GIT-SCRIPT-DEFINES
1806
	$(QUIET_GEN)$(cmd_munge_script) && \
1807
	chmod +x $@+ && \
1808
	mv $@+ $@
1809

1810
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1811 1812 1813
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1814
git.res: git.rc GIT-VERSION-FILE
1815
	$(QUIET_RC)$(RC) \
1816
	  $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \
1817 1818
	  -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@

1819
ifndef NO_PERL
1820 1821
$(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak

1822 1823 1824
perl/perl.mak: perl/PM.stamp

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

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

1832
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ)
1833
$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl perl/perl.mak GIT-PERL-DEFINES GIT-VERSION-FILE
1834
	$(QUIET_GEN)$(RM) $@ $@+ && \
1835
	INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
1836 1837
	INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \
	INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \
1838 1839 1840
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
	    -e '	h' \
1841
	    -e '	s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'"));=' \
1842 1843 1844
	    -e '	H' \
	    -e '	x' \
	    -e '}' \
1845
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
F
Felipe Contreras 已提交
1846
	    $< >$@+ && \
1847
	chmod +x $@+ && \
1848
	mv $@+ $@
1849

1850 1851 1852 1853 1854 1855 1856
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

1857 1858 1859 1860 1861

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

1862 1863
git-instaweb: git-instaweb.sh gitweb GIT-SCRIPT-DEFINES
	$(QUIET_GEN)$(cmd_munge_script) && \
1864
	chmod +x $@+ && \
1865
	mv $@+ $@
1866 1867 1868 1869 1870 1871 1872 1873 1874
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
1875

1876
ifndef NO_PYTHON
F
Felipe Contreras 已提交
1877 1878
$(SCRIPT_PYTHON_GEN): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
$(SCRIPT_PYTHON_GEN): % : %.py
1879
	$(QUIET_GEN)$(RM) $@ $@+ && \
1880
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
F
Felipe Contreras 已提交
1881
	    $< >$@+ && \
1882 1883 1884
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
F
Felipe Contreras 已提交
1885
$(SCRIPT_PYTHON_GEN): % : unimplemented.sh
1886 1887 1888 1889 1890 1891 1892 1893
	$(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

1894 1895 1896 1897 1898 1899
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+

1900
configure: configure.ac GIT-VERSION-FILE
1901
	$(QUIET_GEN)$(CONFIGURE_RECIPE)
1902

1903
ifdef AUTOCONFIGURED
1904 1905 1906 1907 1908 1909
# 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
1910
	$(QUIET_GEN)$(CONFIGURE_RECIPE) && \
1911
	if test -f config.status; then \
1912 1913 1914 1915 1916 1917 1918 1919 1920
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

1921 1922 1923 1924 1925 1926
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
1927
XDIFF_OBJS += xdiff/xhistogram.o
1928 1929

VCSSVN_OBJS += vcs-svn/line_buffer.o
1930
VCSSVN_OBJS += vcs-svn/sliding_window.o
1931 1932
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1933
VCSSVN_OBJS += vcs-svn/svndiff.o
1934 1935
VCSSVN_OBJS += vcs-svn/svndump.o

1936 1937 1938 1939 1940 1941 1942 1943
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
1944

1945
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1946
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1947

1948
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1949
$(dep_dirs):
1950
	@mkdir -p $@
1951 1952

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
1953
dep_file = $(dir $@).depend/$(notdir $@).d
1954
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
1955 1956 1957 1958 1959 1960
ifdef CHECK_HEADER_DEPENDENCIES
$(error cannot compute header dependencies outside a normal build. \
Please unset CHECK_HEADER_DEPENDENCIES and try again)
endif
endif

1961
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1962
ifndef CHECK_HEADER_DEPENDENCIES
1963 1964
dep_dirs =
missing_dep_dirs =
1965 1966
dep_args =
endif
1967 1968
endif

1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982
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))

1983 1984
.SUFFIXES:

1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
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
2019
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
2020
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2021
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
2022
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2023
endif
2024

2025
%.s: %.c GIT-CFLAGS FORCE
2026
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
2027 2028

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
2029 2030
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
2031 2032 2033
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
2034 2035 2036 2037 2038 2039 2040 2041
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 已提交
2042

2043
$(OBJECTS): $(LIB_H)
2044
endif
2045

2046
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
2047
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
2048 2049 2050
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
2051

2052
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
2053
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
2054
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
2055

2056
config.sp config.s config.o: GIT-PREFIX
2057 2058
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
2059

2060
attr.sp attr.s attr.o: GIT-PREFIX
2061 2062
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
2063

2064
gettext.sp gettext.s gettext.o: GIT-PREFIX
2065 2066 2067
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

2068 2069 2070
http-push.sp http.sp http-walker.sp remote-curl.sp: SPARSE_FLAGS += \
	-DCURL_DISABLE_TYPECHECK

2071
ifdef NO_EXPAT
2072
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
2073 2074
endif

2075
ifdef NO_REGEX
2076 2077
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
2078 2079
endif

2080
ifdef USE_NED_ALLOCATOR
2081
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
2082
	-DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR
2083
compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null
2084 2085
endif

2086
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
2087
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
2088

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

2093
git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
2094
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
2095
		$(LIBS) $(CURL_LIBCURL)
2096
git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS)
2097
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
2098 2099
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)

2100 2101 2102 2103
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)

2104 2105 2106 2107 2108 2109
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

2110
$(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o GIT-LDFLAGS $(GITLIBS)
2111 2112 2113
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)

P
Petr Baudis 已提交
2114
$(LIB_FILE): $(LIB_OBJS)
2115
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
P
Petr Baudis 已提交
2116

2117
$(XDIFF_LIB): $(XDIFF_OBJS)
2118
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
2119

J
Jonathan Nieder 已提交
2120
$(VCSSVN_LIB): $(VCSSVN_OBJS)
2121
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $^
2122

2123 2124
export DEFAULT_EDITOR DEFAULT_PAGER

P
Petr Baudis 已提交
2125 2126 2127
doc:
	$(MAKE) -C Documentation all

2128 2129 2130 2131 2132 2133
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

2134 2135 2136
info:
	$(MAKE) -C Documentation info

2137 2138 2139
pdf:
	$(MAKE) -C Documentation pdf

2140 2141
XGETTEXT_FLAGS = \
	--force-po \
2142
	--add-comments=TRANSLATORS: \
2143 2144
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2145 2146
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2147 2148
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2149
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
2150
LOCALIZED_C := $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2151
LOCALIZED_SH := $(SCRIPT_SH)
2152 2153 2154 2155 2156 2157 2158
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
2159 2160

po/git.pot: $(LOCALIZED_C)
2161 2162 2163
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2164 2165
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2166 2167 2168 2169
	mv $@+ $@

pot: po/git.pot

2170 2171 2172 2173 2174 2175 2176 2177 2178 2179
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 $@ $<

2180 2181 2182 2183
FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \
			$(FIND) . \( -name .git -type d -prune \) \
				-o \( -name '*.[hcS]' -type f -print \) )

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

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

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

2196
### Detect prefix changes
2197 2198 2199 2200 2201 2202
TRACK_PREFIX = $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ):\
		$(localedir_SQ)

GIT-PREFIX: FORCE
	@FLAGS='$(TRACK_PREFIX)'; \
	if test x"$$FLAGS" != x"`cat GIT-PREFIX 2>/dev/null`" ; then \
2203
		echo >&2 "    * new prefix flags"; \
2204 2205 2206 2207
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

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

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

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

J
Junio C Hamano 已提交
2225 2226 2227
# We need to apply sq twice, once to protect from the shell
# that runs GIT-BUILD-OPTIONS, and then again to protect it
# and the first level quoting from the shell that runs "echo".
2228
GIT-BUILD-OPTIONS: FORCE
J
Junio C Hamano 已提交
2229
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@
2230
	@echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@
2231
	@echo DIFF=\''$(subst ','\'',$(subst ','\'',$(DIFF)))'\' >>$@
2232
	@echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@
J
Junio C Hamano 已提交
2233
	@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@
J
Jeff King 已提交
2234
	@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@
2235
	@echo USE_LIBPCRE=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE)))'\' >>$@
2236
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@
J
Jeff King 已提交
2237
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@
2238
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@
2239 2240 2241
ifdef TEST_OUTPUT_DIRECTORY
	@echo TEST_OUTPUT_DIRECTORY=\''$(subst ','\'',$(subst ','\'',$(TEST_OUTPUT_DIRECTORY)))'\' >>$@
endif
2242 2243 2244
ifdef GIT_TEST_OPTS
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@
endif
2245 2246 2247 2248 2249 2250
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
2251
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@
2252
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@
2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264
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
2265 2266 2267
ifdef TEST_GIT_INDEX_VERSION
	@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@
endif
2268

2269 2270 2271
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2272

2273 2274
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2275
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2276
		echo >&2 "    * new Python interpreter location"; \
2277 2278 2279 2280
		echo "$$VARS" >$@; \
            fi
endif

2281 2282 2283
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)
2284
all:: $(NO_INSTALL)
2285 2286 2287 2288 2289 2290 2291

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

2293 2294 2295 2296
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2297
export NO_SVN_TESTS
2298
export TEST_NO_MALLOC_CHECK
2299

2300 2301
### Testing rules

2302
test: all
P
Petr Baudis 已提交
2303 2304
	$(MAKE) -C t/ all

2305 2306 2307 2308 2309
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

R
René Scharfe 已提交
2310 2311
test-ctype$X: ctype.o

2312
test-date$X: date.o ctype.o
P
Petr Baudis 已提交
2313

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

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

2318
test-parse-options$X: parse-options.o parse-options-cb.o
2319

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

2322
.PRECIOUS: $(TEST_OBJS)
2323

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

2327 2328 2329
check-sha1:: test-sha1$X
	./test-sha1.sh

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

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

### Installation rules

2351
ifneq ($(filter /%,$(firstword $(template_dir))),)
2352
template_instdir = $(template_dir)
2353 2354
else
template_instdir = $(prefix)/$(template_dir)
2355 2356 2357
endif
export template_instdir

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

2366 2367 2368 2369 2370 2371 2372
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2373 2374
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

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

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

2435 2436 2437
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2438 2439 2440
install-doc:
	$(MAKE) -C Documentation install

2441 2442 2443
install-man:
	$(MAKE) -C Documentation install-man

2444 2445 2446
install-html:
	$(MAKE) -C Documentation install-html

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

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

2453 2454
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2455

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

2459 2460 2461
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2462 2463 2464 2465


### Maintainer's dist rules

2466
git.spec: git.spec.in GIT-VERSION-FILE
2467 2468
	sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
	mv $@+ $@
2469

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

rpm: dist
2487 2488 2489 2490
	$(RPMBUILD) \
		--define "_source_filedigest_algorithm md5" \
		--define "_binary_filedigest_algorithm md5" \
		-ta $(GIT_TARNAME).tar.gz
2491

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

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

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

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

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

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

J
Junio C Hamano 已提交
2555 2556
### Check documentation
#
J
Jeff King 已提交
2557 2558 2559 2560
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2561
ALL_COMMANDS += git-gui git-citool
J
Junio C Hamano 已提交
2562
check-docs::
J
Jeff King 已提交
2563
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2564 2565 2566
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2567
		git-merge-resolve | git-merge-subtree | \
2568
		git-fsck-objects | git-init-db | \
2569
		git-remote-* | git-stage | \
2570
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2571 2572 2573
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
J
Junio C Hamano 已提交
2574
		sed -e '/^#/d' command-list.txt | \
2575
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2576 2577 2578 2579
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2580 2581
	done; \
	( \
J
Junio C Hamano 已提交
2582
		sed -e '/^#/d' \
2583
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2584
		    -e 's/^/listed /' command-list.txt; \
2585 2586
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2587 2588 2589 2590
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2591
		case " $(ALL_COMMANDS) " in \
2592 2593 2594 2595
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2596 2597 2598 2599 2600

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

2602 2603
### Test suite coverage testing
#
2604
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
2605
.PHONY: coverage-clean-results
2606 2607

coverage:
2608
	$(MAKE) coverage-test
2609
	$(MAKE) coverage-untested-functions
2610

2611
object_dirs := $(sort $(dir $(OBJECTS)))
2612
coverage-clean-results:
2613 2614 2615
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2616
	$(RM) -r cover_db/
2617
	$(RM) -r cover_db_html/
2618

2619 2620 2621
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2622 2623
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2624
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2625

2626
coverage-compile:
2627
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2628 2629

coverage-test: coverage-clean-results coverage-compile
2630
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2631
		DEFAULT_TEST_TARGET=test -j1 test
2632 2633

coverage-report:
2634
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2635
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2636
	done
2637 2638

coverage-untested-functions: coverage-report
2639 2640
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2641
		> coverage-untested-functions
2642 2643 2644

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2645 2646 2647

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