[PATCH v2] Makefile: improve dependency generation

Jamie Couture jamie.couture at gmail.com
Thu Nov 15 05:30:23 CET 2012


ugh. typos in commit message.  I'll send an amended one.


On Wed, Nov 14, 2012 at 11:24 PM, Jamie Couture <jamie.couture at gmail.com>wrote:

> Makefile target generation would always be included for any makefile
> target that was not clean.  Only care to include the '.deps' directory
> when building cgit, rather than anyways generating and including
> dependencies when calling other makefile targets.
>
> Heavily borrowed from git's Makefile, but without definitions to test
> for the compiler's header dependency feature.  Previous Makefile
> implementation never checked for this compiler feature anyway.
>
>   - Removed makecmdgoal 'clean' check
>   - Grouped like .PHONY target definitions
>   - Place build dependency targets under .SUFFIXES
>   - Re-arranged location of library inclusion definitions
>
> Signed-off-by: Jamie Couture <jamie.couture at gmail.com>
> ---
>  Makefile | 153
> +++++++++++++++++++++++++++++++++++----------------------------
>  1 file changed, 85 insertions(+), 68 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 1873809..ba75d45 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1,3 +1,5 @@
> +all::
> +
>  CGIT_VERSION = v0.9.0.3
>  CGIT_SCRIPT_NAME = cgit.cgi
>  CGIT_SCRIPT_PATH = /var/www/htdocs/cgit
> @@ -40,22 +42,14 @@ DOC_PDF  = $(patsubst %.txt,%.pdf,$(MAN_TXT))
>  # Platform specific tweaks
>  #
>
> +VERSION: force-version
> +       @./gen-version.sh "$(CGIT_VERSION)"
> +-include VERSION
> +
>  uname_S := $(shell sh -c 'uname -s 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')
>
> -ifeq ($(uname_O),Cygwin)
> -       NO_STRCASESTR = YesPlease
> -       NEEDS_LIBICONV = YesPlease
> -endif
> -
> -ifeq ($(uname_S),$(filter $(uname_S),FreeBSD OpenBSD))
> -       # Apparantly libiconv is installed in /usr/local on BSD
> -       LDFLAGS ?= -L/usr/local/lib
> -       CFLAGS ?= -I/usr/local/include
> -       NEEDS_LIBICONV = yes
> -endif
> -
>  #
>  # Let the user override the above settings.
>  #
> @@ -76,30 +70,66 @@ endif
>
>  ifndef V
>         QUIET_CC       = @echo '   ' CC $@;
> -       QUIET_MM       = @echo '   ' MM $@;
> +       QUIET_LINK     = @echo '   ' LINK $@;
>         QUIET_SUBDIR0  = + at subdir=
>         QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
>                          $(MAKE) $(PRINT_DIR) -C $$subdir
>         QUIET_TAGS     = @echo '   ' TAGS $@;
> +       export V
>  endif
>
> -#
> -# Define a pattern rule for automatic dependency building
> -#
> -%.d: %.c
> -       $(QUIET_MM)$(CC) $(CFLAGS) -MM -MP $< | sed -e 's/\($*\)\.o:/\1.o
> $@:/g' >$@
> +LDFLAGS =
> +CFLAGS  = -g -Wall
>
> -#
> -# Define a pattern rule for silent object building
> -#
> -%.o: %.c
> -       $(QUIET_CC)$(CC) -o $*.o -c $(CFLAGS) $<
> +INCLUDE = -Igit
> +ALL_CFLAGS = $(CFLAGS) $(INCLUDE) $(EXTRA_CFLAGS)
>
> +EXTRA_CFLAGS =
> +EXTRA_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER)'
> +EXTRA_CFLAGS += -DCGIT_VERSION='"$(CGIT_VERSION)"'
> +EXTRA_CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"'
> +EXTRA_CFLAGS += -DCGIT_SCRIPT_NAME='"$(CGIT_SCRIPT_NAME)"'
> +EXTRA_CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"'
>
> -EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lpthread
> +ifeq ($(uname_O),Cygwin)
> +       NO_STRCASESTR = YesPlease
> +       NEEDS_LIBICONV = YesPlease
> +endif
> +
> +ifeq ($(uname_S),$(filter $(uname_S),FreeBSD OpenBSD))
> +       # Apparantly libiconv is installed in /usr/local on BSD
> +       LDFLAGS += -L/usr/local/lib
> +       CFLAGS += -I/usr/local/include
> +       NEEDS_LIBICONV = yes
> +endif
> +
> +GIT_OPTIONS = prefix=/usr
>  OBJECTS =
> -OBJECTS += cache.o
> +EXTLIBS =
> +
> +ifdef NO_ICONV
> +       CFLAGS += -DNO_ICONV
> +endif
> +ifdef NO_STRCASESTR
> +       CFLAGS += -DNO_STRCASESTR
> +endif
> +ifdef NO_C99_FORMAT
> +       CFLAGS += -DNO_C99_FORMAT
> +endif
> +ifdef NO_OPENSSL
> +       CFLAGS += -DNO_OPENSSL
> +       GIT_OPTIONS += NO_OPENSSL=1
> +else
> +       EXTLIBS += -lcrypto
> +endif
> +
> +ifdef NEEDS_LIBICONV
> +       EXTLIBS += -liconv
> +endif
> +
> +EXTLIBS += git/libgit.a git/xdiff/lib.a -lz -lpthread
>  OBJECTS += cgit.o
> +OBJECTS += cache.o
>  OBJECTS += cmd.o
>  OBJECTS += configfile.o
>  OBJECTS += html.o
> @@ -125,55 +155,30 @@ OBJECTS += ui-tag.o
>  OBJECTS += ui-tree.o
>  OBJECTS += vector.o
>
> -ifdef NEEDS_LIBICONV
> -       EXTLIBS += -liconv
> -endif
> -
> -
> -.PHONY: all libgit test install uninstall clean force-version get-git \
> -       doc clean-doc install-doc install-man install-html install-pdf \
> -       uninstall-doc uninstall-man uninstall-html uninstall-pdf tags
> -
> -all: cgit
> +dep_files := $(foreach f,$(OBJECTS),$(dir $f).deps/$(notdir $f).d)
> +dep_dirs := $(addsuffix .deps,$(sort $(dir $OBJECTS)))
>
> -VERSION: force-version
> -       @./gen-version.sh "$(CGIT_VERSION)"
> --include VERSION
> +$(dep_dirs):
> +       @mkdir -p $@
>
> +missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
> +dep_file = $(dir $@).deps/$(notdir $@).d
> +dep_args = -MF $(dep_file) -MMD -MP
>
> -CFLAGS += -g -Wall -Igit
> -CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER)'
> -CFLAGS += -DCGIT_VERSION='"$(CGIT_VERSION)"'
> -CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"'
> -CFLAGS += -DCGIT_SCRIPT_NAME='"$(CGIT_SCRIPT_NAME)"'
> -CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"'
> +.SUFFIXES:
>
> -GIT_OPTIONS = prefix=/usr
> +$(OBJECTS): %.o: %.c $(missing_dep_dirs)
> +       $(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(ALL_CFLAGS) $<
>
> -ifdef NO_ICONV
> -       CFLAGS += -DNO_ICONV
> -endif
> -ifdef NO_STRCASESTR
> -       CFLAGS += -DNO_STRCASESTR
> -endif
> -ifdef NO_C99_FORMAT
> -       CFLAGS += -DNO_C99_FORMAT
> +dep_files_present := $(wildcard $(dep_files))
> +ifneq ($(dep_files_present),)
> +include $(dep_files_present)
>  endif
> -ifdef NO_OPENSSL
> -       CFLAGS += -DNO_OPENSSL
> -       GIT_OPTIONS += NO_OPENSSL=1
> -else
> -       EXTLIBS += -lcrypto
> -endif
> -
> -cgit: $(OBJECTS) libgit
> -       $(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS)
>
> -cgit.o: VERSION
> +all:: cgit
>
> -ifneq "$(MAKECMDGOALS)" "clean"
> -  -include $(OBJECTS:.o=.d)
> -endif
> +cgit: VERSION $(OBJECTS) libgit
> +       $(QUIET_LINK)$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(OBJECTS)
> $(EXTLIBS)
>
>  libgit:
>         $(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) NO_CURL=1 $(GIT_OPTIONS)
> libgit.a
> @@ -243,13 +248,25 @@ $(DOC_PDF): %.pdf : %.txt
>         a2x -f pdf cgitrc.5.txt
>
>  clean: clean-doc
> -       rm -f cgit VERSION *.o *.d tags
> +       $(RM) cgit VERSION *.o tags
> +       $(RM) -r .deps
> +
> +cleanall: clean
> +       $(MAKE) -C git clean
>
>  clean-doc:
> -       rm -f cgitrc.5 cgitrc.5.html cgitrc.5.pdf cgitrc.5.xml cgitrc.5.fo
> +       $(RM) cgitrc.5 cgitrc.5.html cgitrc.5.pdf cgitrc.5.xml cgitrc.5.fo
>
>  get-git:
>         curl -L $(GIT_URL) | tar -xzf - && rm -rf git && mv git-$(GIT_VER)
> git
>
>  tags:
>         $(QUIET_TAGS)find . -name '*.[ch]' | xargs ctags
> +
> +.PHONY: all libgit force-version get-git
> +.PHONY: install install-doc install-man install-html install-pdf
> +.PHONY: uninstall uninstall-doc uninstall-man uninstall-html uninstall-pdf
> +.PHONY: doc clean-doc
> +.PHONY: clean cleanall clean-doc
> +.PHONY: test
> +.PHONY: tags
> --
> 1.7.11.7
>
>



More information about the CGit mailing list