1cfad1c634f9a97c376c765850307a711366b92a
[mes.git] / build-aux / GNUmakefile.in
1 # GNU Mes --- Maxwell Equations of Software
2 # Copyright © 2018 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 .config.make:
32         ${srcdir}/configure --prefix=$(prefix)
33 endif
34
35 PHONY_TARGETS:=\
36  TAGS\
37  all-go\
38  all\
39  build\
40  check\
41  clean-go\
42  clean\
43  default\
44  dist\
45  distclean\
46  doc\
47  dvi\
48  gcc\
49  generate-ChangeLog\
50  help\
51  html\
52  info\
53  install-dvi\
54  install-html\
55  install-pdf\
56  install-ps\
57  install-strip\
58  install\
59  installcheck\
60  installdirs\
61  maintainer-clean\
62  man\
63  mes-gcc\
64  mes-tcc\
65  mes\
66  mostlyclean\
67  pdf\
68  ps\
69  sign\
70  uninstall\
71  web\
72 #
73
74 .PHONY: $(PHONY_TARGETS)
75
76 default: all
77
78 all: doc
79
80 doc: build
81
82 build:
83         ./build.sh
84
85 src/${program_prefix}mes: build
86
87 clean:
88         git clean -dfx\
89             -e .config.make\
90             -e config.sh\
91             -e GNUmakefile\
92             -e build.sh\
93             -e check.sh\
94             -e install.sh\
95             -e uninstall.sh\
96             -e pre-inst-env\
97             -e scripts/mescc\
98
99 #
100
101 # Mes does not cache anything on the file system; therefore clean
102 distclean:
103         git clean -dfX
104
105 mostlyclean: clean
106
107 maintainer-clean:
108         git clean -dfx
109
110 TAGS:
111         etags ${srcdest}lib/*.c ${srcdest}lib/*/*.c ${srcdest}src/*.c ${srcdest}include/*.h ${srcdest}include/sys/*.h
112
113 all-go:
114         ${srcdest}build-aux/build-guile.sh
115
116 clean-go:
117         rm -f $(shell find . -name '*.go')
118
119 check:
120         ./check.sh
121
122 check-mescc:
123         ./pre-inst-env build-aux/check-mescc.sh
124
125 # Mes does not feature post-install checks yet, so we're great!
126 installcheck:
127         true
128
129 install:
130         ./install.sh
131
132 uninstall:
133         ./uninstall.sh
134
135 doc/version.texi: ${srcdest}doc/mes.texi GNUmakefile
136         @mkdir -p $(@D)
137         (set `LANG= date -r $< +'%d %B %Y'`;\
138         echo "@set UPDATED $$1 $$2 $$3"; \
139         echo "@set UPDATED-MONTH $$2 $$3"; \
140         echo "@set EDITION $(VERSION)"; \
141         echo "@set VERSION $(VERSION)") > $@
142
143 doc: doc/version.texi
144 ifdef MAKEINFO
145 doc: info
146 else
147 $(warning skipping info: no makeinfo)
148 endif
149
150 ifdef HELP2MAN
151 doc: man
152 else
153 $(warning skipping man: no help2man)
154 endif
155
156 info: doc/mes.info
157
158 doc/mes.info: ${srcdest}doc/mes.texi doc/version.texi ${srcdest}doc/images/gcc-mesboot-graph.png GNUmakefile
159         $(MAKEINFO) -o $@ -I doc -I doc $<
160
161 doc/images/%.eps: ${srcdest}doc/images/%.dot
162 ifdef DOT
163         $(DOT) -T eps $< > $@
164 else
165         touch $@
166 endif
167
168 doc/images/%.pdf: ${srcdest}doc/images/%.dot
169 ifdef DOT
170         $(DOT) -T pdf $< > $@
171 else
172         touch $@
173 endif
174
175 doc/images/%.png: ${srcdest}doc/images/%.dot
176 ifdef DOT
177         $(DOT) -T png $< > $@
178 else
179         touch $@
180 $(warning info: graphvis missing: no images)
181 endif
182
183 man: doc/mes.1 doc/mescc.1
184
185 # disable builtin-rules
186 %.o: %.s
187 %.s: %.S
188 %.o: %.S
189 %.o: %.c
190 %: %.S
191 %: %.o
192 %: %.c
193
194 doc/mes.1: src/${program_prefix}mes | build
195         MES_ARENA=10000000 ./pre-inst-env $(HELP2MAN) $(<F) > $@
196
197 doc/mescc.1: scripts/mescc src/${program_prefix}mes | build
198         MES_ARENA=10000000 ./pre-inst-env $(HELP2MAN) $(<F) > $@
199
200 html: doc/html/index.html
201
202 doc/html/index.html: ${srcdest}doc/mes.texi doc/version.texi doc/images/gcc-mesboot-graph.png
203         $(MAKEINFO) --html -o $(@D) -I ${srcdest}doc -I doc $<
204
205 dvi: doc/mes.dvi
206
207 doc/mes.dvi: ${srcdest}doc/mes.texi
208         $(MAKEINFO) --dvi -I ${srcdest}doc -I doc -o doc/mes.dvi $<
209
210 pdf: doc/mes.pdf
211
212 doc/mes.pdf: ${srcdest}doc/mes.texi
213         $(MAKEINFO) --pdf -I ${srcdest}doc -I doc -o doc/mes.pdf $<
214
215 ps: doc/mes.ps
216
217 doc/mes.ps: ${srcdest}doc/mes.texi
218         $(MAKEINFO) --ps -I ${srcdest}doc -I doc -o doc/mes.ps $<
219
220 WEB_IMAGES:=\
221  doc/images/gcc-mesboot-graph.eps\
222  doc/images/gcc-mesboot-graph.pdf\
223  doc/images/gcc-mesboot-graph.png
224
225 web: info $(WEB_IMAGES)
226         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"
227
228 ### \f dist
229 COMMIT=$(shell test -e ${srcdest}.git && (cd ${srcdir} && git describe --dirty 2>/dev/null) || cat ${srcdest}.tarball-version)
230 TARBALL_VERSION=$(COMMIT:v%=%)
231 TARBALL_DIR:=$(PACKAGE)-$(TARBALL_VERSION)
232 TARBALL:=$(TARBALL_DIR).tar.gz
233
234 .tarball-version:
235         echo $(COMMIT) > $@
236
237 GIT_ARCHIVE_HEAD:=git archive HEAD --
238 GIT_LS_FILES:=git ls-files
239 ifeq ($(wildcard .git),)
240 GIT_ARCHIVE_HEAD:=tar -cf-
241 GIT_LS_FILES:=find
242 endif
243
244 dist: $(TARBALL)
245
246 sign: $(TARBALL)
247         gpg --detach-sign $<
248
249 tree-clean-p:
250         test ! -d .git || git diff --exit-code > /dev/null
251         test ! -d .git || git diff --cached --exit-code > /dev/null
252         @echo commit:$(COMMIT)
253
254 generate-ChangeLog:
255         $(PERL) ${srcdest}build-aux/gitlog-to-changelog --srcdir=${srcdir} > $@
256         cat ChangeLog >> generate-ChangeLog
257         mv generate-ChangeLog ChangeLog
258
259 $(TARBALL): .tarball-version | generate-ChangeLog
260         ($(GIT_LS_FILES)\
261             --exclude=$(TARBALL_DIR);\
262             echo $^ | tr ' ' '\n')\
263             | GZIP=-n tar --sort=name --mtime=@0 --owner=0 --group=0 --numeric-owner\
264             --transform=s,^,$(TARBALL_DIR)/,S -T- -czf $@
265         git checkout ChangeLog
266
267 ifdef GUIX
268 update-hash: $(TARBALL)
269         $(GUIX) download file://$(PWD)/$<
270         sed -i -e 's,(base32 #!mes!# "[^"]*"),(base32 #!mes!# "$(shell $(GUIX) hash $<)"),' guix/git/mes.scm
271
272 else
273 $(warning update-hash: no guix)
274 endif
275
276 tag:
277         git tag -s v$(VERSION) -m "GNU Mes $(VERSION)."
278
279 # Release process
280 #  0. doc: Release update, Release commit, test guix bootstrap
281 #  1. make tag
282 #  2. make dist
283 #  3. make release
284
285 guix-build:
286         ./pre-inst-env $(GUIX) build mes@$(VERSION) --with-source=$(TARBALL)
287
288 release: update-hash | gen-announce guix-build
289
290 GPG_KEY_ID:=1A858392E331EAFDB8C27FFBF3C1A0D9C1D65273
291 gen-announce:
292         ../gnulib/build-aux/announce-gen\
293             --release-type=beta\
294             --package-name=mes\
295             --previous-version='0.18 '\
296             --current-version=$(VERSION)\
297             --gpg-key-id=$(GPG_KEY_ID)\
298             --url-directory=https://ftp.gnu.org/gnu/mes\
299             --news=NEWS\
300             > doc/announce/ANNOUNCE-$(VERSION)-
301
302 installdirs: mkinstalldirs
303         mkdir -p\
304             $(DESTDIR)$(bindir)\
305             $(DESTDIR)$(datadir)\
306             $(DESTDIR)$(libdir)\
307             $(DESTDIR)$(infodir)\
308             $(DESTDIR)$(mandir)
309
310 install-dvi: dvi
311         mkdir -p $(DESTDIR)${docdir}
312         cp doc/mes.dvi $(DESTDIR)${docdir}
313
314 install-html: html
315         mkdir -p $(DESTDIR)${docdir}
316         tar -cf- -C doc html | tar -xf- -C $(DESTDIR)${docdir}
317
318 install-pdf: pdf
319         mkdir -p $(DESTDIR)${docdir}
320         cp doc/mes.pdf $(DESTDIR)${docdir}
321
322 install-ps: ps
323         mkdir -p $(DESTDIR)${docdir}
324         cp doc/mes.ps $(DESTDIR)${docdir}
325
326 # We do not strip binaries, binutils' strip corrupts M1+hex2-generated ELFs
327 install-strip: install
328
329
330 define HELP_TOP
331 Usage: make [OPTION]... [TARGET]...
332
333 Main and non-standard targets:
334   all             update everything
335   all-go          update .go files
336   dist            update $(TARBALL)
337   doc             update documentation
338   check           run unit tests
339   clean           run git clean -dfx
340   clean-go        clean .go files
341   info            update info documentation
342   install         install in $(prefix)
343   install-info    install info docs in $(prefix)/share/info
344   release         dist and tag
345   uninstall       uninstall from $(prefix)
346 endef
347 export HELP_TOP
348 help:
349         @echo "$$HELP_TOP"
350
351 include ${srcdest}build-aux/export.make