List for cgit developers and users
 help / color / mirror / Atom feed
* [PATCH] Makefile: improve dependency generation
@ 2012-11-15  0:46 jamie.couture
  2012-11-15  0:57 ` Jason
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: jamie.couture @ 2012-11-15  0:46 UTC (permalink / raw)


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 | 122 ++++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 66 insertions(+), 56 deletions(-)

diff --git a/Makefile b/Makefile
index 1873809..e3cb2bd 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
@@ -76,30 +78,47 @@ 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 $@;
 endif
 
-#
-# Define a pattern rule for automatic dependency building
-#
-%.d: %.c
-	$(QUIET_MM)$(CC) $(CFLAGS) -MM -MP $< | sed -e 's/\($*\)\.o:/\1.o $@:/g' >$@
+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)"'
 
-#
-# Define a pattern rule for silent object building
-#
-%.o: %.c
-	$(QUIET_CC)$(CC) -o $*.o -c $(CFLAGS) $<
+GIT_OPTIONS = prefix=/usr
+OBJECTS =
+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 =
-OBJECTS += cache.o
+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 +144,34 @@ OBJECTS += ui-tag.o
 OBJECTS += ui-tree.o
 OBJECTS += vector.o
 
-ifdef NEEDS_LIBICONV
-	EXTLIBS += -liconv
-endif
-
+dep_files := $(foreach f,$(OBJECTS),$(dir $f).deps/$(notdir $f).d)
+dep_dirs := $(addsuffix .deps,$(sort $(dir $OBJECTS)))
 
-.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
+$(dep_dirs):
+	@mkdir -p $@
 
-all: cgit
+missing_dep_dirs := $(filter-out $(wildcard $(dep_dirs)),$(dep_dirs))
+dep_file = $(dir $@).deps/$(notdir $@).d
+dep_args = -MF $(dep_file) -MMD -MP
 
-VERSION: force-version
-	@./gen-version.sh "$(CGIT_VERSION)"
--include VERSION
-
-
-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
+%.o: %.c $(missing_dep_dirs)
+	$(QUIET_CC)$(CC) -o $*.o -c $(dep_args) $(CFLAGS) $<
 
-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
+dep_files_present := $(wildcard $(dep_files))
+ifneq ($(dep_files_present),)
+include $(dep_files_present)
 endif
 
-cgit: $(OBJECTS) libgit
-	$(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS)
+all:: cgit
 
-cgit.o: VERSION
+VERSION: force-version
+	@./gen-version.sh "$(CGIT_VERSION)"
+-include VERSION
 
-ifneq "$(MAKECMDGOALS)" "clean"
-  -include $(OBJECTS:.o=.d)
-endif
+cgit: VERSION $(OBJECTS) libgit
+	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) $(EXTLIBS)
 
 libgit:
 	$(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) NO_CURL=1 $(GIT_OPTIONS) libgit.a
@@ -243,13 +241,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





^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] Makefile: improve dependency generation
  2012-11-15  0:46 [PATCH] Makefile: improve dependency generation jamie.couture
@ 2012-11-15  0:57 ` Jason
  2012-11-15  3:40   ` jamie.couture
  2012-11-15  4:24 ` [PATCH v2] " jamie.couture
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Jason @ 2012-11-15  0:57 UTC (permalink / raw)


On Thu, Nov 15, 2012 at 1:46 AM, Jamie Couture <jamie.couture at gmail.com> wrote:
> +CFLAGS += -g -Wall -Igit

The -g should only be added with a ?=, or something conditional on the
environment, so that distros don't have to patch it up to get a
release build.




^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] Makefile: improve dependency generation
  2012-11-15  0:57 ` Jason
@ 2012-11-15  3:40   ` jamie.couture
  2012-11-17 16:16     ` mathstuf
  0 siblings, 1 reply; 12+ messages in thread
From: jamie.couture @ 2012-11-15  3:40 UTC (permalink / raw)


rpmbuild will strip (debugging) symbols.  I'm not sure about deb packaging;
I'm also not sure about *bsd.  Regardless, I'll remove the append
condition, +=

CFLAGS = [default options]

Come to think of it, I'll need to move the FreeBSD uname stuff after cflags
definition anyway, and change it from conditional to append



On Wed, Nov 14, 2012 at 7:57 PM, Jason A. Donenfeld <Jason at zx2c4.com> wrote:

> On Thu, Nov 15, 2012 at 1:46 AM, Jamie Couture <jamie.couture at gmail.com>
> wrote:
> > +CFLAGS += -g -Wall -Igit
>
> The -g should only be added with a ?=, or something conditional on the
> environment, so that distros don't have to patch it up to get a
> release build.
>



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2] Makefile: improve dependency generation
  2012-11-15  0:46 [PATCH] Makefile: improve dependency generation jamie.couture
  2012-11-15  0:57 ` Jason
@ 2012-11-15  4:24 ` 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
  3 siblings, 1 reply; 12+ messages in thread
From: jamie.couture @ 2012-11-15  4:24 UTC (permalink / raw)


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





^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2] Makefile: improve dependency generation
  2012-11-15  4:24 ` [PATCH v2] " jamie.couture
@ 2012-11-15  4:30   ` jamie.couture
  0 siblings, 0 replies; 12+ messages in thread
From: jamie.couture @ 2012-11-15  4:30 UTC (permalink / raw)


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
>
>



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3] Makefile: improve dependency generation
  2012-11-15  0:46 [PATCH] Makefile: improve dependency generation jamie.couture
  2012-11-15  0:57 ` Jason
  2012-11-15  4:24 ` [PATCH v2] " jamie.couture
@ 2012-11-15  4:30 ` jamie.couture
  2012-11-15 23:48 ` [PATCH v4] " jamie.couture
  3 siblings, 0 replies; 12+ messages in thread
From: jamie.couture @ 2012-11-15  4:30 UTC (permalink / raw)


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 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





^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v4] Makefile: improve dependency generation
  2012-11-15  0:46 [PATCH] Makefile: improve dependency generation jamie.couture
                   ` (2 preceding siblings ...)
  2012-11-15  4:30 ` [PATCH v3] " jamie.couture
@ 2012-11-15 23:48 ` jamie.couture
  3 siblings, 0 replies; 12+ messages in thread
From: jamie.couture @ 2012-11-15 23:48 UTC (permalink / raw)


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..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





^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] Makefile: improve dependency generation
  2012-11-15  3:40   ` jamie.couture
@ 2012-11-17 16:16     ` mathstuf
  2012-11-17 16:17       ` Jason
  0 siblings, 1 reply; 12+ messages in thread
From: mathstuf @ 2012-11-17 16:16 UTC (permalink / raw)


On Thu, Nov 15, 2012 at 03:40:52 GMT, Jamie Couture wrote:
> rpmbuild will strip (debugging) symbols.  I'm not sure about deb packaging;
> I'm also not sure about *bsd.  Regardless, I'll remove the append
> condition, +=
>
> CFLAGS = [default options]

No, please keep the '+='. RPM (and other tools I imagine) set CFLAGS in
the environment and usually pass them to make as well for Makefile-only
projects and expect the build system to use those as well. Fedora passes
-O2, so it should still get a release build (with debugging
information).

--Ben





^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] Makefile: improve dependency generation
  2012-11-17 16:16     ` mathstuf
@ 2012-11-17 16:17       ` Jason
  2012-11-17 16:28         ` mathstuf
  0 siblings, 1 reply; 12+ messages in thread
From: Jason @ 2012-11-17 16:17 UTC (permalink / raw)


?=



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] Makefile: improve dependency generation
  2012-11-17 16:17       ` Jason
@ 2012-11-17 16:28         ` mathstuf
  2012-11-17 18:02           ` [PATCH v5] " jamie.couture
  0 siblings, 1 reply; 12+ messages in thread
From: mathstuf @ 2012-11-17 16:28 UTC (permalink / raw)


On Sat, Nov 17, 2012 at 17:17:36 +0100, Jason A. Donenfeld wrote:
> ?=

That's fine too.

--Ben




^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v5] Makefile: improve dependency generation
  2012-11-17 16:28         ` mathstuf
@ 2012-11-17 18:02           ` jamie.couture
  2012-11-17 18:37             ` Jason
  0 siblings, 1 reply; 12+ messages in thread
From: jamie.couture @ 2012-11-17 18:02 UTC (permalink / raw)


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





^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v5] Makefile: improve dependency generation
  2012-11-17 18:02           ` [PATCH v5] " jamie.couture
@ 2012-11-17 18:37             ` Jason
  0 siblings, 0 replies; 12+ messages in thread
From: Jason @ 2012-11-17 18:37 UTC (permalink / raw)


It's shaping up well. I've put it in a branch here:
http://git.zx2c4.com/cgit/commit/?h=jc/makefile

EXTRA_CFLAGS seems a bit silly with the present structure, but I'll give it
another look soon.



^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2012-11-17 18:37 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-11-15  0:46 [PATCH] Makefile: improve dependency generation 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           ` [PATCH v5] " jamie.couture
2012-11-17 18:37             ` 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

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).