Makefile: Support out-of-tree builds.
[preload-hacks] / Makefile
index 781b35a..b77af1d 100644 (file)
--- a/Makefile
+++ b/Makefile
 ### the Free Software Foundation; either version 2 of the License, or (at
 ### your option) any later version.
 ###
-### Preload-hacks distributed in the hope that it will be useful, but WITHOUT
-### ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-### FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-### more details.
+### Preload-hacks are distributed in the hope that it will be useful, but
+### WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
+### Public License for more details.
 ###
 ### You should have received a copy of the GNU General Public License along
-### with mLib; if not, write to the Free Software Foundation, Inc., 59 Temple
-### Place - Suite 330, Boston, MA 02111-1307, USA.
+### with preload-hacks; if not, write to the Free Software Foundation, Inc.,
+### 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+srcdir                  = .
 PACKAGE                         = preload-hacks
-VERSION                        := $(shell ./auto-version)
+VERSION                        := $(shell cd $(srcdir) && ./auto-version)
+
+VPATH                   = $(srcdir)
+.SECONDEXPANSION: #sorry
 
 ###--------------------------------------------------------------------------
 ### Configuration.
@@ -42,24 +46,6 @@ man1dir                       = ${mandir}/man1
 DESTDIR                         =
 
 ###--------------------------------------------------------------------------
-### Quiet building.
-
-## Verbosity.
-V                       = 0
-
-## Compilation.
-V_CC                    = $(V_CC_$(V))$(CC)
-V_CC_0                  = @echo "  CC     $@";
-
-## Linking.
-V_LD                    = $(V_LD_$(V))$(LD)
-V_LD_0                  = @echo "  LD     $@";
-
-## Generation.
-V_GEN                   = $(V_GEN_$(V))
-V_GEN_0                         = @echo "  GEN    $@";
-
-###--------------------------------------------------------------------------
 ### Build parameters.
 
 ## Mess with these if you like.
@@ -76,21 +62,36 @@ INST_BIN             = $(INSTALL) -c -m755
 MKDIRS                  = $(INSTALL) -d -m755
 
 ## Probably best if you leave these alone.
-REAL_CFLAGS             = $(CFLAGS) -fPIC
+REAL_CFLAGS             = $(CFLAGS) -fPIC -MD
 REAL_LDFLAGS            = $(LDFLAGS) -shared
 
+## Allow user overrides for this stuff.
+-include config.mk
+
+###--------------------------------------------------------------------------
+### Quiet building.
+
+## Verbosity.
+V                       = 0
+v_tag                   = $(call v_tag_$V,$1)
+v_tag_0                         = @printf "  %-8s %s\n" "$1" "$@";
+V_AT                    = $(V_AT_$V)
+V_AT_0                  = @
+
 ###--------------------------------------------------------------------------
 ### Main targets.
 
 ## noip
 HACKS                  += noip
-NOIP_SOURCES            = noip.c
-DISTFILES              += $(NOIP_SOURCES)
+noip_SOURCES            = noip.c
 
 ## uopen
 HACKS                  += uopen
-UOPEN_SOURCES           = uopen.c
-DISTFILES              += $(UOPEN_SOURCES)
+uopen_SOURCES           = uopen.c
+
+## Sources.
+ALL_SOURCES             = $(foreach h,$(HACKS),$($h_SOURCES))
+DISTFILES              += $(ALL_SOURCES)
 
 ## Libraries.
 LIBS                   += $(addsuffix .so, $(HACKS))
@@ -126,6 +127,7 @@ DISTFILES           += COPYING
 debpkg                  = noip uopen
 DISTFILES              += debian/changelog debian/copyright
 DISTFILES              += debian/control debian/rules debian/compat
+DISTFILES              += debian/source/format
 DISTFILES              += $(patsubst %, debian/%.install, $(debpkg))
 DISTFILES              += $(patsubst %, debian/%.lintian-overrides, \
                                $(debpkg))
@@ -133,28 +135,30 @@ DISTFILES         += $(patsubst %, debian/%.lintian-overrides, \
 ###--------------------------------------------------------------------------
 ### Building.
 
-all: $(TARGETS)
+all:: $(TARGETS)
 .PHONY: ALL
 
-clean:
-       rm -f *.o $(TARGETS)
+CLEAN                  += $(TARGETS)
+CLEAN                  += *.o *.d
+clean::
+       rm -f $(CLEAN)
 .PHONY: clean
 
 ## Building sources.
 %.o: %.c
-       $(V_CC) -c $(REAL_CFLAGS) $< -o $@
+       $(call v_tag,CC)$(CC) -c $(REAL_CFLAGS) $< -o $@
 
 ## Constructing preload hacks.
-noip.so: $(patsubst %.c, %.o, $(NOIP_SOURCES))
-       $(V_LD) $(REAL_LDFLAGS) $< $(LDLIBS) -o $@
-uopen.so: $(patsubst %.c, %.o, $(UOPEN_SOURCES))
-       $(V_LD) $(REAL_LDFLAGS) $< $(LDLIBS) -o $@
+$(addsuffix .so,$(HACKS)): %.so: $$(patsubst %.c,%.o,$$($$*_SOURCES))
+       $(call v_tag,LD)$(LD) $(REAL_LDFLAGS) $< $(LDLIBS) -o $@
 
 ## Constructing the scripts.
 $(SCRIPTS): %: withlib.in
-       $(V_GEN)sed "s/@lib@/$@/" withlib.in >$@.new && \
+       $(call v_tag,GEN)sed "s/@lib@/$@/" $(srcdir)/withlib.in >$@.new && \
                chmod +x $@.new && mv $@.new $@
 
+-include $(patsubst %.c,%d,$(ALL_SOURCES))
+
 ###--------------------------------------------------------------------------
 ### Installation.
 
@@ -164,7 +168,7 @@ install: all
        $(MKDIRS) $(DESTDIR)$(libdir)
        $(INST_BIN) $(LIBS) $(DESTDIR)$(libdir)
        $(MKDIRS) $(DESTDIR)$(man1dir)
-       $(INST_MAN) $(MAN1) $(DESTDIR)$(man1dir)
+       $(INST_MAN) $(addprefix $(srcdir)/,$(MAN1)) $(DESTDIR)$(man1dir)
 .PHONY: install
 
 uninstall:
@@ -186,7 +190,7 @@ distdir:
              d=$${i%/*} && $(MKDIRS) $(distdir)/$$d || exit 1 \
              ;; \
          esac; \
-         ln $$i $(distdir)/$$i || exit 1; \
+         cp $(srcdir)/$$i $(distdir)/$$i || exit 1; \
        done
 .PHONY: distdir
 
@@ -198,12 +202,13 @@ dist: distdir
 distcheck: dist
        rm -rf _distcheck
        mkdir _distcheck
-       cd _distcheck && \
+       +cd _distcheck && \
        tar xvfz ../$(DISTTAR) && \
-       cd $(distdir) && \
-       make && \
-       make install DESTDIR=../_install && \
-       make dist
+       mkdir _build && cd _build && \
+       make -f../$(distdir)/Makefile srcdir=../$(distdir) && \
+       make -f../$(distdir)/Makefile srcdir=../$(distdir) \
+               install DESTDIR=../_install && \
+       make -f../$(distdir)/Makefile srcdir=../$(distdir) dist
        rm -rf _distcheck
 
 ###----- That's all, folks --------------------------------------------------