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

S
Shawn O. Pearce 已提交
4
# Define V=1 to have a more verbose compile.
5
#
6 7 8 9 10
# Define SHELL_PATH to a POSIX shell if your /bin/sh is broken.
#
# Define SANE_TOOL_PATH to a colon-separated list of paths to prepend
# to PATH if your tools in /usr/bin are broken.
#
11 12 13
# Define SOCKLEN_T to a suitable type (such as 'size_t') if your
# system headers do not define a socklen_t type.
#
G
Gary V. Vaughan 已提交
14 15 16
# Define INLINE to a suitable substitute (such as '__inline' or '') if git
# fails to compile with errors about undefined inline functions or similar.
#
17 18 19 20
# Define SNPRINTF_RETURNS_BOGUS if your are on a system which snprintf()
# or vsnprintf() return -1 instead of number of characters which would
# have been written to the final string if enough space had been available.
#
21 22 23
# Define FREAD_READS_DIRECTORIES if your are on a system which succeeds
# when attempting to read from an fopen'ed directory.
#
24
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
25
# This also implies BLK_SHA1.
26
#
M
Michał Kiedrowicz 已提交
27 28 29 30 31 32
# Define USE_LIBPCRE if you have and want to use libpcre. git-grep will be
# able to use Perl-compatible regular expressions.
#
# Define LIBPCREDIR=/foo/bar if your libpcre header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
33
# Define NO_CURL if you do not have libcurl installed.  git-http-fetch and
34
# git-http-push are not built, and you cannot use http:// and https://
35
# transports (neither smart nor dumb).
36
#
P
Patrick Mauritz 已提交
37 38 39
# Define CURLDIR=/foo/bar if your curl header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
40
# Define NO_EXPAT if you do not have expat installed.  git-http-push is
41
# not built, and you cannot push using http:// and https:// transports (dumb).
42
#
43 44 45
# Define EXPATDIR=/foo/bar if your expat header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
46 47 48 49
# 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.
#
50 51 52
# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust
# the installed gettext translation of the shell scripts output.
#
53 54 55 56 57 58
# 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.
#
59 60 61 62
# Define CHARSET_LIB to you need to link with library other than -liconv to
# use locale_charset() function.  On some platforms this needs to set to
# -lcharset
#
63 64 65 66 67 68
# 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
#
69 70 71
# Define HAVE_PATHS_H if you have paths.h and want to use the default PATH
# it specifies.
#
72 73
# Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
#
74
# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
75
# d_type in struct dirent (Cygwin 1.5, fixed in Cygwin 1.7).
76
#
77 78
# Define HAVE_STRINGS_H if you have strings.h and need it for strcasecmp.
#
79 80
# Define NO_STRCASESTR if you don't have strcasestr.
#
R
René Scharfe 已提交
81 82
# Define NO_MEMMEM if you don't have memmem.
#
M
Matt Kraai 已提交
83 84
# Define NO_GETPAGESIZE if you don't have getpagesize.
#
85 86
# Define NO_STRLCPY if you don't have strlcpy.
#
87 88
# 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
89 90
# strtoull, define NO_STRTOULL.
#
J
Jason Riedy 已提交
91 92
# Define NO_SETENV if you don't have setenv in the C library.
#
93 94
# Define NO_UNSETENV if you don't have unsetenv in the C library.
#
95 96
# Define NO_MKDTEMP if you don't have mkdtemp in the C library.
#
97 98
# Define MKDIR_WO_TRAILING_SLASH if your mkdir() can't deal with trailing slash.
#
99 100
# Define NO_MKSTEMPS if you don't have mkstemps in the C library.
#
J
Jonathan Nieder 已提交
101 102
# Define NO_STRTOK_R if you don't have strtok_r in the C library.
#
103 104
# Define NO_FNMATCH if you don't have fnmatch in the C library.
#
105 106 107
# Define NO_FNMATCH_CASEFOLD if your fnmatch function doesn't have the
# FNM_CASEFOLD GNU extension.
#
108 109 110
# Define USE_WILDMATCH if you want to use Git's wildmatch
# implementation as fnmatch
#
111 112 113
# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
# in the C library.
#
114 115
# Define NO_LIBGEN_H if you don't have libgen.h.
#
116 117
# Define NEEDS_LIBGEN if your libgen needs -lgen when linking
#
118 119
# Define NO_SYS_SELECT_H if you don't have sys/select.h.
#
120 121
# 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.
122
#
P
Pavel Roskin 已提交
123
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
E
Eric Wong 已提交
124 125 126
# 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.
#
127 128 129 130 131 132 133 134 135 136 137 138
# 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.
#
139 140
# Define BLK_SHA1 environment variable to make use of the bundled
# optimized C SHA1 routine.
141
#
142 143
# Define PPC_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for PowerPC.
144
#
145 146 147
# 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).
148
#
149 150 151 152
# Define NEEDS_SSL_WITH_CURL if you need -lssl with -lcurl (Minix).
#
# Define NEEDS_IDN_WITH_CURL if you need -lidn when using -lcurl (Minix).
#
153
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
154
#
J
Joachim Schmitz 已提交
155 156 157 158 159 160
# Define NEEDS_LIBINTL_BEFORE_LIBICONV if you need libintl before libiconv.
#
# Define NO_INTPTR_T if you don't have intptr_t nor uintptr_t.
#
# Define NO_UINTMAX_T if you don't have uintmax_t.
#
161 162 163
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
164 165 166 167
# 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.
#
168 169
# Define NO_MMAP if you want to avoid mmap.
#
170 171 172 173 174
# 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.
#
175 176 177
# 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.
178
#
J
Junio C Hamano 已提交
179 180
# Define NO_PTHREADS if you do not have or do not want to use Pthreads.
#
181
# Define NO_PREAD if you have a problem with pread() system call (e.g.
182
# cygwin1.dll before v1.5.22).
183
#
184 185 186 187 188
# 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
#
189 190 191
# Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
# thread-safe. (e.g. compat/pread.c or cygwin)
#
192 193 194
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
195 196 197
# Define NO_TRUSTABLE_FILEMODE if your filesystem may claim to support
# the executable mode bit, but doesn't really do so.
#
198 199
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
#
200 201
# Define NO_UNIX_SOCKETS if your system does not offer unix sockets.
#
202 203 204
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
205 206
# Define NO_ICONV if your libc does not properly support iconv.
#
207 208 209
# Define OLD_ICONV if your library has an old iconv(), where the second
# (input buffer pointer) parameter is declared with type (const char **).
#
210 211
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
#
212 213 214
# 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.
215
#
J
Junio C Hamano 已提交
216 217 218
# 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)
#
219 220 221 222 223
# 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).
224
#
225 226 227
# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
# "st_ctim"
#
228 229 230
# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
# available.  This automatically turns USE_NSEC off.
#
231
# Define USE_STDEV below if you want git to care about the underlying device
232
# change being considered an inode change from the update-index perspective.
233
#
234 235 236
# 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.
#
237 238 239
# 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 已提交
240 241
# Define ASCIIDOC_ROFF if your DocBook XSL does not escape raw roff directives
# (versions 1.68.1 through v1.72).
242
#
T
Thomas Rast 已提交
243 244 245 246
# 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.
#
247 248
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
249 250 251
# Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
# MakeMaker (e.g. using ActiveState under Cygwin).
#
252 253
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
254 255 256
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
# but /usr/bin/python2.7 on some platforms).
#
257 258
# Define NO_PYTHON if you do not want Python scripts or libraries at all.
#
E
Eygene Ryabinkin 已提交
259 260
# Define NO_TCLTK if you do not want Tcl/Tk GUI.
#
261 262 263 264 265
# 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.
266 267 268
# 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).
#
269 270 271 272
# 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().
#
273 274 275
# 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.
276
#
277 278
# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
# when hardlinking a file to another name and unlinking the original file right
279
# away (some NTFS drivers seem to zero the contents in that scenario).
280
#
281 282
# 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.
283
#
J
Junio C Hamano 已提交
284 285 286
# 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.
#
287 288
# Define USE_NED_ALLOCATOR if you want to replace the platforms default
# memory allocators with the nedmalloc allocator written by Niall Douglas.
289 290
#
# Define NO_REGEX if you have no or inferior regex support in your C library.
291
#
292 293 294 295
# Define CYGWIN_V15_WIN32API if you are using Cygwin v1.7.x but are not
# using the current w32api packages. The recommended approach, however,
# is to update your installation if compilation errors occur.
#
J
Jeff King 已提交
296 297 298
# Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the
# user.
#
299
# Define GETTEXT_POISON if you are debugging the choice of strings marked
300 301 302
# 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.
303
#
304 305
# Define JSMIN to point to JavaScript minifier that functions as
# a filter to have gitweb.js minified.
J
Junio C Hamano 已提交
306
#
307 308 309
# Define CSSMIN to point to a CSS minifier in order to generate a minified
# version of gitweb.css
#
310 311 312 313
# 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.
#
314 315 316 317 318 319 320
# 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'
321
#
322 323 324 325 326 327
# 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.
#
328 329
# Define CHECK_HEADER_DEPENDENCIES to check for problems in the hard-coded
# dependency rules.
J
Junio C Hamano 已提交
330
#
331
# Define NATIVE_CRLF if your platform uses CRLF for line endings.
332 333 334 335 336
#
# 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 已提交
337 338 339
#
# Define GIT_USER_AGENT if you want to change how git identifies itself during
# network interactions.  The default is "git/$(GIT_VERSION)".
340
#
341 342 343
# 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.
344

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

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

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

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

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

387
export prefix bindir sharedir sysconfdir gitwebdir localedir
388

389
CC = cc
390
AR = ar
391
RM = rm -f
392
DIFF = diff
393
TAR = tar
394
FIND = find
395 396
INSTALL = install
RPMBUILD = rpmbuild
397
TCL_PATH = tclsh
398
TCLTK_PATH = wish
399
XGETTEXT = xgettext
400
MSGFMT = msgfmt
401
PTHREAD_LIBS = -lpthread
402
PTHREAD_CFLAGS =
403
GCOV = gcov
404

405 406
export TCL_PATH TCLTK_PATH

407
SPARSE_FLAGS =
408

P
Petr Baudis 已提交
409 410 411 412


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

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

419 420 421 422 423
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
424 425
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
426
GENERATED_H =
427
EXTRA_CPPFLAGS =
428 429
LIB_H =
LIB_OBJS =
430
PROGRAM_OBJS =
431 432
PROGRAMS =
SCRIPT_PERL =
433
SCRIPT_PYTHON =
434
SCRIPT_SH =
435
SCRIPT_LIB =
436
TEST_PROGRAMS_NEED_X =
437

J
Jonathan Nieder 已提交
438 439 440 441 442 443
# 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

444 445
SCRIPT_SH += git-am.sh
SCRIPT_SH += git-bisect.sh
446
SCRIPT_SH += git-difftool--helper.sh
447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
SCRIPT_SH += git-filter-branch.sh
SCRIPT_SH += git-lost-found.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
SCRIPT_SH += git-repack.sh
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

462 463
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
464 465 466
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
467
SCRIPT_LIB += git-sh-setup
468
SCRIPT_LIB += git-sh-i18n
469

470
SCRIPT_PERL += git-add--interactive.perl
471
SCRIPT_PERL += git-difftool.perl
472 473 474 475 476 477 478
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
479

480
SCRIPT_PYTHON += git-remote-testpy.py
P
Pete Wyckoff 已提交
481
SCRIPT_PYTHON += git-p4.py
482

483 484
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
	  $(patsubst %.perl,%,$(SCRIPT_PERL)) \
485
	  $(patsubst %.py,%,$(SCRIPT_PYTHON)) \
486
	  git-instaweb
487

488 489
ETAGS_TARGET = TAGS

490 491
# Empty...
EXTRA_PROGRAMS =
492

493 494
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
495

496
PROGRAM_OBJS += credential-store.o
497
PROGRAM_OBJS += daemon.o
498
PROGRAM_OBJS += fast-import.o
499
PROGRAM_OBJS += http-backend.o
500
PROGRAM_OBJS += imap-send.o
501
PROGRAM_OBJS += sh-i18n--envsubst.o
502 503 504
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
505
PROGRAM_OBJS += remote-testsvn.o
506

507 508 509
# Binary suffix, set to .exe for Windows builds
X =

510
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
511

512 513 514 515 516 517
TEST_PROGRAMS_NEED_X += test-chmtime
TEST_PROGRAMS_NEED_X += test-ctype
TEST_PROGRAMS_NEED_X += test-date
TEST_PROGRAMS_NEED_X += test-delta
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
TEST_PROGRAMS_NEED_X += test-genrandom
J
Jeff King 已提交
518
TEST_PROGRAMS_NEED_X += test-index-version
D
David Barr 已提交
519
TEST_PROGRAMS_NEED_X += test-line-buffer
520
TEST_PROGRAMS_NEED_X += test-match-trees
R
René Scharfe 已提交
521
TEST_PROGRAMS_NEED_X += test-mergesort
J
Jeff King 已提交
522
TEST_PROGRAMS_NEED_X += test-mktemp
523 524
TEST_PROGRAMS_NEED_X += test-parse-options
TEST_PROGRAMS_NEED_X += test-path-utils
525
TEST_PROGRAMS_NEED_X += test-regex
526
TEST_PROGRAMS_NEED_X += test-revision-walking
527
TEST_PROGRAMS_NEED_X += test-run-command
528
TEST_PROGRAMS_NEED_X += test-scrap-cache-tree
529 530
TEST_PROGRAMS_NEED_X += test-sha1
TEST_PROGRAMS_NEED_X += test-sigchain
531
TEST_PROGRAMS_NEED_X += test-string-list
532
TEST_PROGRAMS_NEED_X += test-subprocess
D
David Barr 已提交
533
TEST_PROGRAMS_NEED_X += test-svn-fe
534
TEST_PROGRAMS_NEED_X += test-wildmatch
535

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

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

BUILT_INS += git-cherry$X
543
BUILT_INS += git-cherry-pick$X
544 545 546 547 548 549 550 551
BUILT_INS += git-format-patch$X
BUILT_INS += git-fsck-objects$X
BUILT_INS += git-get-tar-commit-id$X
BUILT_INS += git-init$X
BUILT_INS += git-merge-subtree$X
BUILT_INS += git-peek-remote$X
BUILT_INS += git-repo-config$X
BUILT_INS += git-show$X
J
Junio C Hamano 已提交
552
BUILT_INS += git-stage$X
553 554
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
555

556 557
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
558
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
559

E
Eygene Ryabinkin 已提交
560
# what 'all' will build but not install in gitexecdir
561
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
562

563 564 565 566 567 568 569 570 571
# 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

572 573 574 575 576 577 578
# 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
579 580 581
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
582

L
Luben Tuikov 已提交
583
export PERL_PATH
584
export PYTHON_PATH
L
Luben Tuikov 已提交
585

586 587 588
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
589

590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
LIB_H += xdiff/xinclude.h
LIB_H += xdiff/xmacros.h
LIB_H += xdiff/xdiff.h
LIB_H += xdiff/xtypes.h
LIB_H += xdiff/xutils.h
LIB_H += xdiff/xprepare.h
LIB_H += xdiff/xdiffi.h
LIB_H += xdiff/xemit.h

LIB_H += vcs-svn/line_buffer.h
LIB_H += vcs-svn/sliding_window.h
LIB_H += vcs-svn/repo_tree.h
LIB_H += vcs-svn/fast_export.h
LIB_H += vcs-svn/svndiff.h
LIB_H += vcs-svn/svndump.h
605

J
Jeff King 已提交
606
GENERATED_H += common-cmds.h
607

608
LIB_H += advice.h
609
LIB_H += archive.h
610
LIB_H += argv-array.h
611
LIB_H += attr.h
J
Jeff King 已提交
612
LIB_H += bisect.h
613
LIB_H += blob.h
J
Jeff King 已提交
614
LIB_H += branch.h
615
LIB_H += builtin.h
616
LIB_H += bulk-checkin.h
J
Jeff King 已提交
617
LIB_H += bundle.h
618
LIB_H += cache-tree.h
J
Jeff King 已提交
619
LIB_H += cache.h
620
LIB_H += color.h
J
Jeff King 已提交
621
LIB_H += column.h
622
LIB_H += commit.h
623
LIB_H += compat/bswap.h
624
LIB_H += compat/cygwin.h
625
LIB_H += compat/mingw.h
626
LIB_H += compat/obstack.h
627
LIB_H += compat/poll/poll.h
628
LIB_H += compat/precompose_utf8.h
J
Jeff King 已提交
629
LIB_H += compat/terminal.h
630
LIB_H += compat/win32/dirent.h
631
LIB_H += compat/win32/pthread.h
M
Mike Pape 已提交
632
LIB_H += compat/win32/syslog.h
633
LIB_H += connected.h
634
LIB_H += convert.h
J
Jeff King 已提交
635
LIB_H += credential.h
636 637 638 639
LIB_H += csum-file.h
LIB_H += decorate.h
LIB_H += delta.h
LIB_H += diff.h
640
LIB_H += diffcore.h
641
LIB_H += dir.h
642
LIB_H += exec_cmd.h
J
Jeff King 已提交
643
LIB_H += fetch-pack.h
644
LIB_H += fmt-merge-msg.h
645
LIB_H += fsck.h
646
LIB_H += gettext.h
647
LIB_H += git-compat-util.h
648
LIB_H += gpg-interface.h
A
Adam Simpkins 已提交
649
LIB_H += graph.h
650 651
LIB_H += grep.h
LIB_H += hash.h
652
LIB_H += help.h
J
Jeff King 已提交
653
LIB_H += http.h
F
Fredrik Kuivinen 已提交
654
LIB_H += kwset.h
655
LIB_H += levenshtein.h
656 657 658 659
LIB_H += list-objects.h
LIB_H += ll-merge.h
LIB_H += log-tree.h
LIB_H += mailmap.h
660
LIB_H += merge-blobs.h
661
LIB_H += merge-recursive.h
R
René Scharfe 已提交
662
LIB_H += mergesort.h
J
Jeff King 已提交
663
LIB_H += notes-cache.h
664
LIB_H += notes-merge.h
J
Jeff King 已提交
665
LIB_H += notes.h
666
LIB_H += object.h
667
LIB_H += pack-refs.h
668
LIB_H += pack-revindex.h
J
Jeff King 已提交
669
LIB_H += pack.h
670 671
LIB_H += parse-options.h
LIB_H += patch-ids.h
672
LIB_H += pathspec.h
673 674
LIB_H += pkt-line.h
LIB_H += progress.h
675
LIB_H += prompt.h
676
LIB_H += quote.h
J
Jeff King 已提交
677
LIB_H += reachable.h
678 679 680
LIB_H += reflog-walk.h
LIB_H += refs.h
LIB_H += remote.h
681
LIB_H += rerere.h
682
LIB_H += resolve-undo.h
683 684
LIB_H += revision.h
LIB_H += run-command.h
J
Jeff King 已提交
685
LIB_H += send-pack.h
686
LIB_H += sequencer.h
687
LIB_H += sha1-array.h
688
LIB_H += sha1-lookup.h
J
Jeff King 已提交
689
LIB_H += shortlog.h
690
LIB_H += sideband.h
691
LIB_H += sigchain.h
692
LIB_H += strbuf.h
693
LIB_H += streaming.h
694
LIB_H += string-list.h
695
LIB_H += submodule.h
696
LIB_H += tag.h
J
Jeff King 已提交
697
LIB_H += tar.h
698
LIB_H += thread-utils.h
699 700
LIB_H += transport.h
LIB_H += tree-walk.h
J
Jeff King 已提交
701
LIB_H += tree.h
702
LIB_H += unpack-trees.h
J
Jeff King 已提交
703
LIB_H += url.h
704
LIB_H += userdiff.h
705
LIB_H += utf8.h
706
LIB_H += varint.h
J
Jeff King 已提交
707
LIB_H += walker.h
708
LIB_H += wildmatch.h
J
Jeff King 已提交
709
LIB_H += wt-status.h
710 711
LIB_H += xdiff-interface.h
LIB_H += xdiff/xdiff.h
712

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

852 853 854 855 856 857 858 859 860 861
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 已提交
862
BUILTIN_OBJS += builtin/check-ignore.o
863 864 865 866 867
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
868
BUILTIN_OBJS += builtin/column.o
869 870 871 872
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
873
BUILTIN_OBJS += builtin/credential.o
874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907
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
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 已提交
908
BUILTIN_OBJS += builtin/notes.o
909 910 911 912 913 914 915 916 917 918 919
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 已提交
920
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
921
BUILTIN_OBJS += builtin/remote-fd.o
922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946
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/tar-tree.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
947

948
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
949
EXTLIBS =
950

J
Jeff King 已提交
951 952
GIT_USER_AGENT = git/$(GIT_VERSION)

953
include config.mak.uname
954
-include config.mak.autogen
955
-include config.mak
956

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

965
ifdef CHECK_HEADER_DEPENDENCIES
966
COMPUTE_HEADER_DEPENDENCIES = no
967
USE_COMPUTED_HEADER_DEPENDENCIES =
968 969
endif

970
ifndef COMPUTE_HEADER_DEPENDENCIES
971 972 973 974
COMPUTE_HEADER_DEPENDENCIES = auto
endif

ifeq ($(COMPUTE_HEADER_DEPENDENCIES),auto)
975
dep_check = $(shell $(CC) $(ALL_CFLAGS) \
976 977
	-c -MF /dev/null -MQ /dev/null -MMD -MP \
	-x c /dev/null -o /dev/null 2>&1; \
978
	echo $$?)
979
ifeq ($(dep_check),0)
980 981 982
override COMPUTE_HEADER_DEPENDENCIES = yes
else
override COMPUTE_HEADER_DEPENDENCIES = no
983
endif
984 985
endif

986
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
987
USE_COMPUTED_HEADER_DEPENDENCIES = YesPlease
988 989 990 991 992
else
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),no)
$(error please set COMPUTE_HEADER_DEPENDENCIES to yes, no, or auto \
(not "$(COMPUTE_HEADER_DEPENDENCIES)"))
endif
993 994
endif

995
ifdef SANE_TOOL_PATH
996 997
SANE_TOOL_PATH_SQ = $(subst ','\'',$(SANE_TOOL_PATH))
BROKEN_PATH_FIX = 's|^\# @@BROKEN_PATH_FIX@@$$|git_broken_path_fix $(SANE_TOOL_PATH_SQ)|'
998 999
PATH := $(SANE_TOOL_PATH):${PATH}
else
1000
BROKEN_PATH_FIX = '/^\# @@BROKEN_PATH_FIX@@$$/d'
1001 1002
endif

G
Gary V. Vaughan 已提交
1003 1004 1005 1006
ifneq (,$(INLINE))
	BASIC_CFLAGS += -Dinline=$(INLINE)
endif

1007 1008 1009 1010
ifneq (,$(SOCKLEN_T))
	BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T)
endif

1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
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
1024
	PTHREAD_LIBS =
1025 1026
endif

1027 1028 1029 1030 1031 1032 1033 1034
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
1035 1036
endif

1037 1038 1039 1040 1041
ifdef NO_LIBGEN_H
	COMPAT_CFLAGS += -DNO_LIBGEN_H
	COMPAT_OBJS += compat/basename.o
endif

M
Michał Kiedrowicz 已提交
1042 1043 1044 1045 1046 1047 1048 1049 1050
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 已提交
1051 1052
ifdef NO_CURL
	BASIC_CFLAGS += -DNO_CURL
1053 1054 1055
	REMOTE_CURL_PRIMARY =
	REMOTE_CURL_ALIASES =
	REMOTE_CURL_NAMES =
D
Daniel Barkalow 已提交
1056
else
1057
	ifdef CURLDIR
1058
		# Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
1059
		BASIC_CFLAGS += -I$(CURLDIR)/include
1060
		CURL_LIBCURL = -L$(CURLDIR)/$(lib) $(CC_LD_DYNPATH)$(CURLDIR)/$(lib) -lcurl
1061 1062 1063
	else
		CURL_LIBCURL = -lcurl
	endif
1064
	ifdef NEEDS_SSL_WITH_CURL
1065
		CURL_LIBCURL += -lssl
1066 1067 1068 1069 1070 1071 1072 1073
		ifdef NEEDS_CRYPTO_WITH_SSL
			CURL_LIBCURL += -lcrypto
		endif
	endif
	ifdef NEEDS_IDN_WITH_CURL
		CURL_LIBCURL += -lidn
	endif

1074 1075 1076
	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)
1077 1078
	PROGRAM_OBJS += http-fetch.o
	PROGRAMS += $(REMOTE_CURL_NAMES)
1079
	curl_check := $(shell (echo 070908; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p)
1080 1081
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
1082
			PROGRAM_OBJS += http-push.o
1083
		endif
1084
	endif
1085
	ifndef NO_EXPAT
1086 1087 1088 1089 1090 1091
		ifdef EXPATDIR
			BASIC_CFLAGS += -I$(EXPATDIR)/include
			EXPAT_LIBEXPAT = -L$(EXPATDIR)/$(lib) $(CC_LD_DYNPATH)$(EXPATDIR)/$(lib) -lexpat
		else
			EXPAT_LIBEXPAT = -lexpat
		endif
1092
	endif
1093 1094
endif

1095 1096
ifdef ZLIB_PATH
	BASIC_CFLAGS += -I$(ZLIB_PATH)/include
1097
	EXTLIBS += -L$(ZLIB_PATH)/$(lib) $(CC_LD_DYNPATH)$(ZLIB_PATH)/$(lib)
1098 1099 1100
endif
EXTLIBS += -lz

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

1333
ifdef NO_ICONV
1334
	BASIC_CFLAGS += -DNO_ICONV
1335 1336
endif

1337 1338 1339 1340
ifdef OLD_ICONV
	BASIC_CFLAGS += -DOLD_ICONV
endif

1341 1342 1343 1344
ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

1345 1346 1347 1348
ifdef NO_POSIX_GOODIES
	BASIC_CFLAGS += -DNO_POSIX_GOODIES
endif

1349 1350 1351
ifdef BLK_SHA1
	SHA1_HEADER = "block-sha1/sha1.h"
	LIB_OBJS += block-sha1/sha1.o
1352
	LIB_H += block-sha1/sha1.h
1353
else
1354 1355 1356
ifdef PPC_SHA1
	SHA1_HEADER = "ppc/sha1.h"
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
1357
	LIB_H += ppc/sha1.h
1358 1359
else
	SHA1_HEADER = <openssl/sha.h>
1360
	EXTLIBS += $(LIB_4_CRYPTO)
1361 1362
endif
endif
1363 1364 1365
ifdef NO_PERL_MAKEMAKER
	export NO_PERL_MAKEMAKER
endif
1366 1367 1368 1369
ifdef NO_HSTRERROR
	COMPAT_CFLAGS += -DNO_HSTRERROR
	COMPAT_OBJS += compat/hstrerror.o
endif
R
René Scharfe 已提交
1370 1371 1372 1373
ifdef NO_MEMMEM
	COMPAT_CFLAGS += -DNO_MEMMEM
	COMPAT_OBJS += compat/memmem.o
endif
M
Matt Kraai 已提交
1374 1375 1376
ifdef NO_GETPAGESIZE
	COMPAT_CFLAGS += -DNO_GETPAGESIZE
endif
1377 1378 1379 1380
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
	COMPAT_OBJS += compat/qsort.o
endif
1381 1382 1383
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif
1384

J
Junio C Hamano 已提交
1385 1386 1387
ifdef NO_PTHREADS
	BASIC_CFLAGS += -DNO_PTHREADS
else
1388
	BASIC_CFLAGS += $(PTHREAD_CFLAGS)
J
Junio C Hamano 已提交
1389
	EXTLIBS += $(PTHREAD_LIBS)
1390
	LIB_OBJS += thread-utils.o
N
Nicolas Pitre 已提交
1391
endif
1392

1393 1394 1395 1396
ifdef HAVE_PATHS_H
	BASIC_CFLAGS += -DHAVE_PATHS_H
endif

1397 1398
ifdef HAVE_LIBCHARSET_H
	BASIC_CFLAGS += -DHAVE_LIBCHARSET_H
1399
	EXTLIBS += $(CHARSET_LIB)
1400 1401
endif

1402 1403 1404 1405
ifdef HAVE_STRINGS_H
	BASIC_CFLAGS += -DHAVE_STRINGS_H
endif

J
Jeff King 已提交
1406 1407 1408 1409
ifdef HAVE_DEV_TTY
	BASIC_CFLAGS += -DHAVE_DEV_TTY
endif

1410 1411 1412
ifdef DIR_HAS_BSD_GROUP_SEMANTICS
	COMPAT_CFLAGS += -DDIR_HAS_BSD_GROUP_SEMANTICS
endif
1413 1414 1415
ifdef UNRELIABLE_FSTAT
	BASIC_CFLAGS += -DUNRELIABLE_FSTAT
endif
1416 1417 1418 1419
ifdef NO_REGEX
	COMPAT_CFLAGS += -Icompat/regex
	COMPAT_OBJS += compat/regex/regex.o
endif
1420 1421
ifdef CYGWIN_V15_WIN32API
	COMPAT_CFLAGS += -DCYGWIN_V15_WIN32API
1422
endif
N
Nicolas Pitre 已提交
1423

1424
ifdef USE_NED_ALLOCATOR
1425
       COMPAT_CFLAGS += -Icompat/nedmalloc
1426 1427 1428
       COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
endif

1429 1430 1431 1432
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

1433 1434 1435 1436
ifndef NO_MSGFMT_EXTENDED_OPTIONS
	MSGFMT += --check --statistics
endif

1437 1438 1439 1440
ifneq (,$(XDL_FAST_HASH))
	BASIC_CFLAGS += -DXDL_FAST_HASH
endif

1441
ifeq ($(TCLTK_PATH),)
1442
NO_TCLTK = NoThanks
1443 1444
endif

1445
ifeq ($(PERL_PATH),)
1446
NO_PERL = NoThanks
1447 1448
endif

1449
ifeq ($(PYTHON_PATH),)
1450
NO_PYTHON = NoThanks
1451 1452
endif

1453
QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
1454 1455
QUIET_SUBDIR1  =

1456 1457 1458 1459 1460 1461
ifneq ($(findstring $(MAKEFLAGS),w),w)
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

1462
ifneq ($(findstring $(MAKEFLAGS),s),s)
S
Shawn O. Pearce 已提交
1463
ifndef V
A
Alex Riesen 已提交
1464
	QUIET_CC       = @echo '   ' CC $@;
1465 1466 1467 1468
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
1469
	QUIET_LNCP     = @echo '   ' LN/CP $@;
1470
	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
1471
	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
1472
	QUIET_GCOV     = @echo '   ' GCOV $@;
1473
	QUIET_SP       = @echo '   ' SP $<;
1474
	QUIET_SUBDIR0  = +@subdir=
1475 1476
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
S
Shawn O. Pearce 已提交
1477
	export V
A
Alex Riesen 已提交
1478
	export QUIET_GEN
1479 1480
	export QUIET_BUILT_IN
endif
1481
endif
1482

J
Junio C Hamano 已提交
1483 1484 1485 1486
ifdef NO_INSTALL_HARDLINKS
	export NO_INSTALL_HARDLINKS
endif

1487 1488 1489 1490 1491 1492 1493
### profile feedback build
#

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

1494
ifeq ("$(PROFILE)","GEN")
1495 1496
	CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1
	EXTLIBS += -lgcov
1497 1498
	export CCACHE_DISABLE = t
	V = 1
1499 1500
else
ifneq ("$(PROFILE)","")
1501
	CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1
1502 1503
	export CCACHE_DISABLE = t
	V = 1
1504
endif
1505
endif
1506

P
Pavel Roskin 已提交
1507
# Shell quote (do not use $(call) to accommodate ancient setups);
1508 1509

SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
1510
ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
1511
ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
1512 1513 1514

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
1515
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
1516
mandir_SQ = $(subst ','\'',$(mandir))
1517
infodir_SQ = $(subst ','\'',$(infodir))
1518
localedir_SQ = $(subst ','\'',$(localedir))
1519 1520
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
1521
htmldir_SQ = $(subst ','\'',$(htmldir))
1522
prefix_SQ = $(subst ','\'',$(prefix))
1523
gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1524 1525 1526

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1527
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1528
TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
1529
DIFF_SQ = $(subst ','\'',$(DIFF))
1530

1531 1532
LIBS = $(GITLIBS) $(EXTLIBS)

1533
BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' \
1534
	$(COMPAT_CFLAGS)
J
Jason Riedy 已提交
1535
LIB_OBJS += $(COMPAT_OBJS)
1536

1537 1538 1539 1540 1541 1542 1543 1544 1545
# 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

1546 1547 1548 1549 1550 1551 1552
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

1553 1554 1555 1556 1557 1558 1559
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 已提交
1560 1561 1562
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))
1563 1564 1565 1566
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 已提交
1567

1568 1569 1570 1571
ifdef DEFAULT_HELP_FORMAT
BASIC_CFLAGS += -DDEFAULT_HELP_FORMAT='"$(DEFAULT_HELP_FORMAT)"'
endif

1572 1573 1574
ALL_CFLAGS += $(BASIC_CFLAGS)
ALL_LDFLAGS += $(BASIC_LDFLAGS)

1575
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1576 1577


P
Petr Baudis 已提交
1578 1579
### Build rules

1580 1581
SHELL = $(SHELL_PATH)

1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
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
1593
ifneq (,$X)
1594
	$(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';)
1595
endif
1596

1597
all::
E
Eygene Ryabinkin 已提交
1598
ifndef NO_TCLTK
1599
	$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
J
Junio C Hamano 已提交
1600
	$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
E
Eygene Ryabinkin 已提交
1601
endif
1602
ifndef NO_PERL
1603
	$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' localedir='$(localedir_SQ)' all
1604 1605 1606
endif
ifndef NO_PYTHON
	$(QUIET_SUBDIR0)git_remote_helpers $(QUIET_SUBDIR1) PYTHON_PATH='$(PYTHON_PATH_SQ)' prefix='$(prefix_SQ)' all
1607
endif
1608
	$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
1609

1610 1611 1612 1613 1614
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 已提交
1615 1616 1617
strip: $(PROGRAMS) git$X
	$(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X

1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
### 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.

1651
git.sp git.s git.o: GIT-PREFIX
1652
git.sp git.s git.o: EXTRA_CPPFLAGS = \
1653 1654 1655
	'-DGIT_HTML_PATH="$(htmldir_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_SQ)"'
1656

1657
git$X: git.o GIT-LDFLAGS $(BUILTIN_OBJS) $(GITLIBS)
1658
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ git.o \
1659
		$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
1660

1661
help.sp help.s help.o: common-cmds.h
1662

1663
builtin/help.sp builtin/help.s builtin/help.o: common-cmds.h GIT-PREFIX
1664
builtin/help.sp builtin/help.s builtin/help.o: EXTRA_CPPFLAGS = \
1665 1666 1667
	'-DGIT_HTML_PATH="$(htmldir_SQ)"' \
	'-DGIT_MAN_PATH="$(mandir_SQ)"' \
	'-DGIT_INFO_PATH="$(infodir_SQ)"'
1668

1669
version.sp version.s version.o: GIT-VERSION-FILE GIT-USER-AGENT
1670
version.sp version.s version.o: EXTRA_CPPFLAGS = \
1671 1672
	'-DGIT_VERSION="$(GIT_VERSION)"' \
	'-DGIT_USER_AGENT=$(GIT_USER_AGENT_CQ_SQ)'
1673

J
Junio C Hamano 已提交
1674
$(BUILT_INS): git$X
1675 1676 1677 1678
	$(QUIET_BUILT_IN)$(RM) $@ && \
	ln git$X $@ 2>/dev/null || \
	ln -s git$X $@ 2>/dev/null || \
	cp git$X $@
J
Junio C Hamano 已提交
1679

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

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

1685
SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
1686 1687
	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
	$(gitwebdir_SQ):$(PERL_PATH_SQ)
1688 1689 1690 1691
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
1692
    -e 's|@@DIFF@@|$(DIFF_SQ)|' \
1693
    -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \
1694
    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
1695
    -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \
1696
    -e $(BROKEN_PATH_FIX) \
1697 1698
    -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \
    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
1699 1700 1701
    $@.sh >$@+
endef

1702 1703 1704
GIT-SCRIPT-DEFINES: FORCE
	@FLAGS='$(SCRIPT_DEFINES)'; \
	    if test x"$$FLAGS" != x"`cat $@ 2>/dev/null`" ; then \
1705
		echo >&2 "    * new script parameters"; \
1706 1707 1708 1709 1710
		echo "$$FLAGS" >$@; \
            fi


$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh GIT-SCRIPT-DEFINES
1711
	$(QUIET_GEN)$(cmd_munge_script) && \
1712
	chmod +x $@+ && \
1713
	mv $@+ $@
1714

1715
$(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES
1716 1717 1718
	$(QUIET_GEN)$(cmd_munge_script) && \
	mv $@+ $@

1719
ifndef NO_PERL
1720 1721
$(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak

1722 1723 1724
perl/perl.mak: perl/PM.stamp

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

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

1732
$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl GIT-VERSION-FILE
1733
	$(QUIET_GEN)$(RM) $@ $@+ && \
1734
	INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
1735 1736 1737
	sed -e '1{' \
	    -e '	s|#!.*perl|#!$(PERL_PATH_SQ)|' \
	    -e '	h' \
1738
	    -e '	s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'"));=' \
1739 1740 1741
	    -e '	H' \
	    -e '	x' \
	    -e '}' \
1742
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
1743 1744
	    $@.perl >$@+ && \
	chmod +x $@+ && \
1745
	mv $@+ $@
1746

1747 1748 1749 1750 1751

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

1752 1753
git-instaweb: git-instaweb.sh gitweb GIT-SCRIPT-DEFINES
	$(QUIET_GEN)$(cmd_munge_script) && \
1754
	chmod +x $@+ && \
1755
	mv $@+ $@
1756 1757 1758 1759 1760 1761 1762 1763 1764
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
1765

1766
ifndef NO_PYTHON
1767
$(patsubst %.py,%,$(SCRIPT_PYTHON)): GIT-CFLAGS GIT-PREFIX GIT-PYTHON-VARS
1768 1769 1770 1771 1772
$(patsubst %.py,%,$(SCRIPT_PYTHON)): % : %.py
	$(QUIET_GEN)$(RM) $@ $@+ && \
	INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C git_remote_helpers -s \
		--no-print-directory prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' \
		instlibdir` && \
1773 1774
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
	    -e 's|\(os\.getenv("GITPYTHONLIB"\)[^)]*)|\1,"@@INSTLIBDIR@@")|' \
1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788
	    -e 's|@@INSTLIBDIR@@|'"$$INSTLIBDIR"'|g' \
	    $@.py >$@+ && \
	chmod +x $@+ && \
	mv $@+ $@
else # NO_PYTHON
$(patsubst %.py,%,$(SCRIPT_PYTHON)): % : unimplemented.sh
	$(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

1789
configure: configure.ac GIT-VERSION-FILE
1790
	$(QUIET_GEN)$(RM) $@ $<+ && \
1791
	sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
1792 1793
	    $< > $<+ && \
	autoconf -o $@ $<+ && \
1794
	$(RM) $<+
1795

1796
ifdef AUTOCONFIGURED
1797 1798 1799 1800 1801 1802 1803 1804
# 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
	$(QUIET_GEN)$(MAKE) configure && \
	if test -f config.status; then \
1805 1806 1807 1808 1809 1810 1811 1812 1813
	  ./config.status --recheck; \
	else \
	  ./configure; \
	fi
reconfigure config.mak.autogen: config.status
	$(QUIET_GEN)./config.status
.PHONY: reconfigure # This is a convenience target.
endif

1814 1815 1816 1817 1818 1819
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
1820
XDIFF_OBJS += xdiff/xhistogram.o
1821 1822

VCSSVN_OBJS += vcs-svn/line_buffer.o
1823
VCSSVN_OBJS += vcs-svn/sliding_window.o
1824 1825
VCSSVN_OBJS += vcs-svn/repo_tree.o
VCSSVN_OBJS += vcs-svn/fast_export.o
1826
VCSSVN_OBJS += vcs-svn/svndiff.o
1827 1828
VCSSVN_OBJS += vcs-svn/svndump.o

1829 1830 1831 1832 1833 1834 1835 1836
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
1837

1838
dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d)
1839
dep_dirs := $(addsuffix .depend,$(sort $(dir $(OBJECTS))))
1840

1841
ifeq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1842
$(dep_dirs):
1843
	@mkdir -p $@
1844 1845

missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
1846
dep_file = $(dir $@).depend/$(notdir $@).d
1847
dep_args = -MF $(dep_file) -MQ $@ -MMD -MP
1848 1849 1850 1851 1852 1853
ifdef CHECK_HEADER_DEPENDENCIES
$(error cannot compute header dependencies outside a normal build. \
Please unset CHECK_HEADER_DEPENDENCIES and try again)
endif
endif

1854
ifneq ($(COMPUTE_HEADER_DEPENDENCIES),yes)
1855
ifndef CHECK_HEADER_DEPENDENCIES
1856 1857
dep_dirs =
missing_dep_dirs =
1858 1859
dep_args =
endif
1860 1861
endif

1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875
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))

1876 1877
.SUFFIXES:

1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911
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
1912
$(C_OBJ): %.o: %.c GIT-CFLAGS $(missing_dep_dirs)
1913
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1914
$(ASM_OBJ): %.o: %.S GIT-CFLAGS $(missing_dep_dirs)
1915
	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1916
endif
1917

1918
%.s: %.c GIT-CFLAGS FORCE
1919
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $(EXTRA_CPPFLAGS) $<
1920 1921

ifdef USE_COMPUTED_HEADER_DEPENDENCIES
1922 1923
# Take advantage of gcc's on-the-fly dependency generation
# See <http://gcc.gnu.org/gcc-3.0/features.html>.
1924 1925 1926
dep_files_present := $(wildcard $(dep_files))
ifneq ($(dep_files_present),)
include $(dep_files_present)
1927 1928 1929 1930 1931 1932 1933 1934
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 已提交
1935

1936
$(OBJECTS): $(LIB_H)
1937
endif
1938

1939
exec_cmd.sp exec_cmd.s exec_cmd.o: GIT-PREFIX
1940
exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \
1941 1942 1943
	'-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
	'-DBINDIR="$(bindir_relative_SQ)"' \
	'-DPREFIX="$(prefix_SQ)"'
1944

1945
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX
1946
builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
1947
	-DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"'
1948

1949
config.sp config.s config.o: GIT-PREFIX
1950 1951
config.sp config.s config.o: EXTRA_CPPFLAGS = \
	-DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
1952

1953
attr.sp attr.s attr.o: GIT-PREFIX
1954 1955
attr.sp attr.s attr.o: EXTRA_CPPFLAGS = \
	-DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
1956

1957
gettext.sp gettext.s gettext.o: GIT-PREFIX
1958 1959 1960
gettext.sp gettext.s gettext.o: EXTRA_CPPFLAGS = \
	-DGIT_LOCALE_PATH='"$(localedir_SQ)"'

1961
ifdef NO_EXPAT
1962
http-walker.sp http-walker.s http-walker.o: EXTRA_CPPFLAGS = -DNO_EXPAT
1963 1964
endif

1965
ifdef NO_REGEX
1966 1967
compat/regex/regex.sp compat/regex/regex.o: EXTRA_CPPFLAGS = \
	-DGAWK -DNO_MBSUPPORT
1968 1969
endif

1970
ifdef USE_NED_ALLOCATOR
1971
compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
1972 1973 1974
	-DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR
endif

1975
git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
1976
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
1977

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

1982
git-http-fetch$X: revision.o http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
L
Linus Torvalds 已提交
1983
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
1984
		$(LIBS) $(CURL_LIBCURL)
1985
git-http-push$X: revision.o http.o http-push.o GIT-LDFLAGS $(GITLIBS)
1986
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
1987 1988
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)

1989 1990 1991 1992
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)

1993 1994 1995 1996 1997 1998
$(REMOTE_CURL_ALIASES): $(REMOTE_CURL_PRIMARY)
	$(QUIET_LNCP)$(RM) $@ && \
	ln $< $@ 2>/dev/null || \
	ln -s $< $@ 2>/dev/null || \
	cp $< $@

1999
$(REMOTE_CURL_PRIMARY): remote-curl.o http.o http-walker.o GIT-LDFLAGS $(GITLIBS)
2000 2001 2002
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)

P
Petr Baudis 已提交
2003
$(LIB_FILE): $(LIB_OBJS)
2004
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
P
Petr Baudis 已提交
2005

2006
$(XDIFF_LIB): $(XDIFF_OBJS)
2007
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(XDIFF_OBJS)
2008

J
Jonathan Nieder 已提交
2009 2010
$(VCSSVN_LIB): $(VCSSVN_OBJS)
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(VCSSVN_OBJS)
2011

2012 2013
export DEFAULT_EDITOR DEFAULT_PAGER

P
Petr Baudis 已提交
2014 2015 2016
doc:
	$(MAKE) -C Documentation all

2017 2018 2019 2020 2021 2022
man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

2023 2024 2025
info:
	$(MAKE) -C Documentation info

2026 2027 2028
pdf:
	$(MAKE) -C Documentation pdf

2029 2030 2031 2032 2033
XGETTEXT_FLAGS = \
	--force-po \
	--add-comments \
	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
	--from-code=UTF-8
2034 2035
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
2036 2037
XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	--keyword=gettextln --keyword=eval_gettextln
2038
XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
2039
LOCALIZED_C := $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
2040
LOCALIZED_SH := $(SCRIPT_SH)
2041 2042 2043 2044 2045 2046 2047
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
2048 2049

po/git.pot: $(LOCALIZED_C)
2050 2051 2052
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
		$(LOCALIZED_SH)
2053 2054
	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
		$(LOCALIZED_PERL)
2055 2056 2057 2058
	mv $@+ $@

pot: po/git.pot

2059 2060 2061 2062 2063 2064 2065 2066 2067 2068
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 $@ $<

2069 2070 2071 2072
FIND_SOURCE_FILES = ( git ls-files '*.[hcS]' 2>/dev/null || \
			$(FIND) . \( -name .git -type d -prune \) \
				-o \( -name '*.[hcS]' -type f -print \) )

2073 2074
$(ETAGS_TARGET): FORCE
	$(RM) $(ETAGS_TARGET)
2075
	$(FIND_SOURCE_FILES) | xargs etags -a -o $(ETAGS_TARGET)
2076

2077
tags: FORCE
2078
	$(RM) tags
2079
	$(FIND_SOURCE_FILES) | xargs ctags -a
P
Petr Baudis 已提交
2080

K
Kristof Provost 已提交
2081 2082
cscope:
	$(RM) cscope*
2083
	$(FIND_SOURCE_FILES) | xargs cscope -b
K
Kristof Provost 已提交
2084

2085
### Detect prefix changes
2086 2087 2088 2089 2090 2091
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 \
2092
		echo >&2 "    * new prefix flags"; \
2093 2094 2095 2096
		echo "$$FLAGS" >GIT-PREFIX; \
	fi

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

2098
GIT-CFLAGS: FORCE
2099 2100
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
2101
		echo >&2 "    * new build flags"; \
2102 2103 2104
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

2105 2106 2107 2108 2109
TRACK_LDFLAGS = $(subst ','\'',$(ALL_LDFLAGS))

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

J
Junio C Hamano 已提交
2114 2115 2116
# 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".
2117
GIT-BUILD-OPTIONS: FORCE
J
Junio C Hamano 已提交
2118
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@
2119
	@echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@
2120
	@echo DIFF=\''$(subst ','\'',$(subst ','\'',$(DIFF)))'\' >>$@
2121
	@echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@
J
Junio C Hamano 已提交
2122
	@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@
J
Jeff King 已提交
2123
	@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@
2124
	@echo USE_LIBPCRE=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE)))'\' >>$@
2125
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@
J
Jeff King 已提交
2126
	@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@
2127 2128 2129 2130
	@echo NO_UNIX_SOCKETS=\''$(subst ','\'',$(subst ','\'',$(NO_UNIX_SOCKETS)))'\' >>$@
ifdef GIT_TEST_OPTS
	@echo GIT_TEST_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_OPTS)))'\' >>$@
endif
2131 2132 2133 2134 2135 2136
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
2137
	@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@
2138
	@echo GETTEXT_POISON=\''$(subst ','\'',$(subst ','\'',$(GETTEXT_POISON)))'\' >>$@
2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150
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
2151

2152 2153 2154
### Detect Python interpreter path changes
ifndef NO_PYTHON
TRACK_PYTHON = $(subst ','\'',-DPYTHON_PATH='$(PYTHON_PATH_SQ)')
2155

2156 2157
GIT-PYTHON-VARS: FORCE
	@VARS='$(TRACK_PYTHON)'; \
2158
	    if test x"$$VARS" != x"`cat $@ 2>/dev/null`" ; then \
2159
		echo >&2 "    * new Python interpreter location"; \
2160 2161 2162 2163
		echo "$$VARS" >$@; \
            fi
endif

2164 2165 2166 2167 2168 2169 2170 2171 2172 2173
test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))

all:: $(TEST_PROGRAMS) $(test_bindir_programs)

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

2175 2176 2177 2178
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

2179
export NO_SVN_TESTS
2180
export TEST_NO_MALLOC_CHECK
2181

2182 2183
### Testing rules

2184
test: all
P
Petr Baudis 已提交
2185 2186
	$(MAKE) -C t/ all

2187 2188 2189 2190 2191
perf: all
	$(MAKE) -C t/perf/ all

.PHONY: test perf

R
René Scharfe 已提交
2192 2193
test-ctype$X: ctype.o

2194
test-date$X: date.o ctype.o
P
Petr Baudis 已提交
2195

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

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

2200
test-parse-options$X: parse-options.o parse-options-cb.o
2201

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

2204
.PRECIOUS: $(TEST_OBJS)
2205

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

2209 2210 2211
check-sha1:: test-sha1$X
	./test-sha1.sh

2212 2213 2214 2215 2216 2217 2218 2219 2220
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)

2221
check: common-cmds.h
2222
	@if sparse; \
2223
	then \
2224 2225
		echo 2>&1 "Use 'make sparse' instead"; \
		$(MAKE) --no-print-directory sparse; \
2226 2227 2228 2229
	else \
		echo 2>&1 "Did you mean 'make test'?"; \
		exit 1; \
	fi
P
Petr Baudis 已提交
2230

2231
remove-dashes:
2232
	./fixup-builtins $(BUILT_INS) $(PROGRAMS) $(SCRIPTS)
P
Petr Baudis 已提交
2233 2234 2235

### Installation rules

2236
ifneq ($(filter /%,$(firstword $(template_dir))),)
2237
template_instdir = $(template_dir)
2238 2239
else
template_instdir = $(prefix)/$(template_dir)
2240 2241 2242
endif
export template_instdir

2243
ifneq ($(filter /%,$(firstword $(gitexecdir))),)
2244
gitexec_instdir = $(gitexecdir)
2245 2246
else
gitexec_instdir = $(prefix)/$(gitexecdir)
2247 2248 2249 2250
endif
gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
export gitexec_instdir

2251 2252 2253 2254 2255 2256 2257
ifneq ($(filter /%,$(firstword $(mergetoolsdir))),)
mergetools_instdir = $(mergetoolsdir)
else
mergetools_instdir = $(prefix)/$(mergetoolsdir)
endif
mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir))

2258 2259
install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)

2260
install: all
2261
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
2262 2263
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2264
	$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
2265
	$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
2266
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
2267
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2268
	$(INSTALL) -m 644 mergetools/* '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
2269 2270 2271 2272 2273
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
2274
ifndef NO_PERL
2275
	$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
J
Junio C Hamano 已提交
2276
	$(MAKE) -C gitweb install
2277
endif
2278 2279 2280
ifndef NO_PYTHON
	$(MAKE) -C git_remote_helpers prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
endif
E
Eygene Ryabinkin 已提交
2281
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2282
	$(MAKE) -C gitk-git install
2283
	$(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
E
Eygene Ryabinkin 已提交
2284
endif
2285
ifneq (,$X)
2286
	$(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';)
2287
endif
2288

2289
	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
2290
	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
2291
	{ test "$$bindir/" = "$$execdir/" || \
2292 2293
	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2294
		test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
2295 2296 2297 2298
		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
	  done; \
	} && \
2299 2300
	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
		$(RM) "$$bindir/$$p" && \
J
Junio C Hamano 已提交
2301
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2302 2303 2304 2305
		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 && \
2306
	for p in $(BUILT_INS); do \
2307
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2308
		test -z "$(NO_INSTALL_HARDLINKS)" && \
J
Jeff King 已提交
2309 2310 2311
		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; \
2312
	done && \
2313 2314
	remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
	for p in $$remote_curl_aliases; do \
2315
		$(RM) "$$execdir/$$p" && \
J
Junio C Hamano 已提交
2316
		test -z "$(NO_INSTALL_HARDLINKS)" && \
2317 2318 2319
		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; \
2320
	done && \
2321
	./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
P
Petr Baudis 已提交
2322

2323 2324 2325
install-gitweb:
	$(MAKE) -C gitweb install

P
Petr Baudis 已提交
2326 2327 2328
install-doc:
	$(MAKE) -C Documentation install

2329 2330 2331
install-man:
	$(MAKE) -C Documentation install-man

2332 2333 2334
install-html:
	$(MAKE) -C Documentation install-html

2335 2336 2337
install-info:
	$(MAKE) -C Documentation install-info

2338 2339 2340
install-pdf:
	$(MAKE) -C Documentation install-pdf

2341 2342
quick-install-doc:
	$(MAKE) -C Documentation quick-install
P
Petr Baudis 已提交
2343

2344 2345 2346
quick-install-man:
	$(MAKE) -C Documentation quick-install-man

2347 2348 2349
quick-install-html:
	$(MAKE) -C Documentation quick-install-html

P
Petr Baudis 已提交
2350 2351 2352 2353


### Maintainer's dist rules

2354
git.spec: git.spec.in GIT-VERSION-FILE
2355 2356
	sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
	mv $@+ $@
2357

2358
GIT_TARNAME = git-$(GIT_VERSION)
2359
dist: git.spec git-archive$(X) configure
2360 2361
	./git-archive --format=tar \
		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
2362
	@mkdir -p $(GIT_TARNAME)
2363
	@cp git.spec configure $(GIT_TARNAME)
2364
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
2365
	@$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
2366
	$(TAR) rf $(GIT_TARNAME).tar \
2367
		$(GIT_TARNAME)/git.spec \
2368
		$(GIT_TARNAME)/configure \
2369
		$(GIT_TARNAME)/version \
2370
		$(GIT_TARNAME)/git-gui/version
2371
	@$(RM) -r $(GIT_TARNAME)
2372
	gzip -f -9 $(GIT_TARNAME).tar
2373 2374

rpm: dist
2375 2376 2377 2378
	$(RPMBUILD) \
		--define "_source_filedigest_algorithm md5" \
		--define "_binary_filedigest_algorithm md5" \
		-ta $(GIT_TARNAME).tar.gz
2379

2380 2381 2382
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
dist-doc:
2383
	$(RM) -r .doc-tmp-dir
2384 2385 2386 2387 2388
	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
	:
2389
	$(RM) -r .doc-tmp-dir
2390
	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
2391
	$(MAKE) -C Documentation DESTDIR=./ \
2392
		man1dir=../.doc-tmp-dir/man1 \
2393
		man5dir=../.doc-tmp-dir/man5 \
2394
		man7dir=../.doc-tmp-dir/man7 \
2395 2396 2397
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
2398
	$(RM) -r .doc-tmp-dir
2399

P
Petr Baudis 已提交
2400
### Cleaning rules
2401

2402 2403
distclean: clean
	$(RM) configure
2404 2405 2406
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2407

2408 2409 2410 2411 2412
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

clean: profile-clean
2413 2414
	$(RM) *.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \
		builtin/*.o $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
2415
	$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
2416
	$(RM) $(TEST_PROGRAMS)
2417
	$(RM) -r bin-wrappers
2418
	$(RM) -r $(dep_dirs)
2419
	$(RM) -r po/build/
2420
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
2421 2422 2423
	$(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
2424
	$(MAKE) -C Documentation/ clean
2425
ifndef NO_PERL
2426
	$(MAKE) -C gitweb clean
2427
	$(MAKE) -C perl clean
2428 2429 2430
endif
ifndef NO_PYTHON
	$(MAKE) -C git_remote_helpers clean
2431
endif
P
Petr Baudis 已提交
2432
	$(MAKE) -C templates/ clean
2433
	$(MAKE) -C t/ clean
E
Eygene Ryabinkin 已提交
2434
ifndef NO_TCLTK
J
Junio C Hamano 已提交
2435
	$(MAKE) -C gitk-git clean
E
Eygene Ryabinkin 已提交
2436 2437
	$(MAKE) -C git-gui clean
endif
2438
	$(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-BUILD-OPTIONS
2439
	$(RM) GIT-USER-AGENT GIT-PREFIX GIT-SCRIPT-DEFINES GIT-PYTHON-VARS
2440

2441
.PHONY: all install profile-clean clean strip
2442
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2443
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2444

J
Junio C Hamano 已提交
2445 2446
### Check documentation
#
J
Jeff King 已提交
2447 2448 2449 2450
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2451
ALL_COMMANDS += git-gui git-citool
J
Junio C Hamano 已提交
2452
check-docs::
J
Jeff King 已提交
2453
	@(for v in $(ALL_COMMANDS); \
J
Junio C Hamano 已提交
2454 2455 2456
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
M
Miklos Vajna 已提交
2457
		git-merge-resolve | git-merge-subtree | \
2458
		git-fsck-objects | git-init-db | \
2459
		git-remote-* | git-stage | \
2460
		git-?*--?* ) continue ;; \
J
Junio C Hamano 已提交
2461 2462 2463
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
J
Junio C Hamano 已提交
2464
		sed -e '/^#/d' command-list.txt | \
2465
		grep -q "^$$v[ 	]" || \
J
Junio C Hamano 已提交
2466 2467 2468 2469
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
2470 2471
	done; \
	( \
J
Junio C Hamano 已提交
2472
		sed -e '/^#/d' \
2473
		    -e 's/[ 	].*//' \
J
Junio C Hamano 已提交
2474
		    -e 's/^/listed /' command-list.txt; \
2475 2476
		$(MAKE) -C Documentation print-man1 | \
		grep '\.txt$$' | \
2477 2478 2479 2480
		sed -e 's|Documentation/|documented |' \
		    -e 's/\.txt//'; \
	) | while read how cmd; \
	do \
J
Jeff King 已提交
2481
		case " $(ALL_COMMANDS) " in \
2482 2483 2484 2485
		*" $$cmd "*)	;; \
		*) echo "removed but $$how: $$cmd" ;; \
		esac; \
	done ) | sort
2486 2487 2488 2489 2490

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

2492 2493 2494 2495 2496 2497 2498 2499
### Test suite coverage testing
#
.PHONY: coverage coverage-clean coverage-build coverage-report

coverage:
	$(MAKE) coverage-build
	$(MAKE) coverage-report

2500
object_dirs := $(sort $(dir $(OBJECTS)))
2501
coverage-clean:
2502 2503 2504 2505
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) $(addsuffix *.gcno,$(object_dirs))
	$(RM) coverage-untested-functions
2506
	$(RM) -r cover_db/
2507
	$(RM) -r cover_db_html/
2508 2509 2510

COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2511
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2512 2513 2514 2515 2516 2517 2518

coverage-build: coverage-clean
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
		-j1 test

coverage-report:
2519
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2520
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2521
	done
2522 2523

coverage-untested-functions: coverage-report
2524 2525
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2526
		> coverage-untested-functions
2527 2528 2529

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2530 2531 2532

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