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