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