Merge branch 'js/maint-no-ln-across-libexec-and-bin'
authorJunio C Hamano <gitster@pobox.com>
Sat, 23 May 2009 08:43:08 +0000 (01:43 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 23 May 2009 08:43:08 +0000 (01:43 -0700)
* js/maint-no-ln-across-libexec-and-bin:
Add NO_CROSS_DIRECTORY_HARDLINKS support to the Makefile

Conflicts:
Makefile

1  2 
Makefile
diff --combined Makefile
index 3ef9230f776f6605fb8db31e3d8a90be4ee94572,2b8ce48c0c720125f68f8f770181ec312f2095e5..fdb39fa439e0759a74bcb11b35995812849b2886
+++ b/Makefile
@@@ -126,12 -126,6 +126,12 @@@ all:
  # randomly break unless your underlying filesystem supports those sub-second
  # times (my ext3 doesn't).
  #
 +# Define USE_ST_TIMESPEC if your "struct stat" uses "st_ctimespec" instead of
 +# "st_ctim"
 +#
 +# Define NO_NSEC if your "struct stat" does not have "st_ctim.tv_nsec"
 +# available.  This automatically turns USE_NSEC off.
 +#
  # Define USE_STDEV below if you want git to care about the underlying device
  # change being considered an inode change from the update-index perspective.
  #
  # Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
  # MakeMaker (e.g. using ActiveState under Cygwin).
  #
 +# Define NO_PERL if you do not want Perl scripts or libraries at all.
 +#
  # Define NO_TCLTK if you do not want Tcl/Tk GUI.
  #
  # The TCL_PATH variable governs the location of the Tcl interpreter
  # your external grep (e.g., if your system lacks grep, if its grep is
  # broken, or spawning external process is slower than built-in grep git has).
  #
 +# 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.
 +#
 +# Define OBJECT_CREATION_USES_RENAMES if your operating systems has problems
 +# when hardlinking a file to another name and unlinking the original file right
 +# away (some NTFS drivers seem to zero the contents in that scenario).
++#
+ # 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.
  
  GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
        @$(SHELL_PATH) ./GIT-VERSION-GEN
@@@ -273,28 -260,14 +276,28 @@@ SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__pow
  BASIC_CFLAGS =
  BASIC_LDFLAGS =
  
 +# Guard against environment variables
 +BUILTIN_OBJS =
 +BUILT_INS =
 +COMPAT_CFLAGS =
 +COMPAT_OBJS =
 +LIB_H =
 +LIB_OBJS =
 +PROGRAMS =
 +SCRIPT_PERL =
 +SCRIPT_SH =
 +TEST_PROGRAMS =
 +
  SCRIPT_SH += git-am.sh
  SCRIPT_SH += git-bisect.sh
 +SCRIPT_SH += git-difftool--helper.sh
  SCRIPT_SH += git-filter-branch.sh
  SCRIPT_SH += git-lost-found.sh
  SCRIPT_SH += git-merge-octopus.sh
  SCRIPT_SH += git-merge-one-file.sh
  SCRIPT_SH += git-merge-resolve.sh
  SCRIPT_SH += git-mergetool.sh
 +SCRIPT_SH += git-mergetool--lib.sh
  SCRIPT_SH += git-parse-remote.sh
  SCRIPT_SH += git-pull.sh
  SCRIPT_SH += git-quiltimport.sh
@@@ -308,7 -281,6 +311,7 @@@ SCRIPT_SH += git-submodule.s
  SCRIPT_SH += git-web--browse.sh
  
  SCRIPT_PERL += git-add--interactive.perl
 +SCRIPT_PERL += git-difftool.perl
  SCRIPT_PERL += git-archimport.perl
  SCRIPT_PERL += git-cvsexportcommit.perl
  SCRIPT_PERL += git-cvsimport.perl
@@@ -327,6 -299,7 +330,6 @@@ EXTRA_PROGRAMS 
  # ... and all the rest that could be moved out of bindir to gitexecdir
  PROGRAMS += $(EXTRA_PROGRAMS)
  PROGRAMS += git-fast-import$X
 -PROGRAMS += git-fetch-pack$X
  PROGRAMS += git-hash-object$X
  PROGRAMS += git-index-pack$X
  PROGRAMS += git-merge-index$X
@@@ -335,6 -308,7 +338,6 @@@ PROGRAMS += git-mktag$
  PROGRAMS += git-mktree$X
  PROGRAMS += git-pack-redundant$X
  PROGRAMS += git-patch-id$X
 -PROGRAMS += git-send-pack$X
  PROGRAMS += git-shell$X
  PROGRAMS += git-show-index$X
  PROGRAMS += git-unpack-file$X
@@@ -364,7 -338,7 +367,7 @@@ BUILT_INS += git-whatchanged$
  ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
  
  # what 'all' will build but not install in gitexecdir
 -OTHER_PROGRAMS = git$X gitweb/gitweb.cgi
 +OTHER_PROGRAMS = git$X
  
  # Set paths to tools early so that they can be used for version tests.
  ifndef SHELL_PATH
@@@ -443,7 -417,6 +446,7 @@@ LIB_OBJS += archive-tar.
  LIB_OBJS += archive-zip.o
  LIB_OBJS += attr.o
  LIB_OBJS += base85.o
 +LIB_OBJS += bisect.o
  LIB_OBJS += blob.o
  LIB_OBJS += branch.o
  LIB_OBJS += bundle.o
@@@ -544,7 -517,6 +547,7 @@@ BUILTIN_OBJS += builtin-add.
  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
@@@ -688,7 -660,6 +691,7 @@@ ifeq ($(uname_S),Darwin
        endif
        NO_MEMMEM = YesPlease
        THREADED_DELTA_SEARCH = YesPlease
 +      USE_ST_TIMESPEC = YesPlease
  endif
  ifeq ($(uname_S),SunOS)
        NEEDS_SOCKET = YesPlease
@@@ -738,7 -709,6 +741,7 @@@ ifeq ($(uname_S),FreeBSD
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
        DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
 +      USE_ST_TIMESPEC = YesPlease
        THREADED_DELTA_SEARCH = YesPlease
        ifeq ($(shell expr "$(uname_R)" : '4\.'),2)
                PTHREAD_LIBS = -pthread
@@@ -749,7 -719,6 +752,7 @@@ endi
  ifeq ($(uname_S),OpenBSD)
        NO_STRCASESTR = YesPlease
        NO_MEMMEM = YesPlease
 +      USE_ST_TIMESPEC = YesPlease
        NEEDS_LIBICONV = YesPlease
        BASIC_CFLAGS += -I/usr/local/include
        BASIC_LDFLAGS += -L/usr/local/lib
@@@ -762,14 -731,12 +765,14 @@@ ifeq ($(uname_S),NetBSD
        BASIC_CFLAGS += -I/usr/pkg/include
        BASIC_LDFLAGS += -L/usr/pkg/lib $(CC_LD_DYNPATH)/usr/pkg/lib
        THREADED_DELTA_SEARCH = YesPlease
 +      USE_ST_TIMESPEC = YesPlease
  endif
  ifeq ($(uname_S),AIX)
        NO_STRCASESTR=YesPlease
        NO_MEMMEM = YesPlease
        NO_MKDTEMP = YesPlease
        NO_STRLCPY = YesPlease
 +      NO_NSEC = YesPlease
        FREAD_READS_DIRECTORIES = UnfortunatelyYes
        INTERNAL_QSORT = UnfortunatelyYes
        NEEDS_LIBICONV=YesPlease
@@@ -810,9 -777,9 +813,9 @@@ ifeq ($(uname_S),HP-UX
  endif
  ifneq (,$(findstring CYGWIN,$(uname_S)))
        COMPAT_OBJS += compat/cygwin.o
 +      UNRELIABLE_FSTAT = UnfortunatelyYes
  endif
  ifneq (,$(findstring MINGW,$(uname_S)))
 -      NO_MMAP = YesPlease
        NO_PREAD = YesPlease
        NO_OPENSSL = YesPlease
        NO_CURL = YesPlease
        RUNTIME_PREFIX = YesPlease
        NO_POSIX_ONLY_PROGRAMS = YesPlease
        NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
 +      NO_NSEC = YesPlease
 +      USE_WIN32_MMAP = YesPlease
 +      UNRELIABLE_FSTAT = UnfortunatelyYes
 +      OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
        COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/regex -Icompat/fnmatch
        COMPAT_CFLAGS += -DSNPRINTF_SIZE_CORR=1
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
@@@ -960,15 -923,6 +963,15 @@@ endi
  ifdef NO_ST_BLOCKS_IN_STRUCT_STAT
        BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT
  endif
 +ifdef USE_NSEC
 +      BASIC_CFLAGS += -DUSE_NSEC
 +endif
 +ifdef USE_ST_TIMESPEC
 +      BASIC_CFLAGS += -DUSE_ST_TIMESPEC
 +endif
 +ifdef NO_NSEC
 +      BASIC_CFLAGS += -DNO_NSEC
 +endif
  ifdef NO_C99_FORMAT
        BASIC_CFLAGS += -DNO_C99_FORMAT
  endif
@@@ -1016,14 -970,6 +1019,14 @@@ endi
  ifdef NO_MMAP
        COMPAT_CFLAGS += -DNO_MMAP
        COMPAT_OBJS += compat/mmap.o
 +else
 +      ifdef USE_WIN32_MMAP
 +              COMPAT_CFLAGS += -DUSE_WIN32_MMAP
 +              COMPAT_OBJS += compat/win32mmap.o
 +      endif
 +endif
 +ifdef OBJECT_CREATION_USES_RENAMES
 +      COMPAT_CFLAGS += -DOBJECT_CREATION_MODE=1
  endif
  ifdef NO_PREAD
        COMPAT_CFLAGS += -DNO_PREAD
@@@ -1120,18 -1066,11 +1123,18 @@@ endi
  ifdef NO_EXTERNAL_GREP
        BASIC_CFLAGS += -DNO_EXTERNAL_GREP
  endif
 +ifdef UNRELIABLE_FSTAT
 +      BASIC_CFLAGS += -DUNRELIABLE_FSTAT
 +endif
  
  ifeq ($(TCLTK_PATH),)
  NO_TCLTK=NoThanks
  endif
  
 +ifeq ($(PERL_PATH),)
 +NO_PERL=NoThanks
 +endif
 +
  QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
  QUIET_SUBDIR1  =
  
@@@ -1206,9 -1145,7 +1209,9 @@@ ifndef NO_TCLT
        $(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
        $(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
  endif
 +ifndef NO_PERL
        $(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' all
 +endif
        $(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1)
  
  please_set_SHELL_PATH_to_a_more_modern_shell:
@@@ -1221,7 -1158,6 +1224,7 @@@ strip: $(PROGRAMS) git$
  
  git.o: git.c common-cmds.h GIT-CFLAGS
        $(QUIET_CC)$(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \
 +              '-DGIT_HTML_PATH="$(htmldir_SQ)"' \
                $(ALL_CFLAGS) -c $(filter %.c,$^)
  
  git$X: git.o $(BUILTIN_OBJS) $(GITLIBS)
@@@ -1249,13 -1185,13 +1252,13 @@@ $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %
        $(QUIET_GEN)$(RM) $@ $@+ && \
        sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
            -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
 -          -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
            -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
            -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
            $@.sh >$@+ && \
        chmod +x $@+ && \
        mv $@+ $@
  
 +ifndef NO_PERL
  $(patsubst %.perl,%,$(SCRIPT_PERL)): perl/perl.mak
  
  perl/perl.mak: GIT-CFLAGS perl/Makefile perl/Makefile.PL
@@@ -1277,7 -1213,6 +1280,7 @@@ $(patsubst %.perl,%,$(SCRIPT_PERL)): % 
        chmod +x $@+ && \
        mv $@+ $@
  
 +OTHER_PROGRAMS += gitweb/gitweb.cgi
  gitweb/gitweb.cgi: gitweb/gitweb.perl
        $(QUIET_GEN)$(RM) $@ $@+ && \
        sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \
@@@ -1316,15 -1251,6 +1319,15 @@@ git-instaweb: git-instaweb.sh gitweb/gi
            $@.sh > $@+ && \
        chmod +x $@+ && \
        mv $@+ $@
 +else # NO_PERL
 +$(patsubst %.perl,%,$(SCRIPT_PERL)) git-instaweb: % : unimplemented.sh
 +      $(QUIET_GEN)$(RM) $@ $@+ && \
 +      sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
 +          -e 's|@@REASON@@|NO_PERL=$(NO_PERL)|g' \
 +          unimplemented.sh >$@+ && \
 +      chmod +x $@+ && \
 +      mv $@+ $@
 +endif # NO_PERL
  
  configure: configure.ac
        $(QUIET_GEN)$(RM) $@ $<+ && \
@@@ -1440,8 -1366,6 +1443,8 @@@ GIT-CFLAGS: .FORCE-GIT-CFLAG
  GIT-BUILD-OPTIONS: .FORCE-GIT-BUILD-OPTIONS
        @echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@
        @echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@
 +      @echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@
 +      @echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@
  
  ### Detect Tck/Tk interpreter path changes
  ifndef NO_TCLTK
@@@ -1536,19 -1460,18 +1539,20 @@@ install: al
        $(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
        $(INSTALL) git$X git-upload-pack$X git-receive-pack$X git-upload-archive$X git-shell$X git-cvsserver '$(DESTDIR_SQ)$(bindir_SQ)'
        $(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
 +ifndef NO_PERL
        $(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
 +endif
  ifndef NO_TCLTK
        $(MAKE) -C gitk-git install
        $(MAKE) -C git-gui gitexecdir='$(gitexec_instdir_SQ)' install
  endif
  ifneq (,$X)
 -      $(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) git$X)), $(RM) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)/$p';)
 +      $(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';)
  endif
        bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
        execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
        { $(RM) "$$execdir/git-add$X" && \
+               test -z "$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
                ln "$$bindir/git$X" "$$execdir/git-add$X" 2>/dev/null || \
                cp "$$bindir/git$X" "$$execdir/git-add$X"; } && \
        { for p in $(filter-out git-add$X,$(BUILT_INS)); do \
                ln "$$execdir/git-add$X" "$$execdir/$$p" 2>/dev/null || \
                ln -s "git-add$X" "$$execdir/$$p" 2>/dev/null || \
                cp "$$execdir/git-add$X" "$$execdir/$$p" || exit; \
 -        done } && \
 +        done; } && \
        ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
  
  install-doc:
@@@ -1646,11 -1569,9 +1650,11 @@@ clean
        $(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
 -      $(RM) gitweb/gitweb.cgi
        $(MAKE) -C Documentation/ clean
 +ifndef NO_PERL
 +      $(RM) gitweb/gitweb.cgi
        $(MAKE) -C perl clean
 +endif
        $(MAKE) -C templates/ clean
        $(MAKE) -C t/ clean
  ifndef NO_TCLTK
@@@ -1723,27 -1644,3 +1727,27 @@@ check-docs:
  check-builtins::
        ./check-builtins.sh
  
 +### Test suite coverage testing
 +#
 +.PHONY: coverage coverage-clean coverage-build coverage-report
 +
 +coverage:
 +      $(MAKE) coverage-build
 +      $(MAKE) coverage-report
 +
 +coverage-clean:
 +      rm -f *.gcda *.gcno
 +
 +COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
 +COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
 +
 +coverage-build: coverage-clean
 +      $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
 +      $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
 +              -j1 test
 +
 +coverage-report:
 +      gcov -b *.c
 +      grep '^function.*called 0 ' *.c.gcov \
 +              | sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
 +              | tee coverage-untested-functions