Prepare for 0.1 release: gnu-build-system.
[mes.git] / GNUmakefile
1 .PHONY: all check clean default distclean help install release
2 default: all
3
4 .config.make: configure GNUmakefile
5         ./configure
6
7 OUT:=out
8 CFLAGS:=-std=c99 -O3 -finline-functions
9 #CFLAGS:=-std=c99 -O0
10 #CFLAGS:=-pg -std=c99 -O0
11 #CFLAGS:=-std=c99 -O0 -g
12
13 include .config.make
14 -include .local.make
15 include make/install.make
16
17
18 all: mes
19
20 mes: mes.c mes.h
21
22 clean:
23         rm -f mes environment.i symbol.i mes.h *.cat a.out
24
25 distclean: clean
26         rm -f .config.make
27
28 mes.h: mes.c GNUmakefile
29         ( echo '#if MES_C'; echo '#if MES_FULL' 1>&2;\
30         grep -E '^(scm [*])*[a-z0-9_]+ \(.*\)( {|$$)' $< | grep -Ev '\(.*(char |bool |int )' | sed -e 's,^scm [*],,' | sort |\
31                 while read f; do\
32                         fun=$$(echo $$f | sed -e 's,^scm [*],,' -e 's,{.*,,');\
33                         name=$$(echo $$fun | sed -e 's,^scm [\*],,' | grep -o '^[^ ]*');\
34                         scm_name=$$(echo $$name | sed -e 's,_to_,->,' -e 's,_p$$,?,' -e 's,_x$$,!,' -e 's,^builtin_,,' -re 's,(.*)_$$,c:\1,' | sed \
35                                 -e 's,^divide$$,/,'\
36                                 -e 's,^is?$$,=,'\
37                                 -e 's,^greater?$$,>,'\
38                                 -e 's,^less?$$,<,'\
39                                 -e 's,^minus$$,-,'\
40                                 -e 's,^multiply$$,*,'\
41                                 -e 's,^plus$$,+,'\
42                                 -e 's,_,-,g');\
43                         args=$$(echo $$fun | grep -o 'scm [\*]' | wc -l);\
44                         [ "$$(echo $$fun | fgrep -o ... )" = "..." ] && args=n;\
45                         echo "scm *$$fun;";\
46                         echo "scm scm_$$name = {FUNCTION$$args, .name=\"$$scm_name\", .function$$args=&$$name};";\
47                         echo "a = add_environment (a, \"$$scm_name\", &scm_$$name);" 1>&2;\
48         done; echo '#endif'; echo '#endif' 1>&2) > $@ 2>environment.i
49         grep -oE '^scm ([a-z_]+) = {SYMBOL,' mes.c | cut -d' ' -f 2 |\
50                 while read f; do\
51                         echo "symbols = cons (&$$f, symbols);";\
52                 done > symbols.i
53
54 check: all guile-check mes-check
55
56 TESTS:=\
57  tests/base.test\
58  tests/closure.test\
59  tests/quasiquote.test\
60  tests/let.test\
61  tests/scm.test\
62  tests/record.test\
63  tests/let-syntax.test\
64  tests/match.test\
65 #
66
67 BASE-0:=module/mes/base-0.mes
68 MES-0:=guile/mes-0.scm
69 MES:=./mes
70
71 mes-check: all
72         for i in $(TESTS); do\
73                 cat $(BASE-0) $$(scripts/include.mes $$i) $$i | $(MES);\
74         done
75
76 guile-check:
77         for i in $(TESTS); do\
78                 guile -s <(cat $(MES-0) $$(scripts/include.mes $$i | grep -Ev 'let.mes|quasiquote.mes|srfi-0') $$i);\
79         done
80         for i in $(TESTS); do\
81                 guile -s <(cat $(MES-0) module/mes/test.mes $$i);\
82         done
83
84 mescc: all
85         scripts/mescc.mes
86         ./a.out
87
88 mescc.cat: $(MES-0) module/mes/lalr.mes module/mes/elf.mes module/mes/libc-i386.mes $(shell scripts/include.mes scripts/mescc.mes | grep -Ev '/mes/|/srfi/')
89         echo '(compile)' | cat $^ - > $@
90
91 guile-mescc: mescc.cat
92         cat doc/examples/main.c | guile -s $^ > a.out
93         chmod +x a.out
94         ./a.out
95
96 help: help-top
97
98 install: all
99
100 release: all
101
102 help:
103         @echo
104
105 define HELP_TOP
106 Usage: make [OPTION]... [TARGET]...
107
108 Targets:
109   all             update everything
110   check           run unit tests
111   clean           remove all generated stuff
112   dist            create tarball in $(TARBALL)
113   distclean       also clean configuration
114   mescc           compile cc/main.c to a.out
115   install         install in $$(PREFIX) [$(PREFIX)]
116   release         make a release
117 endef
118 export HELP_TOP
119 help-top:
120         @echo "$$HELP_TOP"