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