From mboxrd@z Thu Jan 1 00:00:00 1970 From: jamie.couture at gmail.com (Jamie Couture) Date: Thu, 15 Nov 2012 18:48:17 -0500 Subject: [PATCH v4] Makefile: improve dependency generation In-Reply-To: <1352940385-26357-1-git-send-email-jamie.couture@gmail.com> References: <1352940385-26357-1-git-send-email-jamie.couture@gmail.com> Message-ID: <1353023297-9434-1-git-send-email-jamie.couture@gmail.com> 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 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 --- Makefile | 153 +++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 85 insertions(+), 68 deletions(-) diff --git a/Makefile b/Makefile index bbce29d..65a584f 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +all:: + CGIT_VERSION = v0.9.1 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