build: Generate gcc-mesboot-graph from .dot.
[mes.git] / GNUmakefile
1 # Mes --- Maxwell Equations of Software
2 # Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
3 #
4 # This file is part of Mes.
5 #
6 # 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 # 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 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))
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:= all all-go build check clean clean-go default dist doc help install\
33 install-info man gcc mes ${top_builddest}src/mes mes-gcc mes-tcc generate-ChangeLog
34
35 .PHONY: $(PHONY_TARGETS)
36
37 default: all
38
39 all: build doc
40
41 build:
42         ./build.sh
43
44 gcc:
45         build-aux/build-cc.sh
46
47 mes-gcc:
48         build-aux/build-cc32.sh
49
50 mes-tcc:
51 ifdef TCC
52         CC32=$(TCC) build-aux/build-cc32.sh
53 else
54
55 $(warning skipping mes-tcc: no tcc)
56 endif
57
58 mes:
59         build-aux/build-mes.sh
60
61 clean:
62         git clean -dfx
63
64 all-go:
65         build-aux/build-guile.sh
66
67 clean-go:
68         rm -f $(shell find . -name '*.go')
69
70 check:
71         ./check.sh
72
73 install: ${top_builddest}src/mes
74         ./install.sh
75
76 $(config.make): configure
77
78 seed: all-go mes-gcc mes-tcc
79 ifdef TCC
80         cd $(TINYCC_SEED) && MES_PREFIX=$(PWD) ./refresh.sh
81 endif
82         cd $(MES_SEED) && git reset --hard HEAD
83         MES=$(GUILE) GUILE=$(GUILE) SEED=1 build-aux/build-mes.sh
84         cd $(MES_SEED) && MES_PREFIX=$(PWD) ./refresh.sh
85         MES=$(GUILE) GUILE=$(GUILE) SEED=1 build-aux/build-mes.sh
86         cp lib/x86-mes/elf32-header.hex2\
87            lib/x86-mes/x86.M1\
88            lib/x86-mes/libc+tcc.S\
89            lib/x86-mes/libc.S\
90            lib/x86-mes/crt1.S\
91            lib/x86-mes/libgetopt.S\
92            $(MESCC_TOOLS_SEED)/libs
93         cd $(MESCC_TOOLS_SEED) && MES_PREFIX=$(PWD) ./bootstrap.sh
94
95 ${top_builddest}doc/version.texi: doc/mes.texi GNUmakefile
96         @mkdir -p $(@D)
97         (set `LANG= date -r $< +'%d %B %Y'`;\
98         echo "@set UPDATED $$1 $$2 $$3"; \
99         echo "@set UPDATED-MONTH $$2 $$3"; \
100         echo "@set EDITION $(VERSION)"; \
101         echo "@set VERSION $(VERSION)") > $@
102
103 doc: ${top_builddest}doc/version.texi
104 ifdef MAKEINFO
105 doc: info
106 else
107 $(warning skipping info: no makeinfo)
108 endif
109
110 ifdef HELP2MAN
111 doc: man
112 else
113 $(warning skipping man: no help2man)
114 endif
115
116 info: ${top_builddest}doc/mes.info
117
118 ${top_builddest}doc/mes.info: doc/mes.texi ${top_builddest}doc/version.texi doc/images/gcc-mesboot-graph.dot GNUmakefile
119         $(MAKEINFO) -o $@ -I ${top_builddest}doc -I doc $<
120
121 ${top_builddest}doc/images/gcc-mesboot-graph.png: doc/images/gcc-mesboot-graph.dot
122 ifdef DOT
123         $(DOT) -T png $< > $@
124 else
125         touch $@
126 $(warning info: graphvis missing: no images)
127 endif
128
129 install-info: info
130
131 man: ${top_builddest}doc/mes.1 ${top_builddest}doc/mescc.1
132
133 ${top_builddest}src/mes: build
134
135 ${top_builddest}doc/mes.1: ${top_builddest}src/mes
136         MES_ARENA=10000000 ${top_builddir}/pre-inst-env $(HELP2MAN) $(<F) > $@
137
138 ${top_builddest}doc/mescc.1: ${top_builddest}src/mes ${top_builddest}scripts/mescc
139         MES_ARENA=10000000 ${top_builddir}/pre-inst-env $(HELP2MAN) $(<F) > $@
140
141 html: ${top_builddest}mes/index.html
142
143 ${top_builddest}mes/index.html: doc/mes.texi ${top_builddest}doc/images/gcc-mesboot-graph.png
144         $(MAKEINFO) --html -o ${top_builddest}doc/mes $<
145
146 pdf: ${top_builddest}doc/mes.pdf
147
148 ${top_builddest}doc/mes.pdf: doc/mes.texi
149         $(MAKEINFO) --pdf -I ${top_builddest}/doc -o doc/mes.pdf $<
150
151 ### \f dist
152 COMMIT=$(shell test -d .git && (git describe --dirty 2>/dev/null) || cat .tarball-version)
153 TARBALL_VERSION=$(COMMIT:v%=%)
154 TARBALL_DIR:=$(PACKAGE)-$(TARBALL_VERSION)
155 TARBALL:=${top_builddest}$(TARBALL_DIR).tar.gz
156
157 ${top_builddest}.tarball-version:
158         echo $(COMMIT) > $@
159
160 GIT_ARCHIVE_HEAD:=git archive HEAD --
161 GIT_LS_FILES:=git ls-files
162 ifeq ($(wildcard .git),)
163 GIT_ARCHIVE_HEAD:=tar -cf-
164 GIT_LS_FILES:=find
165 endif
166
167 dist: $(TARBALL)
168
169 tree-clean-p:
170         test ! -d .git || git diff --exit-code > /dev/null
171         test ! -d .git || git diff --cached --exit-code > /dev/null
172         @echo commit:$(COMMIT)
173
174 generate-ChangeLog:
175         $(PERL) build-aux/gitlog-to-changelog --srcdir=${srcdir} > ChangeLog
176
177 $(TARBALL): ${top_builddest}.tarball-version | generate-ChangeLog
178         ($(GIT_LS_FILES)\
179             --exclude=$(TARBALL_DIR);\
180             echo $^ | tr ' ' '\n')\
181             | GZIP=-n tar --sort=name --mtime=@0 --owner=0 --group=0 --numeric-owner\
182             --transform=s,^,$(TARBALL_DIR)/,S -T- -czf $@
183         git checkout ChangeLog
184
185 ifdef GUIX
186 update-hash: $(TARBALL)
187         $(GUIX) download file://$(PWD)/$<
188         sed -i -e 's,(base32 #!mes!# "[^"]*"),(base32 #!mes!# "$(shell $(GUIX) hash $<)"),' guix/git/mes.scm
189
190 else
191 $(warning update-hash: no guix)
192 endif
193
194 release: update-hash
195         ./pre-inst-env $(GUIX) build mes@$(VERSION) --with-source=$(TARBALL)
196
197 define HELP_TOP
198 Usage: make [OPTION]... [TARGET]...
199
200 Targets:
201   all             update everything
202   all-go          update .go files
203   gcc             update src/mes.gcc-out
204   dist            update $(TARBALL)
205   doc             update documentation
206   mes-gcc         update src/mes.mes-gcc-out
207   mes-tcc         update src/mes.mes-tcc-out
208   mes             update src/mes
209   check           run unit tests
210   clean           run git clean -dfx
211   clean-go        clean .go files
212   info            update info documentation
213   install         install in $(prefix)
214   install-info    install info docs in $(prefix)/share/info
215   seed            update mes-seed in $(MES_SEED)
216 endef
217 export HELP_TOP
218 help:
219         @echo "$$HELP_TOP"
220
221 include build-aux/export.make