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

4 5 6 7
# Define MOZILLA_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine coming from Mozilla. It is GPL'd and should be fast
# on non-x86 architectures (e.g. PowerPC), while the OpenSSL version (default
# choice) has very fast version optimized for i586.
8
#
9 10
# Define NO_OPENSSL environment variable if you do not have OpenSSL.
# This also implies MOZILLA_SHA1.
11
#
12 13 14
# Define NO_CURL if you do not have curl installed.  git-http-pull and
# git-http-push are not built, and you cannot use http:// and https://
# transports.
15
#
P
Patrick Mauritz 已提交
16 17 18
# Define CURLDIR=/foo/bar if your curl header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
19 20 21
# Define NO_EXPAT if you do not have expat installed.  git-http-push is
# not built, and you cannot push using http:// and https:// transports.
#
22 23
# Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
#
24 25 26
# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
# d_type in struct dirent (latest Cygwin -- will be fixed soonish).
#
27 28 29
# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
# do not support the 'size specifiers' introduced by C99, namely ll, hh,
# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
30
# some C compilers supported these specifiers prior to C99 as an extension.
31
#
32 33
# Define NO_STRCASESTR if you don't have strcasestr.
#
34 35
# Define NO_STRLCPY if you don't have strlcpy.
#
J
Jason Riedy 已提交
36 37
# Define NO_SETENV if you don't have setenv in the C library.
#
38 39
# 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.
40
#
P
Pavel Roskin 已提交
41
# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability
E
Eric Wong 已提交
42 43 44
# 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.
#
45 46 47 48 49 50 51 52 53 54 55 56
# 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.
#
57 58
# Define PPC_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for PowerPC.
59
#
60 61 62
# Define ARM_SHA1 environment variable when running make to make use of
# a bundled SHA1 routine optimized for ARM.
#
63
# Define NEEDS_SSL_WITH_CRYPTO if you need -lcrypto with -lssl (Darwin).
64
#
65
# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin).
66 67 68 69
#
# Define NEEDS_SOCKET if linking with libc is not enough (SunOS,
# Patrick Mauritz).
#
70 71
# Define NO_MMAP if you want to avoid mmap.
#
72 73
# Define WITH_OWN_SUBPROCESS_PY if you want to use with python 2.3.
#
74 75
# Define NO_IPV6 if you lack IPv6 support and getaddrinfo().
#
76 77 78
# Define NO_SOCKADDR_STORAGE if your platform does not have struct
# sockaddr_storage.
#
79 80
# Define NO_ICONV if your libc does not properly support iconv.
#
81 82 83
# Define NO_ACCURATE_DIFF if your diff program at least sometimes misses
# a missing newline at the end of the file.
#
P
Pavel Roskin 已提交
84
# Define NO_PYTHON if you want to lose all benefits of the recursive merge.
85
#
86 87 88 89 90 91 92 93 94 95 96 97 98
# Define COLLISION_CHECK below if you believe that SHA1's
# 1461501637330902918203684832716283019655932542976 hashes do not give you
# sufficient guarantee that no collisions between objects will ever happen.

# Define USE_NSEC below if you want git to care about sub-second file mtimes
# and ctimes. Note that you need recent glibc (at least 2.2.4) for this, and
# it will BREAK YOUR LOCAL DIFFS! show-diff and anything using it will likely
# randomly break unless your underlying filesystem supports those sub-second
# times (my ext3 doesn't).

# Define USE_STDEV below if you want git to care about the underlying device
# change being considered an inode change from the update-cache perspective.

99
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
100
	@$(SHELL_PATH) ./GIT-VERSION-GEN
101
-include GIT-VERSION-FILE
102

103 104 105 106 107 108
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
uname_P := $(shell sh -c 'uname -p 2>/dev/null || echo not')

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

111
CFLAGS = -g -O2 -Wall
J
Junio C Hamano 已提交
112
LDFLAGS =
113
ALL_CFLAGS = $(CFLAGS)
J
Junio C Hamano 已提交
114
ALL_LDFLAGS = $(LDFLAGS)
J
Junio C Hamano 已提交
115
STRIP ?= strip
116

117 118
prefix = $(HOME)
bindir = $(prefix)/bin
119
gitexecdir = $(bindir)
120
template_dir = $(prefix)/share/git-core/templates/
121
GIT_PYTHON_DIR = $(prefix)/share/git-core/python
122
# DESTDIR=
123

124
# default configuration for gitweb
125
GITWEB_CONFIG = gitweb_config.perl
126
GITWEB_HOME_LINK_STR = projects
127 128
GITWEB_SITENAME =
GITWEB_PROJECTROOT = /pub/git
129
GITWEB_BASE_URL =
130 131 132
GITWEB_LIST =
GITWEB_HOMETEXT = indextext.html
GITWEB_CSS = gitweb.css
M
Martin Waitz 已提交
133
GITWEB_LOGO = git-logo.png
134
GITWEB_FAVICON = git-favicon.png
135

136 137
export prefix bindir gitexecdir template_dir GIT_PYTHON_DIR

138 139
CC = gcc
AR = ar
140
TAR = tar
141 142
INSTALL = install
RPMBUILD = rpmbuild
143

144 145
# sparse is architecture-neutral, which means that we need to tell it
# explicitly what architecture to check for. Fix this up for yours..
146
SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
147

P
Petr Baudis 已提交
148 149 150 151


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

J
Junio C Hamano 已提交
152
SCRIPT_SH = \
153
	git-bisect.sh git-branch.sh git-checkout.sh \
P
Pavel Roskin 已提交
154
	git-cherry.sh git-clean.sh git-clone.sh git-commit.sh \
J
Junio C Hamano 已提交
155
	git-fetch.sh \
J
Junio C Hamano 已提交
156
	git-ls-remote.sh \
J
Junio C Hamano 已提交
157
	git-merge-one-file.sh git-parse-remote.sh \
L
Linus Torvalds 已提交
158
	git-pull.sh git-rebase.sh \
J
Junio C Hamano 已提交
159
	git-repack.sh git-request-pull.sh git-reset.sh \
L
Linus Torvalds 已提交
160
	git-resolve.sh git-revert.sh git-sh-setup.sh \
161
	git-tag.sh git-verify-tag.sh \
162
	git-applymbox.sh git-applypatch.sh git-am.sh \
163
	git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
164
	git-merge-resolve.sh git-merge-ours.sh \
E
Eric W. Biederman 已提交
165
	git-lost-found.sh git-quiltimport.sh
J
Junio C Hamano 已提交
166 167 168

SCRIPT_PERL = \
	git-archimport.perl git-cvsimport.perl git-relink.perl \
169
	git-shortlog.perl git-rerere.perl \
J
Junio C Hamano 已提交
170
	git-annotate.perl git-cvsserver.perl \
J
Johannes Schindelin 已提交
171
	git-svnimport.perl git-cvsexportcommit.perl \
E
Eric Wong 已提交
172
	git-send-email.perl git-svn.perl
173

174
SCRIPT_PYTHON = \
175
	git-merge-recursive.py
176

177 178 179
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
	  $(patsubst %.perl,%,$(SCRIPT_PERL)) \
	  $(patsubst %.py,%,$(SCRIPT_PYTHON)) \
180
	  git-cherry-pick git-status git-instaweb
181

182
# The ones that do not have to link with lcrypto, lz nor xdiff.
183
SIMPLE_PROGRAMS = \
L
Lukas Sandström 已提交
184
	git-daemon$X
185

J
Junio C Hamano 已提交
186
# ... and all the rest that could be moved out of bindir to gitexecdir
J
Junio C Hamano 已提交
187
PROGRAMS = \
188
	git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \
T
Timo Hirvonen 已提交
189
	git-hash-object$X git-index-pack$X git-local-fetch$X \
L
Lukas Sandström 已提交
190
	git-merge-base$X \
191
	git-merge-index$X git-mktag$X git-mktree$X git-patch-id$X \
192
	git-peek-remote$X git-receive-pack$X \
P
Peter Eriksen 已提交
193
	git-send-pack$X git-shell$X \
194
	git-show-index$X git-ssh-fetch$X \
P
Peter Eriksen 已提交
195
	git-ssh-upload$X git-unpack-file$X \
196
	git-update-server-info$X \
L
Lukas Sandström 已提交
197
	git-upload-pack$X git-verify-pack$X \
198
	git-pack-redundant$X git-var$X \
199
	git-describe$X git-merge-tree$X git-blame$X git-imap-send$X \
200
	git-merge-recur$X \
201 202 203 204
	$(EXTRA_PROGRAMS)

# Empty...
EXTRA_PROGRAMS =
205

206
BUILT_INS = \
J
Junio C Hamano 已提交
207 208 209
	git-format-patch$X git-show$X git-whatchanged$X \
	git-get-tar-commit-id$X \
	$(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
J
Junio C Hamano 已提交
210

J
Junio C Hamano 已提交
211
# what 'all' will build and 'install' will install, in gitexecdir
J
Junio C Hamano 已提交
212
ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS)
213

214
# Backward compatibility -- to be removed after 1.0
215
PROGRAMS += git-ssh-pull$X git-ssh-push$X
216

217 218 219 220 221 222 223 224 225 226 227
# 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
ifndef PYTHON_PATH
	PYTHON_PATH = /usr/bin/python
endif

228 229 230
PYMODULES = \
	gitMergeCommon.py

L
Linus Torvalds 已提交
231
LIB_FILE=libgit.a
232
XDIFF_LIB=xdiff/lib.a
J
Junio C Hamano 已提交
233

J
Junio C Hamano 已提交
234
LIB_H = \
F
Franck Bui-Huu 已提交
235
	archive.h blob.h cache.h commit.h csum-file.h delta.h \
236
	diff.h object.h pack.h pkt-line.h quote.h refs.h \
J
Junio C Hamano 已提交
237
	run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \
J
Junio C Hamano 已提交
238
	tree-walk.h log-tree.h dir.h path-list.h unpack-trees.h builtin.h
239

J
Junio C Hamano 已提交
240
DIFF_OBJS = \
J
Junio C Hamano 已提交
241
	diff.o diff-lib.o diffcore-break.o diffcore-order.o \
242
	diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o \
243
	diffcore-delta.o log-tree.o
244

J
Junio C Hamano 已提交
245
LIB_OBJS = \
246
	blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \
247
	date.o diff-delta.o entry.o exec_cmd.o ident.o lockfile.o \
J
Junio C Hamano 已提交
248
	object.o pack-check.o patch-delta.o path.o pkt-line.o \
249
	quote.o read-cache.o refs.o run-command.o dir.o object-refs.o \
J
Junio C Hamano 已提交
250
	server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \
251
	tag.o tree.o usage.o config.o environment.o ctype.o copy.o \
252
	fetch-clone.o revision.o pager.o tree-walk.o xdiff-interface.o \
253
	write_or_die.o trace.o \
J
Junio C Hamano 已提交
254
	alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS)
J
Junio C Hamano 已提交
255

256
BUILTIN_OBJS = \
J
Junio C Hamano 已提交
257 258
	builtin-add.o \
	builtin-apply.o \
F
Franck Bui-Huu 已提交
259
	builtin-archive.o \
J
Junio C Hamano 已提交
260
	builtin-cat-file.o \
261
	builtin-checkout-index.o \
J
Junio C Hamano 已提交
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
	builtin-check-ref-format.o \
	builtin-commit-tree.o \
	builtin-count-objects.o \
	builtin-diff.o \
	builtin-diff-files.o \
	builtin-diff-index.o \
	builtin-diff-stages.o \
	builtin-diff-tree.o \
	builtin-fmt-merge-msg.o \
	builtin-grep.o \
	builtin-init-db.o \
	builtin-log.o \
	builtin-ls-files.o \
	builtin-ls-tree.o \
	builtin-mailinfo.o \
	builtin-mailsplit.o \
	builtin-mv.o \
	builtin-name-rev.o \
	builtin-pack-objects.o \
	builtin-prune.o \
	builtin-prune-packed.o \
	builtin-push.o \
	builtin-read-tree.o \
	builtin-repo-config.o \
	builtin-rev-list.o \
	builtin-rev-parse.o \
	builtin-rm.o \
	builtin-show-branch.o \
	builtin-stripspace.o \
	builtin-symbolic-ref.o \
	builtin-tar-tree.o \
	builtin-unpack-objects.o \
	builtin-update-index.o \
	builtin-update-ref.o \
	builtin-upload-tar.o \
R
Rene Scharfe 已提交
297
	builtin-verify-pack.o \
R
Rene Scharfe 已提交
298 299
	builtin-write-tree.o \
	builtin-zip-tree.o
300

301 302
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
LIBS = $(GITLIBS) -lz
303

304 305 306
#
# Platform specific tweaks
#
307 308 309 310 311

# We choose to avoid "if .. else if .. else .. endif endif"
# because maintaining the nesting to match is a pain.  If
# we had "elif" things would have been much nicer...

312 313 314
ifeq ($(uname_S),Linux)
	NO_STRLCPY = YesPlease
endif
G
Gerrit Pape 已提交
315 316 317
ifeq ($(uname_S),GNU/kFreeBSD)
	NO_STRLCPY = YesPlease
endif
318
ifeq ($(uname_S),Darwin)
319 320
	NEEDS_SSL_WITH_CRYPTO = YesPlease
	NEEDS_LIBICONV = YesPlease
321
	NO_STRLCPY = YesPlease
322 323 324 325 326
	ifndef NO_FINK
		ifeq ($(shell test -d /sw/lib && echo y),y)
			ALL_CFLAGS += -I/sw/include
			ALL_LDFLAGS += -L/sw/lib
		endif
S
Shawn Pearce 已提交
327
	endif
328 329 330 331 332
	ifndef NO_DARWIN_PORTS
		ifeq ($(shell test -d /opt/local/lib && echo y),y)
			ALL_CFLAGS += -I/opt/local/include
			ALL_LDFLAGS += -L/opt/local/lib
		endif
S
Shawn Pearce 已提交
333
	endif
334
endif
335
ifeq ($(uname_S),SunOS)
336
	NEEDS_SOCKET = YesPlease
337
	NEEDS_NSL = YesPlease
338 339
	SHELL_PATH = /bin/bash
	NO_STRCASESTR = YesPlease
J
Jason Riedy 已提交
340
	ifeq ($(uname_R),5.8)
341
		NEEDS_LIBICONV = YesPlease
J
Jason Riedy 已提交
342
		NO_UNSETENV = YesPlease
J
Jason Riedy 已提交
343
		NO_SETENV = YesPlease
344
		NO_C99_FORMAT = YesPlease
J
Jason Riedy 已提交
345
	endif
346 347 348
	ifeq ($(uname_R),5.9)
		NO_UNSETENV = YesPlease
		NO_SETENV = YesPlease
349
		NO_C99_FORMAT = YesPlease
350
	endif
351 352
	INSTALL = ginstall
	TAR = gtar
353
	ALL_CFLAGS += -D__EXTENSIONS__
354
endif
355
ifeq ($(uname_O),Cygwin)
356
	NO_D_TYPE_IN_DIRENT = YesPlease
357
	NO_D_INO_IN_DIRENT = YesPlease
H
hpa 已提交
358
	NO_STRCASESTR = YesPlease
359
	NO_SYMLINK_HEAD = YesPlease
H
hpa 已提交
360
	NEEDS_LIBICONV = YesPlease
J
Junio C Hamano 已提交
361
	NO_C99_FORMAT = YesPlease
362 363 364 365
	# There are conflicting reports about this.
	# On some boxes NO_MMAP is needed, and not so elsewhere.
	# Try uncommenting this if you see things break -- YMMV.
	# NO_MMAP = YesPlease
366
	NO_IPV6 = YesPlease
P
Peter Anvin 已提交
367
	X = .exe
368
endif
A
Alecs King 已提交
369 370 371 372 373
ifeq ($(uname_S),FreeBSD)
	NEEDS_LIBICONV = YesPlease
	ALL_CFLAGS += -I/usr/local/include
	ALL_LDFLAGS += -L/usr/local/lib
endif
374
ifeq ($(uname_S),OpenBSD)
375
	NO_STRCASESTR = YesPlease
H
Han Boetes 已提交
376
	NEEDS_LIBICONV = YesPlease
J
Junio C Hamano 已提交
377 378 379 380
	ALL_CFLAGS += -I/usr/local/include
	ALL_LDFLAGS += -L/usr/local/lib
endif
ifeq ($(uname_S),NetBSD)
381 382 383
	ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2)
		NEEDS_LIBICONV = YesPlease
	endif
J
Junio C Hamano 已提交
384 385
	ALL_CFLAGS += -I/usr/pkg/include
	ALL_LDFLAGS += -L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib
H
Han Boetes 已提交
386
endif
387 388
ifeq ($(uname_S),AIX)
	NO_STRCASESTR=YesPlease
389
	NO_STRLCPY = YesPlease
390 391
	NEEDS_LIBICONV=YesPlease
endif
J
Johannes Schindelin 已提交
392 393 394 395
ifeq ($(uname_S),IRIX64)
	NO_IPV6=YesPlease
	NO_SETENV=YesPlease
	NO_STRCASESTR=YesPlease
396
	NO_STRLCPY = YesPlease
J
Johannes Schindelin 已提交
397 398 399 400 401 402
	NO_SOCKADDR_STORAGE=YesPlease
	SHELL_PATH=/usr/gnu/bin/bash
	ALL_CFLAGS += -DPATH_MAX=1024
	# for now, build 32-bit version
	ALL_LDFLAGS += -L/usr/lib32
endif
403 404 405
ifneq (,$(findstring arm,$(uname_M)))
	ARM_SHA1 = YesPlease
endif
406

407
-include config.mak.autogen
408
-include config.mak
409

410 411 412
ifdef WITH_OWN_SUBPROCESS_PY
	PYMODULES += compat/subprocess.py
else
J
Johannes Schindelin 已提交
413 414 415 416
	ifeq ($(NO_PYTHON),)
		ifneq ($(shell $(PYTHON_PATH) -c 'import subprocess;print"OK"' 2>/dev/null),OK)
			PYMODULES += compat/subprocess.py
		endif
417 418 419
	endif
endif

420 421
ifndef NO_CURL
	ifdef CURLDIR
J
Junio C Hamano 已提交
422
		# This is still problematic -- gcc does not always want -R.
423
		ALL_CFLAGS += -I$(CURLDIR)/include
424 425 426 427
		CURL_LIBCURL = -L$(CURLDIR)/lib -R$(CURLDIR)/lib -lcurl
	else
		CURL_LIBCURL = -lcurl
	endif
428
	PROGRAMS += git-http-fetch$X
429 430 431 432 433
	curl_check := $(shell (echo 070908; curl-config --vernum) | sort -r | sed -ne 2p)
	ifeq "$(curl_check)" "070908"
		ifndef NO_EXPAT
			PROGRAMS += git-http-push$X
		endif
434
	endif
435 436 437
	ifndef NO_EXPAT
		EXPAT_LIBEXPAT = -lexpat
	endif
438 439
endif

P
Petr Baudis 已提交
440
ifndef NO_OPENSSL
J
Junio C Hamano 已提交
441
	OPENSSL_LIBSSL = -lssl
J
Junio C Hamano 已提交
442 443
	ifdef OPENSSLDIR
		# Again this may be problematic -- gcc does not always want -R.
444
		ALL_CFLAGS += -I$(OPENSSLDIR)/include
J
Junio C Hamano 已提交
445 446 447 448
		OPENSSL_LINK = -L$(OPENSSLDIR)/lib -R$(OPENSSLDIR)/lib
	else
		OPENSSL_LINK =
	endif
P
Petr Baudis 已提交
449
else
450
	ALL_CFLAGS += -DNO_OPENSSL
J
Junio C Hamano 已提交
451 452
	MOZILLA_SHA1 = 1
	OPENSSL_LIBSSL =
P
Petr Baudis 已提交
453
endif
454
ifdef NEEDS_SSL_WITH_CRYPTO
J
Junio C Hamano 已提交
455
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -lssl
456
else
J
Junio C Hamano 已提交
457
	LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto
458 459
endif
ifdef NEEDS_LIBICONV
J
Junio C Hamano 已提交
460 461
	ifdef ICONVDIR
		# Again this may be problematic -- gcc does not always want -R.
462
		ALL_CFLAGS += -I$(ICONVDIR)/include
J
Junio C Hamano 已提交
463 464 465 466
		ICONV_LINK = -L$(ICONVDIR)/lib -R$(ICONVDIR)/lib
	else
		ICONV_LINK =
	endif
L
Lukas Sandström 已提交
467
	LIBS += $(ICONV_LINK) -liconv
468
endif
469 470 471 472
ifdef NEEDS_SOCKET
	LIBS += -lsocket
	SIMPLE_LIB += -lsocket
endif
473 474 475 476
ifdef NEEDS_NSL
	LIBS += -lnsl
	SIMPLE_LIB += -lnsl
endif
477 478 479
ifdef NO_D_TYPE_IN_DIRENT
	ALL_CFLAGS += -DNO_D_TYPE_IN_DIRENT
endif
480 481 482
ifdef NO_D_INO_IN_DIRENT
	ALL_CFLAGS += -DNO_D_INO_IN_DIRENT
endif
483 484 485
ifdef NO_C99_FORMAT
	ALL_CFLAGS += -DNO_C99_FORMAT
endif
486 487 488
ifdef NO_SYMLINK_HEAD
	ALL_CFLAGS += -DNO_SYMLINK_HEAD
endif
489
ifdef NO_STRCASESTR
490
	COMPAT_CFLAGS += -DNO_STRCASESTR
J
Jason Riedy 已提交
491 492
	COMPAT_OBJS += compat/strcasestr.o
endif
493 494 495 496
ifdef NO_STRLCPY
	COMPAT_CFLAGS += -DNO_STRLCPY
	COMPAT_OBJS += compat/strlcpy.o
endif
J
Jason Riedy 已提交
497
ifdef NO_SETENV
498
	COMPAT_CFLAGS += -DNO_SETENV
J
Jason Riedy 已提交
499
	COMPAT_OBJS += compat/setenv.o
500
endif
J
Johannes Schindelin 已提交
501
ifdef NO_UNSETENV
J
Jason Riedy 已提交
502 503 504
	COMPAT_CFLAGS += -DNO_UNSETENV
	COMPAT_OBJS += compat/unsetenv.o
endif
505
ifdef NO_MMAP
506
	COMPAT_CFLAGS += -DNO_MMAP
J
Jason Riedy 已提交
507
	COMPAT_OBJS += compat/mmap.o
508
endif
509
ifdef NO_IPV6
510 511 512 513 514 515 516 517
	ALL_CFLAGS += -DNO_IPV6
endif
ifdef NO_SOCKADDR_STORAGE
ifdef NO_IPV6
	ALL_CFLAGS += -Dsockaddr_storage=sockaddr_in
else
	ALL_CFLAGS += -Dsockaddr_storage=sockaddr_in6
endif
518
endif
519 520 521
ifdef NO_INET_NTOP
	LIB_OBJS += compat/inet_ntop.o
endif
522

523 524 525 526
ifdef NO_ICONV
	ALL_CFLAGS += -DNO_ICONV
endif

527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
ifdef PPC_SHA1
	SHA1_HEADER = "ppc/sha1.h"
	LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
else
ifdef ARM_SHA1
	SHA1_HEADER = "arm/sha1.h"
	LIB_OBJS += arm/sha1.o arm/sha1_arm.o
else
ifdef MOZILLA_SHA1
	SHA1_HEADER = "mozilla-sha1/sha1.h"
	LIB_OBJS += mozilla-sha1/sha1.o
else
	SHA1_HEADER = <openssl/sha.h>
	LIBS += $(LIB_4_CRYPTO)
endif
endif
endif
544 545 546
ifdef NO_ACCURATE_DIFF
	ALL_CFLAGS += -DNO_ACCURATE_DIFF
endif
547

P
Pavel Roskin 已提交
548
# Shell quote (do not use $(call) to accommodate ancient setups);
549 550 551 552 553 554 555

SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
556
prefix_SQ = $(subst ','\'',$(prefix))
557 558 559 560 561 562 563

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
GIT_PYTHON_DIR_SQ = $(subst ','\'',$(GIT_PYTHON_DIR))

ALL_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' $(COMPAT_CFLAGS)
J
Jason Riedy 已提交
564
LIB_OBJS += $(COMPAT_OBJS)
T
Tom Prince 已提交
565
export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir
P
Petr Baudis 已提交
566 567
### Build rules

568
all: $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk gitweb/gitweb.cgi
569

570 571
all:
	$(MAKE) -C templates
572

J
Junio C Hamano 已提交
573 574 575
strip: $(PROGRAMS) git$X
	$(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X

576
git$X: git.c common-cmds.h $(BUILTIN_OBJS) $(GITLIBS) GIT-CFLAGS
577
	$(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
578
		$(ALL_CFLAGS) -o $@ $(filter %.c,$^) \
579
		$(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS)
580

J
Junio C Hamano 已提交
581
help.o: common-cmds.h
582

J
Junio C Hamano 已提交
583 584 585
$(BUILT_INS): git$X
	rm -f $@ && ln git$X $@

F
Fredrik Kuivinen 已提交
586
common-cmds.h: Documentation/git-*.txt
587 588
	./generate-cmdlist.sh > $@+
	mv $@+ $@
F
Fredrik Kuivinen 已提交
589

590
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
591
	rm -f $@ $@+
592
	sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
M
Michal Rokos 已提交
593
	    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
594
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
595
	    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
596
	    -e 's/@@NO_PYTHON@@/$(NO_PYTHON)/g' \
597 598 599
	    $@.sh >$@+
	chmod +x $@+
	mv $@+ $@
600 601

$(patsubst %.perl,%,$(SCRIPT_PERL)) : % : %.perl
602
	rm -f $@ $@+
603
	sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \
604
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
605 606 607
	    $@.perl >$@+
	chmod +x $@+
	mv $@+ $@
608

609
$(patsubst %.py,%,$(SCRIPT_PYTHON)) : % : %.py GIT-CFLAGS
610
	rm -f $@ $@+
611 612
	sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \
	    -e 's|@@GIT_PYTHON_PATH@@|$(GIT_PYTHON_DIR_SQ)|g' \
613
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
614 615 616
	    $@.py >$@+
	chmod +x $@+
	mv $@+ $@
617

618
git-cherry-pick: git-revert
619 620
	cp $< $@+
	mv $@+ $@
621

J
Junio C Hamano 已提交
622
git-status: git-commit
623 624
	cp $< $@+
	mv $@+ $@
J
Junio C Hamano 已提交
625

626 627 628
gitweb/gitweb.cgi: gitweb/gitweb.perl
	rm -f $@ $@+
	sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \
629 630 631
	    -e 's|++GIT_VERSION++|$(GIT_VERSION)|g' \
	    -e 's|++GIT_BINDIR++|$(bindir)|g' \
	    -e 's|++GITWEB_CONFIG++|$(GITWEB_CONFIG)|g' \
632
	    -e 's|++GITWEB_HOME_LINK_STR++|$(GITWEB_HOME_LINK_STR)|g' \
633 634
	    -e 's|++GITWEB_SITENAME++|$(GITWEB_SITENAME)|g' \
	    -e 's|++GITWEB_PROJECTROOT++|$(GITWEB_PROJECTROOT)|g' \
635
	    -e 's|++GITWEB_BASE_URL++|$(GITWEB_BASE_URL)|g' \
636 637 638 639
	    -e 's|++GITWEB_LIST++|$(GITWEB_LIST)|g' \
	    -e 's|++GITWEB_HOMETEXT++|$(GITWEB_HOMETEXT)|g' \
	    -e 's|++GITWEB_CSS++|$(GITWEB_CSS)|g' \
	    -e 's|++GITWEB_LOGO++|$(GITWEB_LOGO)|g' \
640
	    -e 's|++GITWEB_FAVICON++|$(GITWEB_FAVICON)|g' \
641 642 643 644
	    $< >$@+
	chmod +x $@+
	mv $@+ $@

645 646 647 648 649 650
git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css
	rm -f $@ $@+
	sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
	    -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
	    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
	    -e 's/@@NO_PYTHON@@/$(NO_PYTHON)/g' \
651
	    -e '/@@GITWEB_CGI@@/r gitweb/gitweb.cgi' \
652
	    -e '/@@GITWEB_CGI@@/d' \
653
	    -e '/@@GITWEB_CSS@@/r gitweb/gitweb.css' \
654
	    -e '/@@GITWEB_CSS@@/d' \
655
	    $@.sh > $@+
656 657 658
	chmod +x $@+
	mv $@+ $@

659 660 661 662 663 664 665
configure: configure.ac
	rm -f $@ $<+
	sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
	    $< > $<+
	autoconf -o $@ $<+
	rm -f $<+

666 667 668 669 670 671
# These can record GIT_VERSION
git$X git.spec \
	$(patsubst %.sh,%,$(SCRIPT_SH)) \
	$(patsubst %.perl,%,$(SCRIPT_PERL)) \
	$(patsubst %.py,%,$(SCRIPT_PYTHON)) \
	: GIT-VERSION-FILE
672

673
%.o: %.c GIT-CFLAGS
674 675 676
	$(CC) -o $*.o -c $(ALL_CFLAGS) $<
%.o: %.S
	$(CC) -o $*.o -c $(ALL_CFLAGS) $<
677

678
exec_cmd.o: exec_cmd.c GIT-CFLAGS
679
	$(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
680 681
builtin-init-db.o: builtin-init-db.c GIT-CFLAGS
	$(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
682

683
http.o: http.c GIT-CFLAGS
684 685
	$(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $<

686
ifdef NO_EXPAT
687
http-fetch.o: http-fetch.c http.h GIT-CFLAGS
688 689 690
	$(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $<
endif

691
git-%$X: %.o $(GITLIBS)
J
Junio C Hamano 已提交
692
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
693

694
$(SIMPLE_PROGRAMS) : $(LIB_FILE)
695
$(SIMPLE_PROGRAMS) : git-%$X : %.o
J
Junio C Hamano 已提交
696 697
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
		$(LIB_FILE) $(SIMPLE_LIB)
698

699 700
ssh-pull.o: ssh-fetch.c
ssh-push.o: ssh-upload.c
701 702 703 704 705
git-local-fetch$X: fetch.o
git-ssh-fetch$X: rsh.o fetch.o
git-ssh-upload$X: rsh.o
git-ssh-pull$X: rsh.o fetch.o
git-ssh-push$X: rsh.o
706

707 708
git-imap-send$X: imap-send.o $(LIB_FILE)

J
Junio C Hamano 已提交
709
http.o http-fetch.o http-push.o: http.h
710
git-http-fetch$X: fetch.o http.o http-fetch.o $(GITLIBS)
711
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
712
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)
713

714
git-http-push$X: revision.o http.o http-push.o $(GITLIBS)
715 716 717
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
		$(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT)

718
merge-recursive.o path-list.o: path-list.h
719
git-merge-recur$X: merge-recursive.o path-list.o $(GITLIBS)
720 721 722
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
		$(LIBS)

723
$(LIB_OBJS) $(BUILTIN_OBJS): $(LIB_H)
724
$(patsubst git-%$X,%.o,$(PROGRAMS)): $(LIB_H) $(wildcard */*.h)
725
$(DIFF_OBJS): diffcore.h
726

P
Petr Baudis 已提交
727
$(LIB_FILE): $(LIB_OBJS)
728
	rm -f $@ && $(AR) rcs $@ $(LIB_OBJS)
P
Petr Baudis 已提交
729

730 731 732
XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o

$(XDIFF_LIB): $(XDIFF_OBJS)
733
	rm -f $@ && $(AR) rcs $@ $(XDIFF_OBJS)
734 735


P
Petr Baudis 已提交
736 737 738
doc:
	$(MAKE) -C Documentation all

739 740 741 742 743 744 745
TAGS:
	rm -f TAGS
	find . -name '*.[hcS]' -print | xargs etags -a

tags:
	rm -f tags
	find . -name '*.[hcS]' -print | xargs ctags -a
P
Petr Baudis 已提交
746

747
### Detect prefix changes
748
TRACK_CFLAGS = $(subst ','\'',$(ALL_CFLAGS)):$(GIT_PYTHON_DIR_SQ):\
749 750 751 752 753 754 755 756 757
             $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ)

GIT-CFLAGS: .FORCE-GIT-CFLAGS
	@FLAGS='$(TRACK_CFLAGS)'; \
	    if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \
		echo 1>&2 "    * new build flags or prefix"; \
		echo "$$FLAGS" >GIT-CFLAGS; \
            fi

P
Petr Baudis 已提交
758 759
### Testing rules

760 761 762 763 764
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

export NO_PYTHON
765
export NO_SVN_TESTS
766

P
Petr Baudis 已提交
767 768 769
test: all
	$(MAKE) -C t/ all

J
Junio C Hamano 已提交
770
test-date$X: test-date.c date.o ctype.o
J
Junio C Hamano 已提交
771
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) test-date.c date.o ctype.o
P
Petr Baudis 已提交
772

773
test-delta$X: test-delta.c diff-delta.o patch-delta.o
774
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $^
P
Petr Baudis 已提交
775

J
Junio C Hamano 已提交
776 777 778
test-dump-cache-tree$X: dump-cache-tree.o $(GITLIBS)
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)

779 780 781 782 783 784
test-sha1$X: test-sha1.o $(GITLIBS)
	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)

check-sha1:: test-sha1$X
	./test-sha1.sh

P
Petr Baudis 已提交
785
check:
786
	for i in *.c; do sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; done
P
Petr Baudis 已提交
787 788 789 790 791



### Installation rules

792
install: all
793 794 795 796
	$(INSTALL) -d -m755 '$(DESTDIR_SQ)$(bindir_SQ)'
	$(INSTALL) -d -m755 '$(DESTDIR_SQ)$(gitexecdir_SQ)'
	$(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexecdir_SQ)'
	$(INSTALL) git$X gitk '$(DESTDIR_SQ)$(bindir_SQ)'
797
	$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
798 799
	$(INSTALL) -d -m755 '$(DESTDIR_SQ)$(GIT_PYTHON_DIR_SQ)'
	$(INSTALL) $(PYMODULES) '$(DESTDIR_SQ)$(GIT_PYTHON_DIR_SQ)'
800 801 802 803 804 805 806 807
	if test 'z$(bindir_SQ)' != 'z$(gitexecdir_SQ)'; \
	then \
		ln -f '$(DESTDIR_SQ)$(bindir_SQ)/git$X' \
			'$(DESTDIR_SQ)$(gitexecdir_SQ)/git$X' || \
		cp '$(DESTDIR_SQ)$(bindir_SQ)/git$X' \
			'$(DESTDIR_SQ)$(gitexecdir_SQ)/git$X'; \
	fi
	$(foreach p,$(BUILT_INS), rm -f '$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' && ln '$(DESTDIR_SQ)$(gitexecdir_SQ)/git$X' '$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' ;)
P
Petr Baudis 已提交
808 809 810 811 812 813 814 815 816

install-doc:
	$(MAKE) -C Documentation install




### Maintainer's dist rules

817
git.spec: git.spec.in
818 819
	sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
	mv $@+ $@
820

J
Junio C Hamano 已提交
821 822
GIT_TARNAME=git-$(GIT_VERSION)
dist: git.spec git-tar-tree
823
	./git-tar-tree HEAD^{tree} $(GIT_TARNAME) > $(GIT_TARNAME).tar
824
	@mkdir -p $(GIT_TARNAME)
J
Junio C Hamano 已提交
825
	@cp git.spec $(GIT_TARNAME)
826 827 828
	@echo $(GIT_VERSION) > $(GIT_TARNAME)/version
	$(TAR) rf $(GIT_TARNAME).tar \
		$(GIT_TARNAME)/git.spec $(GIT_TARNAME)/version
829
	@rm -rf $(GIT_TARNAME)
830
	gzip -f -9 $(GIT_TARNAME).tar
831 832

rpm: dist
J
Junio C Hamano 已提交
833
	$(RPMBUILD) -ta $(GIT_TARNAME).tar.gz
834

835 836 837 838 839 840 841 842 843 844 845
htmldocs = git-htmldocs-$(GIT_VERSION)
manpages = git-manpages-$(GIT_VERSION)
dist-doc:
	rm -fr .doc-tmp-dir
	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
	:
	rm -fr .doc-tmp-dir
	mkdir .doc-tmp-dir .doc-tmp-dir/man1 .doc-tmp-dir/man7
846
	$(MAKE) -C Documentation DESTDIR=./ \
847 848
		man1dir=../.doc-tmp-dir/man1 \
		man7dir=../.doc-tmp-dir/man7 \
849 850 851 852 853
		install
	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
	gzip -n -9 -f $(manpages).tar
	rm -fr .doc-tmp-dir

P
Petr Baudis 已提交
854
### Cleaning rules
855

856
clean:
857 858
	rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \
		$(LIB_FILE) $(XDIFF_LIB)
A
A Large Angry SCM 已提交
859
	rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X
860
	rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
861
	rm -rf autom4te.cache
862
	rm -f configure config.log config.mak.autogen config.mak.append config.status config.cache
863
	rm -rf $(GIT_TARNAME) .doc-tmp-dir
864
	rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
865
	rm -f $(htmldocs).tar.gz $(manpages).tar.gz
866
	rm -f gitweb/gitweb.cgi
867
	$(MAKE) -C Documentation/ clean
868
	$(MAKE) -C templates clean
869
	$(MAKE) -C t/ clean
870
	rm -f GIT-VERSION-FILE GIT-CFLAGS
871

J
Junio C Hamano 已提交
872
.PHONY: all install clean strip
873
.PHONY: .FORCE-GIT-VERSION-FILE TAGS tags .FORCE-GIT-CFLAGS
J
Junio C Hamano 已提交
874

J
Junio C Hamano 已提交
875 876 877 878 879 880 881
### Check documentation
#
check-docs::
	@for v in $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk; \
	do \
		case "$$v" in \
		git-merge-octopus | git-merge-ours | git-merge-recursive | \
882
		git-merge-resolve | git-merge-stupid | git-merge-recur | \
J
Junio C Hamano 已提交
883 884 885 886 887 888 889 890 891 892
		git-ssh-pull | git-ssh-push ) continue ;; \
		esac ; \
		test -f "Documentation/$$v.txt" || \
		echo "no doc: $$v"; \
		grep -q "^gitlink:$$v\[[0-9]\]::" Documentation/git.txt || \
		case "$$v" in \
		git) ;; \
		*) echo "no link: $$v";; \
		esac ; \
	done | sort