chiark / gitweb /
Makefile: Support out-of-tree builds.
[preload-hacks] / Makefile
1 ### -*-makefile-*-
2 ###
3 ### Makefile for preload-hacks
4 ###
5 ### (c) 2008 Straylight/Edgeware
6 ###
7
8 ###----- Licensing notice ---------------------------------------------------
9 ###
10 ### This file is part of the preload-hacks package.
11 ###
12 ### Preload-hacks are free software; you can redistribute it and/or modify
13 ### them under the terms of the GNU General Public License as published by
14 ### the Free Software Foundation; either version 2 of the License, or (at
15 ### your option) any later version.
16 ###
17 ### Preload-hacks are distributed in the hope that it will be useful, but
18 ### WITHOUT ANY WARRANTY; without even the implied warranty of
19 ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
20 ### Public License for more details.
21 ###
22 ### You should have received a copy of the GNU General Public License along
23 ### with preload-hacks; if not, write to the Free Software Foundation, Inc.,
24 ### 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
26 srcdir                   = .
27 PACKAGE                  = preload-hacks
28 VERSION                 := $(shell cd $(srcdir) && ./auto-version)
29
30 VPATH                    = $(srcdir)
31 .SECONDEXPANSION: #sorry
32
33 ###--------------------------------------------------------------------------
34 ### Configuration.
35
36 ## Where to install things.
37 prefix                   = /usr/local
38 exec_prefix              = ${prefix}
39 bindir                   = ${exec_prefix}/bin
40 libdir                   = ${exec_prefix}/lib
41 datadir                  = ${prefix}/share
42 mandir                   = ${datadir}/man
43 man1dir                  = ${mandir}/man1
44
45 ## Private installation tree for packagers.
46 DESTDIR                  =
47
48 ###--------------------------------------------------------------------------
49 ### Build parameters.
50
51 ## Mess with these if you like.
52 CC                       = gcc
53 LD                       = gcc
54 CFLAGS                   = -O2 -g -Wall
55 LDFLAGS                  =
56 LDLIBS                   = -ldl
57 INSTALL                  = install
58 INST_BIN                 = $(INSTALL) -c -m755
59 INST_LIB                 = $(INSTALL) -c -m644
60 INST_MAN                 = $(INSTALL) -c -m644
61 INST_BIN                 = $(INSTALL) -c -m755
62 MKDIRS                   = $(INSTALL) -d -m755
63
64 ## Probably best if you leave these alone.
65 REAL_CFLAGS              = $(CFLAGS) -fPIC -MD
66 REAL_LDFLAGS             = $(LDFLAGS) -shared
67
68 ## Allow user overrides for this stuff.
69 -include config.mk
70
71 ###--------------------------------------------------------------------------
72 ### Quiet building.
73
74 ## Verbosity.
75 V                        = 0
76 v_tag                    = $(call v_tag_$V,$1)
77 v_tag_0                  = @printf "  %-8s %s\n" "$1" "$@";
78 V_AT                     = $(V_AT_$V)
79 V_AT_0                   = @
80
81 ###--------------------------------------------------------------------------
82 ### Main targets.
83
84 ## noip
85 HACKS                   += noip
86 noip_SOURCES             = noip.c
87
88 ## uopen
89 HACKS                   += uopen
90 uopen_SOURCES            = uopen.c
91
92 ## Sources.
93 ALL_SOURCES              = $(foreach h,$(HACKS),$($h_SOURCES))
94 DISTFILES               += $(ALL_SOURCES)
95
96 ## Libraries.
97 LIBS                    += $(addsuffix .so, $(HACKS))
98 TARGETS                 += $(LIBS)
99
100 ## Scripts.
101 SCRIPTS                  = $(HACKS)
102 TARGETS                 += $(SCRIPTS)
103 DISTFILES               += withlib.in
104
105 ## Manual pages.
106 MAN1                    += $(addsuffix .1, $(HACKS))
107 DISTFILES               += $(MAN1)
108
109 ###--------------------------------------------------------------------------
110 ### Distribution arrangements.
111
112 ## Names.
113 distdir                  = $(PACKAGE)-$(VERSION)
114 DISTTAR                  = $(distdir).tar.gz
115
116 ## Distribute the build utilities.
117 DISTFILES               += Makefile
118 DISTFILES               += auto-version
119
120 ## Documentation.
121 DISTFILES               += README
122
123 ## Licensing.
124 DISTFILES               += COPYING
125
126 ## Debian.
127 debpkg                   = noip uopen
128 DISTFILES               += debian/changelog debian/copyright
129 DISTFILES               += debian/control debian/rules debian/compat
130 DISTFILES               += debian/source/format
131 DISTFILES               += $(patsubst %, debian/%.install, $(debpkg))
132 DISTFILES               += $(patsubst %, debian/%.lintian-overrides, \
133                                 $(debpkg))
134
135 ###--------------------------------------------------------------------------
136 ### Building.
137
138 all:: $(TARGETS)
139 .PHONY: ALL
140
141 CLEAN                   += $(TARGETS)
142 CLEAN                   += *.o *.d
143 clean::
144         rm -f $(CLEAN)
145 .PHONY: clean
146
147 ## Building sources.
148 %.o: %.c
149         $(call v_tag,CC)$(CC) -c $(REAL_CFLAGS) $< -o $@
150
151 ## Constructing preload hacks.
152 $(addsuffix .so,$(HACKS)): %.so: $$(patsubst %.c,%.o,$$($$*_SOURCES))
153         $(call v_tag,LD)$(LD) $(REAL_LDFLAGS) $< $(LDLIBS) -o $@
154
155 ## Constructing the scripts.
156 $(SCRIPTS): %: withlib.in
157         $(call v_tag,GEN)sed "s/@lib@/$@/" $(srcdir)/withlib.in >$@.new && \
158                 chmod +x $@.new && mv $@.new $@
159
160 -include $(patsubst %.c,%d,$(ALL_SOURCES))
161
162 ###--------------------------------------------------------------------------
163 ### Installation.
164
165 install: all
166         $(MKDIRS) $(DESTDIR)$(bindir)
167         $(INST_BIN) $(SCRIPTS) $(DESTDIR)$(bindir)
168         $(MKDIRS) $(DESTDIR)$(libdir)
169         $(INST_BIN) $(LIBS) $(DESTDIR)$(libdir)
170         $(MKDIRS) $(DESTDIR)$(man1dir)
171         $(INST_MAN) $(addprefix $(srcdir)/,$(MAN1)) $(DESTDIR)$(man1dir)
172 .PHONY: install
173
174 uninstall:
175         rm -f $(addprefix $(DESTDIR)$(libdir)/, $(LIBS))
176         rm -f $(addprefix $(DESTDIR)$(bindir)/, $(SCRIPTS))
177         rm -f $(addprefix $(DESTDIR)$(man1dir)/, $(MAN1))
178 .PHONY: uninstall
179
180 ###--------------------------------------------------------------------------
181 ### Distribution.
182
183 distdir:
184         rm -rf $(distdir)
185         mkdir $(distdir)
186         echo $(VERSION) >$(distdir)/RELEASE
187         for i in $(DISTFILES); do \
188           case "$$i" in \
189             */*) \
190               d=$${i%/*} && $(MKDIRS) $(distdir)/$$d || exit 1 \
191               ;; \
192           esac; \
193           cp $(srcdir)/$$i $(distdir)/$$i || exit 1; \
194         done
195 .PHONY: distdir
196
197 dist: distdir
198         tar chozf $(DISTTAR) $(distdir)
199         rm -rf $(distdir)
200 .PHONY: dist
201
202 distcheck: dist
203         rm -rf _distcheck
204         mkdir _distcheck
205         +cd _distcheck && \
206         tar xvfz ../$(DISTTAR) && \
207         mkdir _build && cd _build && \
208         make -f../$(distdir)/Makefile srcdir=../$(distdir) && \
209         make -f../$(distdir)/Makefile srcdir=../$(distdir) \
210                 install DESTDIR=../_install && \
211         make -f../$(distdir)/Makefile srcdir=../$(distdir) dist
212         rm -rf _distcheck
213
214 ###----- That's all, folks --------------------------------------------------