From mboxrd@z Thu Jan 1 00:00:00 1970 From: jamie.couture at gmail.com (Jamie Couture) Date: Wed, 14 Nov 2012 23:30:23 -0500 Subject: [PATCH v2] Makefile: improve dependency generation In-Reply-To: <1352953477-1354-1-git-send-email-jamie.couture@gmail.com> References: <1352940385-26357-1-git-send-email-jamie.couture@gmail.com> <1352953477-1354-1-git-send-email-jamie.couture@gmail.com> Message-ID: ugh. typos in commit message. I'll send an amended one. On Wed, Nov 14, 2012 at 11:24 PM, Jamie Couture 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 > --- > 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 > >