build: Better and friendlier tarball.
[mes.git] / build-aux / GNUmakefile.in
1 # GNU Mes --- Maxwell Equations of Software
2 # Copyright © 2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
3 #
4 # This file is part of GNU Mes.
5 #
6 # GNU Mes is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 3 of the License, or (at
9 # your option) any later version.
10 #
11 # GNU Mes is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
18
19 SHELL=@BASH@
20 srcdest=@srcdest@
21 srcdir=@srcdir@
22 abs_top_srcdir=@abs_top_srcdir@
23 abs_top_builddir=@abs_top_builddir@
24
25 GUILE_FLAGS:=--no-auto-compile -L . -L module -C . -C module
26
27 cleaning-p:=$(filter clean%, $(MAKECMDGOALS))$(filter %clean, $(MAKECMDGOALS))
28
29 ifndef cleaning-p
30 include .config.make
31 ifneq ($(prefix),)
32 prefix-arg=--prefix=$(prefix)
33 endif
34 ifneq ($(build),)
35 build-arg=--build=$(build)
36 endif
37 ifneq ($(host),)
38 host-arg=--host=$(host)
39 endif
40 ifeq ($(mes_libc),system)
41 --with-system-libc=system
42 endif
43 .config.make:
44         ${srcdir}/configure $(prefix_arg) $(host-arg) $(build-arg) $(with-system-libc)
45 endif
46
47 PHONY_TARGETS:=\
48  TAGS\
49  all-go\
50  all\
51  build\
52  check\
53  clean-go\
54  clean\
55  default\
56  dist\
57  distclean\
58  doc\
59  dvi\
60  gcc\
61  generate-ChangeLog\
62  help\
63  html\
64  info\
65  install-dvi\
66  install-html\
67  install-pdf\
68  install-ps\
69  install-strip\
70  install\
71  installcheck\
72  installdirs\
73  maintainer-clean\
74  man\
75  mes-gcc\
76  mes-tcc\
77  mes\
78  mostlyclean\
79  pdf\
80  ps\
81  sign\
82  uninstall\
83  web\
84 #
85
86 .PHONY: $(PHONY_TARGETS)
87
88 default: all
89
90 all: doc
91
92 doc: build
93
94 build:
95         $(SHELL) build.sh
96
97 src/${program_prefix}mes: build
98
99 clean:
100         git clean -dfx\
101             -e .config.make\
102             -e config.sh\
103             -e GNUmakefile\
104             -e build.sh\
105             -e check.sh\
106             -e install.sh\
107             -e uninstall.sh\
108             -e pre-inst-env\
109             -e scripts/mescc\
110
111 #
112
113 # Mes does not cache anything on the file system; therefore clean
114 distclean:
115         git clean -dfX
116
117 mostlyclean: clean
118
119 maintainer-clean:
120         git clean -dfx
121
122 TAGS:
123         etags ${srcdest}lib/*.c ${srcdest}lib/*/*.c ${srcdest}src/*.c ${srcdest}include/*.h ${srcdest}include/sys/*.h
124
125 all-go:
126         ${srcdest}build-aux/build-guile.sh
127
128 clean-go:
129         rm -f $(shell find . -name '*.go')
130
131 check:
132         $(SHELL) check.sh
133
134 check-mescc:
135         $(SHELL) pre-inst-env build-aux/check-mescc.sh
136
137 # Mes does not feature post-install checks yet, so we're great!
138 installcheck:
139         true
140
141 install:
142         $(SHELL) install.sh
143
144 uninstall:
145         $(SHELL) uninstall.sh
146
147 doc/version.texi: ${srcdest}doc/mes.texi GNUmakefile
148         @mkdir -p $(@D)
149         (set `LANG= date -r $< +'%d %B %Y'`;\
150         echo "@set UPDATED $$1 $$2 $$3"; \
151         echo "@set UPDATED-MONTH $$2 $$3"; \
152         echo "@set EDITION $(VERSION)"; \
153         echo "@set VERSION $(VERSION)") > $@
154
155 doc: doc/version.texi
156 ifdef MAKEINFO
157 doc: info
158 else
159 $(warning skipping info: no makeinfo)
160 endif
161
162 ifdef HELP2MAN
163 doc: man
164 else
165 $(warning skipping man: no help2man)
166 endif
167
168 info: doc/mes.info
169
170 doc/mes.info: ${srcdest}doc/mes.texi doc/version.texi ${srcdest}doc/images/gcc-mesboot-graph.png GNUmakefile
171         $(MAKEINFO) -o $@ -I doc -I doc $<
172
173 doc/images/%.eps: ${srcdest}doc/images/%.dot
174 ifdef DOT
175         $(DOT) -T eps $< > $@
176 else
177         touch $@
178 endif
179
180 doc/images/%.pdf: ${srcdest}doc/images/%.dot
181 ifdef DOT
182         $(DOT) -T pdf $< > $@
183 else
184         touch $@
185 endif
186
187 doc/images/%.png: ${srcdest}doc/images/%.dot
188 ifdef DOT
189         $(DOT) -T png $< > $@
190 else
191         touch $@
192 $(warning info: graphvis missing: no images)
193 endif
194
195 man: doc/mes.1 doc/mescc.1
196
197 # disable builtin-rules
198 %.o: %.s
199 %.s: %.S
200 %.o: %.S
201 %.o: %.c
202 %: %.S
203 %: %.o
204 %: %.c
205
206 doc/mes.1: src/${program_prefix}mes | build
207         MES_ARENA=10000000 ./pre-inst-env $(HELP2MAN) $(<F) > $@
208
209 doc/mescc.1: scripts/mescc src/${program_prefix}mes | build
210         MES_ARENA=10000000 ./pre-inst-env $(HELP2MAN) $(<F) > $@
211
212 html: doc/html/index.html
213
214 doc/html/index.html: ${srcdest}doc/mes.texi doc/version.texi doc/images/gcc-mesboot-graph.png
215         $(MAKEINFO) --html -o $(@D) -I ${srcdest}doc -I doc $<
216
217 dvi: doc/mes.dvi
218
219 doc/mes.dvi: ${srcdest}doc/mes.texi
220         $(MAKEINFO) --dvi -I ${srcdest}doc -I doc -o doc/mes.dvi $<
221
222 pdf: doc/mes.pdf
223
224 doc/mes.pdf: ${srcdest}doc/mes.texi
225         $(MAKEINFO) --pdf -I ${srcdest}doc -I doc -o doc/mes.pdf $<
226
227 ps: doc/mes.ps
228
229 doc/mes.ps: ${srcdest}doc/mes.texi
230         $(MAKEINFO) --ps -I ${srcdest}doc -I doc -o doc/mes.ps $<
231
232 WEB_IMAGES:=\
233  doc/images/gcc-mesboot-graph.eps\
234  doc/images/gcc-mesboot-graph.pdf\
235  doc/images/gcc-mesboot-graph.png
236
237 web: info $(WEB_IMAGES)
238         GENDOCS_TEMPLATE_DIR=doc build-aux/gendocs.sh -I doc -s ${srcdest}doc/mes.texi -o doc/web/manual --email bug-mes@gnu.org mes "GNU Mes manual"
239
240 ### \f dist
241 COMMIT=$(shell test -e ${srcdest}.git && (cd ${srcdir} && git describe --dirty 2>/dev/null) || cat ${srcdest}.tarball-version)
242 TARBALL_VERSION=$(COMMIT:v%=%)
243 TARBALL_DIR:=$(PACKAGE)-$(TARBALL_VERSION)
244 TARBALL:=$(TARBALL_DIR).tar.gz
245 # Be friendly to Debian; avoid using EPOCH
246 MTIME=$(shell git show HEAD --format=%ct --no-patch 2>/dev/null)
247 # Reproducible tarball
248 TAR_FLAGS=--sort=name --mtime=@$(MTIME) --owner=0 --group=0 --numeric-owner --mode=go=rX,u+rw,a-s
249
250 .tarball-version:
251         echo $(COMMIT) > $@
252
253 GIT_ARCHIVE_HEAD:=git archive HEAD --
254 GIT_LS_FILES:=git ls-files
255 ifeq ($(wildcard .git),)
256 GIT_ARCHIVE_HEAD:=tar -cf-
257 GIT_LS_FILES:=find
258 MTIME:=0
259 endif
260
261 dist: $(TARBALL)
262
263 sign: $(TARBALL)
264         gpg -a --output $(TARBALL).sig --detach-sig $(TARBALL)
265         git checkout ChangeLog
266
267 tree-clean-p:
268         test ! -d .git || git diff --exit-code > /dev/null
269         test ! -d .git || git diff --cached --exit-code > /dev/null
270         @echo commit:$(COMMIT)
271
272 generate-ChangeLog:
273         $(PERL) ${srcdest}build-aux/gitlog-to-changelog --srcdir=${srcdir} > $@
274         cat ChangeLog >> generate-ChangeLog
275         mv generate-ChangeLog ChangeLog
276
277 $(TARBALL): .tarball-version | generate-ChangeLog
278         ($(GIT_LS_FILES)                                \
279             --exclude=$(TARBALL_DIR);                   \
280             echo $^ | tr ' ' '\n')                      \
281             | tar $(TAR_FLAGS)                          \
282             --transform=s,^,$(TARBALL_DIR)/,S -T- -cf-  \
283             | gzip -c --no-name > $@
284         git checkout ChangeLog
285
286 ifdef GUIX
287 update-hash: $(TARBALL)
288         $(GUIX) download file://$(PWD)/$<
289         sed -i -e 's,(base32 #!mes!# "[^"]*"),(base32 #!mes!# "$(shell $(GUIX) hash $<)"),' guix/git/mes.scm
290
291 else
292 $(warning update-hash: no guix)
293 endif
294
295 tag:
296         git tag -s v$(VERSION) -m "GNU Mes $(VERSION)."
297
298 # Release process
299 #  0. doc: Release update, Release commit, test guix bootstrap
300 #  1. make tag
301 #  2. make dist
302 #  3. make release
303
304 guix-build:
305         ./pre-inst-env $(GUIX) build mes@$(VERSION) --with-source=$(TARBALL)
306
307 release: update-hash | gen-announce guix-build
308
309 GPG_KEY_ID:=1A858392E331EAFDB8C27FFBF3C1A0D9C1D65273
310 GEN_ANNOUNCE=$(GNULIB)/build-aux/announce-gen
311 GNULIB=../../gnulib
312 gen-announce:
313         $(GEN_ANNOUNCE)\
314             --release-type=beta\
315             --package-name=mes\
316             --previous-version='0.19 '\
317             --current-version=$(VERSION)\
318             --gpg-key-id=$(GPG_KEY_ID)\
319             --url-directory=https://ftp.gnu.org/gnu/mes\
320             --news=NEWS\
321             > doc/announce/ANNOUNCE-$(VERSION)-
322
323 installdirs: mkinstalldirs
324         mkdir -p\
325             $(DESTDIR)$(bindir)\
326             $(DESTDIR)$(datadir)\
327             $(DESTDIR)$(libdir)\
328             $(DESTDIR)$(infodir)\
329             $(DESTDIR)$(mandir)
330
331 install-dvi: dvi
332         mkdir -p $(DESTDIR)${docdir}
333         cp doc/mes.dvi $(DESTDIR)${docdir}
334
335 install-html: html
336         mkdir -p $(DESTDIR)${docdir}
337         tar -cf- -C doc html | tar -xf- -C $(DESTDIR)${docdir}
338
339 install-pdf: pdf
340         mkdir -p $(DESTDIR)${docdir}
341         cp doc/mes.pdf $(DESTDIR)${docdir}
342
343 install-ps: ps
344         mkdir -p $(DESTDIR)${docdir}
345         cp doc/mes.ps $(DESTDIR)${docdir}
346
347 # We do not strip binaries, binutils' strip corrupts M1+hex2-generated ELFs
348 install-strip: install
349
350
351 define HELP_TOP
352 Usage: make [OPTION]... [TARGET]...
353
354 Main and non-standard targets:
355   all             update everything
356   all-go          update .go files
357   dist            update $(TARBALL)
358   doc             update documentation
359   check           run unit tests
360   clean           run git clean -dfx
361   clean-go        clean .go files
362   info            update info documentation
363   install         install in $(prefix)
364   install-info    install info docs in $(prefix)/share/info
365   release         dist and tag
366   uninstall       uninstall from $(prefix)
367 endef
368 export HELP_TOP
369 help:
370         @echo "$$HELP_TOP"
371
372 include ${srcdest}build-aux/export.make