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

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

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

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

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

383 384 385 386 387 388 389 390 391 392 393 394
ifdef DEVELOPER
CFLAGS += -Werror \
	-Wdeclaration-after-statement \
	-Wno-format-zero-length \
	-Wold-style-definition \
	-Woverflow \
	-Wpointer-arith \
	-Wstrict-prototypes \
	-Wunused \
	-Wvla
endif

395 396 397
# Create as necessary, replace existing, make ranlib unneeded.
ARFLAGS = rcs

398 399 400
# Among the variables below, these:
#   gitexecdir
#   template_dir
401
#   sysconfdir
402 403
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "git" at
404
# runtime figures out where they are based on the path to the executable.
405 406 407 408 409
# Additionally, the following will be treated as relative by "git" if they
# begin with "$(prefix)/":
#   mandir
#   infodir
#   htmldir
410 411
# This can help installing the suite in a relocatable way.

412
prefix = $(HOME)
413 414
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
415 416
mandir = $(prefix)/share/man
infodir = $(prefix)/share/info
417
gitexecdir = libexec/git-core
418
mergetoolsdir = $(gitexecdir)/mergetools
419
sharedir = $(prefix)/share
420
gitwebdir = $(sharedir)/gitweb
421
localedir = $(sharedir)/locale
422
template_dir = share/git-core/templates
423
htmldir = $(prefix)/share/doc/git-doc
424
ETC_GITCONFIG = $(sysconfdir)/gitconfig
425
ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
426
lib = lib
427
# DESTDIR =
428
pathsep = :
429

430 431 432 433
mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

434
export prefix bindir sharedir sysconfdir gitwebdir localedir
435

436
CC = cc
437
AR = ar
438
RM = rm -f
439
DIFF = diff
440
TAR = tar
441
FIND = find
442
INSTALL = install
443
TCL_PATH = tclsh
444
TCLTK_PATH = wish
445
XGETTEXT = xgettext
446
MSGFMT = msgfmt
447
CURL_CONFIG = curl-config
448
PTHREAD_LIBS = -lpthread
449
PTHREAD_CFLAGS =
450
GCOV = gcov
451

452 453
export TCL_PATH TCLTK_PATH

454
SPARSE_FLAGS =
455

P
Petr Baudis 已提交
456 457 458 459


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

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

466 467 468 469 470
# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
COMPAT_CFLAGS =
COMPAT_OBJS =
471 472
XDIFF_OBJS =
VCSSVN_OBJS =
J
Jeff King 已提交
473
GENERATED_H =
474
EXTRA_CPPFLAGS =
475
LIB_OBJS =
476
PROGRAM_OBJS =
477 478
PROGRAMS =
SCRIPT_PERL =
479
SCRIPT_PYTHON =
480
SCRIPT_SH =
481
SCRIPT_LIB =
482
TEST_PROGRAMS_NEED_X =
483

J
Jonathan Nieder 已提交
484 485 486 487 488 489
# 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

490
SCRIPT_SH += git-bisect.sh
491
SCRIPT_SH += git-difftool--helper.sh
492 493 494 495 496 497 498
SCRIPT_SH += git-filter-branch.sh
SCRIPT_SH += git-merge-octopus.sh
SCRIPT_SH += git-merge-one-file.sh
SCRIPT_SH += git-merge-resolve.sh
SCRIPT_SH += git-mergetool.sh
SCRIPT_SH += git-quiltimport.sh
SCRIPT_SH += git-rebase.sh
499
SCRIPT_SH += git-remote-testgit.sh
500 501 502 503 504
SCRIPT_SH += git-request-pull.sh
SCRIPT_SH += git-stash.sh
SCRIPT_SH += git-submodule.sh
SCRIPT_SH += git-web--browse.sh

505 506
SCRIPT_LIB += git-mergetool--lib
SCRIPT_LIB += git-parse-remote
507 508 509
SCRIPT_LIB += git-rebase--am
SCRIPT_LIB += git-rebase--interactive
SCRIPT_LIB += git-rebase--merge
510
SCRIPT_LIB += git-sh-setup
511
SCRIPT_LIB += git-sh-i18n
512

513
SCRIPT_PERL += git-add--interactive.perl
514
SCRIPT_PERL += git-difftool.perl
515 516 517 518 519 520 521
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
522

P
Pete Wyckoff 已提交
523
SCRIPT_PYTHON += git-p4.py
524

525
NO_INSTALL += git-remote-testgit
526

527 528 529 530 531
# 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))

532 533 534 535
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))

536 537 538 539 540 541 542 543 544
# 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
545
install-sh-script: $(SCRIPT_SH_INS)
F
Felipe Contreras 已提交
546
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
547
install-perl-script: $(SCRIPT_PERL_INS)
F
Felipe Contreras 已提交
548
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
549
install-python-script: $(SCRIPT_PYTHON_INS)
F
Felipe Contreras 已提交
550
	$(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
551 552 553 554 555 556 557 558 559

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

560 561 562
SCRIPTS = $(SCRIPT_SH_INS) \
	  $(SCRIPT_PERL_INS) \
	  $(SCRIPT_PYTHON_INS) \
563
	  git-instaweb
564

565 566
ETAGS_TARGET = TAGS

567 568
# Empty...
EXTRA_PROGRAMS =
569

570 571
# ... and all the rest that could be moved out of bindir to gitexecdir
PROGRAMS += $(EXTRA_PROGRAMS)
572

573
PROGRAM_OBJS += credential-store.o
574
PROGRAM_OBJS += daemon.o
575
PROGRAM_OBJS += fast-import.o
576
PROGRAM_OBJS += http-backend.o
577
PROGRAM_OBJS += imap-send.o
578
PROGRAM_OBJS += sh-i18n--envsubst.o
579 580 581
PROGRAM_OBJS += shell.o
PROGRAM_OBJS += show-index.o
PROGRAM_OBJS += upload-pack.o
582
PROGRAM_OBJS += remote-testsvn.o
583

584 585 586
# Binary suffix, set to .exe for Windows builds
X =

587
PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
588

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

623
TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
624

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

BUILT_INS += git-cherry$X
630
BUILT_INS += git-cherry-pick$X
631 632 633 634 635
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 已提交
636
BUILT_INS += git-stage$X
637 638
BUILT_INS += git-status$X
BUILT_INS += git-whatchanged$X
J
Junio C Hamano 已提交
639

640 641
# what 'all' will build and 'install' will install in gitexecdir,
# excluding programs for built-in commands
J
Junio C Hamano 已提交
642
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
643

E
Eygene Ryabinkin 已提交
644
# what 'all' will build but not install in gitexecdir
645
OTHER_PROGRAMS = git$X
E
Eygene Ryabinkin 已提交
646

647 648 649 650 651 652 653 654 655
# 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

656 657 658 659 660 661 662
# 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
663 664 665
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif
666

L
Luben Tuikov 已提交
667
export PERL_PATH
668
export PYTHON_PATH
L
Luben Tuikov 已提交
669

670 671 672
LIB_FILE = libgit.a
XDIFF_LIB = xdiff/lib.a
VCSSVN_LIB = vcs-svn/lib.a
J
Junio C Hamano 已提交
673

J
Jeff King 已提交
674
GENERATED_H += common-cmds.h
675

676 677 678 679 680
LIB_H = $(shell $(FIND) . \
	-name .git -prune -o \
	-name t -prune -o \
	-name Documentation -prune -o \
	-name '*.h' -print)
681

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

841
BUILTIN_OBJS += builtin/add.o
842
BUILTIN_OBJS += builtin/am.o
843 844 845 846 847 848 849 850 851
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 已提交
852
BUILTIN_OBJS += builtin/check-ignore.o
853
BUILTIN_OBJS += builtin/check-mailmap.o
854 855 856 857 858
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
859
BUILTIN_OBJS += builtin/column.o
860 861 862 863
BUILTIN_OBJS += builtin/commit-tree.o
BUILTIN_OBJS += builtin/commit.o
BUILTIN_OBJS += builtin/config.o
BUILTIN_OBJS += builtin/count-objects.o
864
BUILTIN_OBJS += builtin/credential.o
865 866 867 868 869 870 871 872 873 874 875 876
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
877
BUILTIN_OBJS += builtin/get-tar-commit-id.o
878 879 880 881 882
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
883
BUILTIN_OBJS += builtin/interpret-trailers.o
884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900
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 已提交
901
BUILTIN_OBJS += builtin/notes.o
902 903 904 905 906 907
BUILTIN_OBJS += builtin/pack-objects.o
BUILTIN_OBJS += builtin/pack-redundant.o
BUILTIN_OBJS += builtin/pack-refs.o
BUILTIN_OBJS += builtin/patch-id.o
BUILTIN_OBJS += builtin/prune-packed.o
BUILTIN_OBJS += builtin/prune.o
P
Paul Tan 已提交
908
BUILTIN_OBJS += builtin/pull.o
909 910 911 912 913
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 已提交
914
BUILTIN_OBJS += builtin/remote-ext.o
I
Ilari Liusvaara 已提交
915
BUILTIN_OBJS += builtin/remote-fd.o
916
BUILTIN_OBJS += builtin/repack.o
917 918 919 920 921 922 923 924 925 926 927 928
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
929
BUILTIN_OBJS += builtin/submodule--helper.o
930 931 932 933 934 935 936 937 938
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
939
BUILTIN_OBJS += builtin/verify-commit.o
940 941
BUILTIN_OBJS += builtin/verify-pack.o
BUILTIN_OBJS += builtin/verify-tag.o
942
BUILTIN_OBJS += builtin/worktree.o
943
BUILTIN_OBJS += builtin/write-tree.o
944

945
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
946
EXTLIBS =
947

J
Jeff King 已提交
948 949
GIT_USER_AGENT = git/$(GIT_VERSION)

950
include config.mak.uname
951
-include config.mak.autogen
952
-include config.mak
953

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

962
ifndef COMPUTE_HEADER_DEPENDENCIES
963 964 965 966
COMPUTE_HEADER_DEPENDENCIES = auto
endif

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

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

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

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

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

1003 1004 1005 1006 1007 1008 1009 1010
ifeq (yes,$(USE_PARENS_AROUND_GETTEXT_N))
	BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=1
else
ifeq (no,$(USE_PARENS_AROUND_GETTEXT_N))
	BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=0
endif
endif

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 1025 1026 1027
	ifndef NO_APPLE_COMMON_CRYPTO
		APPLE_COMMON_CRYPTO = YesPlease
		COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
	endif
1028
	NO_REGEX = YesPlease
1029
	PTHREAD_LIBS =
1030 1031
endif

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

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

M
Michał Kiedrowicz 已提交
1047 1048 1049 1050 1051 1052 1053 1054 1055
ifdef USE_LIBPCRE
	BASIC_CFLAGS += -DUSE_LIBPCRE
	ifdef LIBPCREDIR
		BASIC_CFLAGS += -I$(LIBPCREDIR)/include
		EXTLIBS += -L$(LIBPCREDIR)/$(lib) $(CC_LD_DYNPATH)$(LIBPCREDIR)/$(lib)
	endif
	EXTLIBS += -lpcre
endif

K
Kirill Smelkov 已提交
1056 1057 1058 1059
ifdef HAVE_ALLOCA_H
	BASIC_CFLAGS += -DHAVE_ALLOCA_H
endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1448 1449 1450 1451
ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
	export GIT_TEST_CMP_USE_COPIED_CONTEXT
endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1618
export DIFF TAR INSTALL DESTDIR SHELL_PATH
1619 1620


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

1623 1624
SHELL = $(SHELL_PATH)

1625 1626 1627
all:: shell_compatibility_test

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

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

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

1646 1647

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

1818 1819 1820 1821 1822

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

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

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

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

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

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

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

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

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

1900
TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS))
1901 1902 1903 1904 1905 1906 1907
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
1908

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

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

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

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

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

1931 1932
.SUFFIXES:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2036 2037
export DEFAULT_EDITOR DEFAULT_PAGER

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

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

html:
	$(MAKE) -C Documentation html

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)|' \
2209
	     -e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%,$(@F))|' < $< > $@ && \
2210
	chmod +x $@
2211

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

2216
export NO_SVN_TESTS
2217
export TEST_NO_MALLOC_CHECK
2218

2219 2220
### Testing rules

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

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

.PHONY: test perf

2229
t/helper/test-ctype$X: ctype.o
R
René Scharfe 已提交
2230

2231
t/helper/test-date$X: date.o ctype.o
P
Petr Baudis 已提交
2232

2233
t/helper/test-delta$X: diff-delta.o patch-delta.o
P
Petr Baudis 已提交
2234

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

2237
t/helper/test-parse-options$X: parse-options.o parse-options-cb.o
2238

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

2241
.PRECIOUS: $(TEST_OBJS)
2242

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

2246 2247
check-sha1:: t/helper/test-sha1$X
	t/helper/test-sha1.sh
2248

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

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

### Installation rules

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

P
Petr Baudis 已提交
2390 2391 2392 2393


### Maintainer's dist rules

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

2409 2410 2411 2412
rpm::
	@echo >&2 "Use distro packaged sources to run rpmbuild"
	@false
.PHONY: rpm
2413

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

P
Petr Baudis 已提交
2435
### Cleaning rules
2436

2437 2438
distclean: clean
	$(RM) configure
2439 2440 2441
	$(RM) config.log config.status config.cache
	$(RM) config.mak.autogen config.mak.append
	$(RM) -r autom4te.cache
2442

2443 2444 2445 2446
profile-clean:
	$(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
	$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))

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

2474
.PHONY: all install profile-clean clean strip
2475
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2476
.PHONY: FORCE cscope
J
Junio C Hamano 已提交
2477

J
Junio C Hamano 已提交
2478 2479
### Check documentation
#
J
Jeff King 已提交
2480 2481 2482 2483
ALL_COMMANDS = $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS)
ALL_COMMANDS += git
ALL_COMMANDS += gitk
ALL_COMMANDS += gitweb
2484
ALL_COMMANDS += git-gui git-citool
E
Elia Pinto 已提交
2485 2486

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

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

2529 2530
### Test suite coverage testing
#
2531
.PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report
E
Elia Pinto 已提交
2532
.PHONY: coverage-untested-functions cover_db cover_db_html
2533
.PHONY: coverage-clean-results
2534 2535

coverage:
2536
	$(MAKE) coverage-test
2537
	$(MAKE) coverage-untested-functions
2538

2539
object_dirs := $(sort $(dir $(OBJECTS)))
2540
coverage-clean-results:
2541 2542 2543
	$(RM) $(addsuffix *.gcov,$(object_dirs))
	$(RM) $(addsuffix *.gcda,$(object_dirs))
	$(RM) coverage-untested-functions
2544
	$(RM) -r cover_db/
2545
	$(RM) -r cover_db_html/
2546

2547 2548 2549
coverage-clean: coverage-clean-results
	$(RM) $(addsuffix *.gcno,$(object_dirs))

2550 2551
COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
2552
GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks
2553

2554
coverage-compile:
2555
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
2556 2557

coverage-test: coverage-clean-results coverage-compile
2558
	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
2559
		DEFAULT_TEST_TARGET=test -j1 test
2560 2561

coverage-report:
2562
	$(QUIET_GCOV)for dir in $(object_dirs); do \
2563
		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \
2564
	done
2565 2566

coverage-untested-functions: coverage-report
2567 2568
	grep '^function.*called 0 ' *.c.gcov \
		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
2569
		> coverage-untested-functions
2570 2571 2572

cover_db: coverage-report
	gcov2perl -db cover_db *.gcov
2573 2574 2575

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