List for cgit developers and users
 help / color / mirror / Atom feed
From: jamie.couture at gmail.com (Jamie Couture)
Subject: [PATCH v5] Makefile: improve dependency generation
Date: Sat, 17 Nov 2012 13:02:17 -0500	[thread overview]
Message-ID: <1353175337-27423-1-git-send-email-jamie.couture@gmail.com> (raw)
In-Reply-To: <20121117162825.GA5373@bronto-burt>

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 <jamie.couture at gmail.com>
---
 Makefile | 153 +++++++++++++++++++++++++++++++++++----------------------------
 1 file changed, 85 insertions(+), 68 deletions(-)

diff --git a/Makefile b/Makefile
index bbce29d..25782cc 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





  reply	other threads:[~2012-11-17 18:02 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-15  0:46 [PATCH] " jamie.couture
2012-11-15  0:57 ` Jason
2012-11-15  3:40   ` jamie.couture
2012-11-17 16:16     ` mathstuf
2012-11-17 16:17       ` Jason
2012-11-17 16:28         ` mathstuf
2012-11-17 18:02           ` jamie.couture [this message]
2012-11-17 18:37             ` [PATCH v5] " Jason
2012-11-15  4:24 ` [PATCH v2] " jamie.couture
2012-11-15  4:30   ` jamie.couture
2012-11-15  4:30 ` [PATCH v3] " jamie.couture
2012-11-15 23:48 ` [PATCH v4] " jamie.couture

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1353175337-27423-1-git-send-email-jamie.couture@gmail.com \
    --to=cgit@lists.zx2c4.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).