[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