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