+
+#
+# Platform specific tweaks
+#
+ifeq ($(shell uname -s),Darwin)
+ NEEDS_SSL_WITH_CRYPTO = YesPlease
+ NEEDS_LIBICONV = YesPlease
+endif
+ifeq ($(shell uname -s),SunOS)
+ NEEDS_SOCKET = YesPlease
+ NEEDS_NSL = YesPlease
+ SHELL_PATH = /bin/bash
+ NO_STRCASESTR = YesPlease
+ CURLDIR = /opt/sfw
+ INSTALL = ginstall
+ TAR = gtar
+ PLATFORM_DEFINES += -D__EXTENSIONS__
+endif
+ifneq (,$(findstring arm,$(shell uname -m)))
+ ARM_SHA1 = YesPlease
+endif
+ifeq ($(shell uname -s),OpenBSD)
+ NEEDS_LIBICONV = YesPlease
+ PLATFORM_DEFINES += -I/usr/local/include -L/usr/local/lib
+endif
+
+ifndef NO_CURL
+ ifdef CURLDIR
+ # This is still problematic -- gcc does not want -R.
+ CFLAGS += -I$(CURLDIR)/include
+ CURL_LIBCURL = -L$(CURLDIR)/lib -R$(CURLDIR)/lib -lcurl
+ else
+ CURL_LIBCURL = -lcurl
+ endif
+ PROGRAMS += git-http-fetch
+endif
+
+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
+
+ifndef NO_OPENSSL
+ LIB_OBJS += epoch.o
+ OPENSSL_LIBSSL = -lssl
+ ifdef OPENSSLDIR
+ # Again this may be problematic -- gcc does not always want -R.
+ CFLAGS += -I$(OPENSSLDIR)/include
+ OPENSSL_LINK = -L$(OPENSSLDIR)/lib -R$(OPENSSLDIR)/lib
+ else
+ OPENSSL_LINK =
+ endif
+else
+ DEFINES += '-DNO_OPENSSL'
+ MOZILLA_SHA1 = 1
+ OPENSSL_LIBSSL =
+endif
+ifdef NEEDS_SSL_WITH_CRYPTO
+ LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -lssl
+else
+ LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto
+endif
+ifdef NEEDS_LIBICONV
+ ifdef ICONVDIR
+ # Again this may be problematic -- gcc does not always want -R.
+ CFLAGS += -I$(ICONVDIR)/include
+ ICONV_LINK = -L$(ICONVDIR)/lib -R$(ICONVDIR)/lib
+ else
+ ICONV_LINK =
+ endif
+ LIB_4_ICONV = $(ICONV_LINK) -liconv
+else
+ LIB_4_ICONV =
+endif
+ifdef NEEDS_SOCKET
+ LIBS += -lsocket
+ SIMPLE_LIB += -lsocket
+endif
+ifdef NEEDS_NSL
+ LIBS += -lnsl
+ SIMPLE_LIB += -lnsl
+endif
+ifdef NO_STRCASESTR
+ DEFINES += -Dstrcasestr=gitstrcasestr
+ LIB_OBJS += compat/strcasestr.o
+endif
+
+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
+
+DEFINES += '-DSHA1_HEADER=$(SHA1_HEADER)'
+
+SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
+ $(patsubst %.perl,%,$(SCRIPT_PERL)) \
+ $(patsubst %.py,%,$(SCRIPT_PYTHON)) \
+ gitk
+
+export TAR INSTALL DESTDIR SHELL_PATH
+### Build rules
+
+all: $(PROGRAMS) $(SCRIPTS)
+
+all:
+ $(MAKE) -C templates
+
+git: git.sh Makefile
+ rm -f $@+ $@
+ sed -e '1s|#!.*/sh|#!$(SHELL_PATH)|' \
+ -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
+ $(GIT_LIST_TWEAK) <$@.sh >$@+
+ chmod +x $@+
+ mv $@+ $@
+
+$(filter-out git,$(patsubst %.sh,%,$(SCRIPT_SH))) : % : %.sh
+ rm -f $@
+ sed -e '1s|#!.*/sh|#!$(SHELL_PATH)|' $@.sh >$@
+ chmod +x $@
+
+$(patsubst %.perl,%,$(SCRIPT_PERL)) : % : %.perl
+ rm -f $@
+ sed -e '1s|#!.*perl|#!$(PERL_PATH)|' $@.perl >$@
+ chmod +x $@
+
+$(patsubst %.py,%,$(SCRIPT_PYTHON)) : % : %.py
+ rm -f $@
+ sed -e '1s|#!.*python|#!$(PYTHON_PATH)|' \
+ -e 's|@@GIT_PYTHON_PATH@@|$(GIT_PYTHON_DIR)|g' \
+ $@.py >$@
+ chmod +x $@
+
+%.o: %.c
+ $(CC) -o $*.o -c $(ALL_CFLAGS) $<
+%.o: %.S
+ $(CC) -o $*.o -c $(ALL_CFLAGS) $<
+
+git-%: %.o $(LIB_FILE)
+ $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) $(LIBS)
+
+git-mailinfo : SIMPLE_LIB += $(LIB_4_ICONV)
+$(SIMPLE_PROGRAMS) : $(LIB_FILE)
+$(SIMPLE_PROGRAMS) : git-% : %.o
+ $(CC) $(ALL_CFLAGS) -o $@ $(filter %.o,$^) $(LIB_FILE) $(SIMPLE_LIB)
+
+git-http-fetch: fetch.o
+git-local-fetch: fetch.o
+git-ssh-fetch: rsh.o fetch.o
+git-ssh-upload: rsh.o
+git-ssh-pull: rsh.o fetch.o
+git-ssh-push: rsh.o
+
+git-http-fetch: LIBS += $(CURL_LIBCURL)
+git-rev-list: LIBS += $(OPENSSL_LIBSSL)
+
+init-db.o: init-db.c
+ $(CC) -c $(ALL_CFLAGS) \
+ -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir)"' $*.c
+
+$(LIB_OBJS): $(LIB_H)
+$(patsubst git-%,%.o,$(PROGRAMS)): $(LIB_H)
+$(DIFF_OBJS): diffcore.h