build: Create ascii signature.
[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
246 .tarball-version:
247         echo $(COMMIT) > $@
248
249 GIT_ARCHIVE_HEAD:=git archive HEAD --
250 GIT_LS_FILES:=git ls-files
251 ifeq ($(wildcard .git),)
252 GIT_ARCHIVE_HEAD:=tar -cf-
253 GIT_LS_FILES:=find
254 endif
255
256 dist: $(TARBALL)
257
258 sign: $(TARBALL)
259         gpg -a --output $(TARBALL).sig --detach-sig $(TARBALL)
260         git checkout ChangeLog
261
262 tree-clean-p:
263         test ! -d .git || git diff --exit-code > /dev/null
264         test ! -d .git || git diff --cached --exit-code > /dev/null
265         @echo commit:$(COMMIT)
266
267 generate-ChangeLog:
268         $(PERL) ${srcdest}build-aux/gitlog-to-changelog --srcdir=${srcdir} > $@
269         cat ChangeLog >> generate-ChangeLog
270         mv generate-ChangeLog ChangeLog
271
272 $(TARBALL): .tarball-version | generate-ChangeLog
273         ($(GIT_LS_FILES)\
274             --exclude=$(TARBALL_DIR);\
275             echo $^ | tr ' ' '\n')\
276             | GZIP=-n tar --sort=name --mtime=@0 --owner=0 --group=0 --numeric-owner\
277             --transform=s,^,$(TARBALL_DIR)/,S -T- -czf $@
278         git checkout ChangeLog
279
280 ifdef GUIX
281 update-hash: $(TARBALL)
282         $(GUIX) download file://$(PWD)/$<
283         sed -i -e 's,(base32 #!mes!# "[^"]*"),(base32 #!mes!# "$(shell $(GUIX) hash $<)"),' guix/git/mes.scm
284
285 else
286 $(warning update-hash: no guix)
287 endif
288
289 tag:
290         git tag -s v$(VERSION) -m "GNU Mes $(VERSION)."
291
292 # Release process
293 #  0. doc: Release update, Release commit, test guix bootstrap
294 #  1. make tag
295 #  2. make dist
296 #  3. make release
297
298 guix-build:
299         ./pre-inst-env $(GUIX) build mes@$(VERSION) --with-source=$(TARBALL)
300
301 release: update-hash | gen-announce guix-build
302
303 GPG_KEY_ID:=1A858392E331EAFDB8C27FFBF3C1A0D9C1D65273
304 gen-announce:
305         ../gnulib/build-aux/announce-gen\
306             --release-type=beta\
307             --package-name=mes\
308             --previous-version='0.18 '\
309             --current-version=$(VERSION)\
310             --gpg-key-id=$(GPG_KEY_ID)\
311             --url-directory=https://ftp.gnu.org/gnu/mes\
312             --news=NEWS\
313             > doc/announce/ANNOUNCE-$(VERSION)-
314
315 installdirs: mkinstalldirs
316         mkdir -p\
317             $(DESTDIR)$(bindir)\
318             $(DESTDIR)$(datadir)\
319             $(DESTDIR)$(libdir)\
320             $(DESTDIR)$(infodir)\
321             $(DESTDIR)$(mandir)
322
323 install-dvi: dvi
324         mkdir -p $(DESTDIR)${docdir}
325         cp doc/mes.dvi $(DESTDIR)${docdir}
326
327 install-html: html
328         mkdir -p $(DESTDIR)${docdir}
329         tar -cf- -C doc html | tar -xf- -C $(DESTDIR)${docdir}
330
331 install-pdf: pdf
332         mkdir -p $(DESTDIR)${docdir}
333         cp doc/mes.pdf $(DESTDIR)${docdir}
334
335 install-ps: ps
336         mkdir -p $(DESTDIR)${docdir}
337         cp doc/mes.ps $(DESTDIR)${docdir}
338
339 # We do not strip binaries, binutils' strip corrupts M1+hex2-generated ELFs
340 install-strip: install
341
342
343 define HELP_TOP
344 Usage: make [OPTION]... [TARGET]...
345
346 Main and non-standard targets:
347   all             update everything
348   all-go          update .go files
349   dist            update $(TARBALL)
350   doc             update documentation
351   check           run unit tests
352   clean           run git clean -dfx
353   clean-go        clean .go files
354   info            update info documentation
355   install         install in $(prefix)
356   install-info    install info docs in $(prefix)/share/info
357   release         dist and tag
358   uninstall       uninstall from $(prefix)
359 endef
360 export HELP_TOP
361 help:
362         @echo "$$HELP_TOP"
363
364 include ${srcdest}build-aux/export.make