| 1 | ### -*-makefile-*- |
| 2 | ### |
| 3 | ### Build script for the SOD translator |
| 4 | ### |
| 5 | ### (c) 2015 Straylight/Edgeware |
| 6 | ### |
| 7 | |
| 8 | ###----- Licensing notice --------------------------------------------------- |
| 9 | ### |
| 10 | ### This file is part of the Sensible Object Design, an object system for C. |
| 11 | ### |
| 12 | ### SOD is free software; you can redistribute it and/or modify |
| 13 | ### it under the terms of the GNU General Public License as published by |
| 14 | ### the Free Software Foundation; either version 2 of the License, or |
| 15 | ### (at your option) any later version. |
| 16 | ### |
| 17 | ### SOD is distributed in the hope that it will be useful, |
| 18 | ### but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 19 | ### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 20 | ### GNU General Public License for more details. |
| 21 | ### |
| 22 | ### You should have received a copy of the GNU General Public License |
| 23 | ### along with SOD; if not, write to the Free Software Foundation, |
| 24 | ### Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| 25 | |
| 26 | include $(top_srcdir)/vars.am |
| 27 | |
| 28 | nobase_dist_pkglispsrc_DATA = $(LISP_SOURCES) |
| 29 | LISP_SOURCES = |
| 30 | SYSDEFS = |
| 31 | |
| 32 | ASDF_ENV = \ |
| 33 | CL_SOURCE_REGISTRY=$$(pwd): \ |
| 34 | ASDF_OUTPUT_TRANSLATIONS=$$(cd $(srcdir); pwd):$(abs_builddir): |
| 35 | |
| 36 | ###-------------------------------------------------------------------------- |
| 37 | ### The source files. |
| 38 | |
| 39 | ## The package definition file. |
| 40 | LISP_SOURCES += package.lisp |
| 41 | |
| 42 | ## General utilities. |
| 43 | LISP_SOURCES += utilities.lisp |
| 44 | |
| 45 | ## The parser library. |
| 46 | LISP_SOURCES += parser/package.lisp |
| 47 | LISP_SOURCES += parser/floc-proto.lisp parser/floc-impl.lisp |
| 48 | LISP_SOURCES += parser/streams-proto.lisp parser/streams-impl.lisp |
| 49 | LISP_SOURCES += parser/scanner-proto.lisp parser/scanner-impl.lisp |
| 50 | LISP_SOURCES += parser/scanner-charbuf-impl.lisp |
| 51 | LISP_SOURCES += parser/scanner-token-impl.lisp |
| 52 | LISP_SOURCES += parser/parser-proto.lisp parser/parser-impl.lisp |
| 53 | LISP_SOURCES += parser/parser-expr-proto.lisp \ |
| 54 | parser/parser-expr-impl.lisp |
| 55 | LISP_SOURCES += parser/scanner-context-impl.lisp |
| 56 | |
| 57 | ## Lexical analysis and translator-specific parser utilities. |
| 58 | LISP_SOURCES += lexer-proto.lisp lexer-impl.lisp |
| 59 | LISP_SOURCES += fragment-parse.lisp |
| 60 | |
| 61 | ## C type representation. |
| 62 | LISP_SOURCES += c-types-proto.lisp c-types-impl.lisp \ |
| 63 | c-types-parse.lisp |
| 64 | |
| 65 | ## Property sets. |
| 66 | LISP_SOURCES += pset-proto.lisp pset-impl.lisp pset-parse.lisp |
| 67 | |
| 68 | ## Code generation. |
| 69 | LISP_SOURCES += codegen-proto.lisp codegen-impl.lisp |
| 70 | |
| 71 | ## Output machinery. |
| 72 | LISP_SOURCES += output-proto.lisp output-impl.lisp |
| 73 | |
| 74 | ## Modules. |
| 75 | LISP_SOURCES += module-proto.lisp module-impl.lisp |
| 76 | LISP_SOURCES += module-parse.lisp module-output.lisp |
| 77 | LISP_SOURCES += builtin.lisp |
| 78 | |
| 79 | ## Class representation and layout. |
| 80 | LISP_SOURCES += classes.lisp c-types-class-impl.lisp |
| 81 | LISP_SOURCES += class-utilities.lisp |
| 82 | LISP_SOURCES += class-make-proto.lisp class-make-impl.lisp |
| 83 | LISP_SOURCES += class-layout-proto.lisp class-layout-impl.lisp |
| 84 | LISP_SOURCES += class-finalize-proto.lisp class-finalize-impl.lisp |
| 85 | LISP_SOURCES += class-output.lisp |
| 86 | |
| 87 | ## Method generation. |
| 88 | LISP_SOURCES += method-proto.lisp method-impl.lisp |
| 89 | LISP_SOURCES += method-aggregate.lisp |
| 90 | |
| 91 | ## User interface. |
| 92 | LISP_SOURCES += frontend.lisp optparse.lisp |
| 93 | |
| 94 | ## Finishing touches. |
| 95 | LISP_SOURCES += final.lisp |
| 96 | |
| 97 | ###-------------------------------------------------------------------------- |
| 98 | ### Constructing an output image. |
| 99 | |
| 100 | CLEANFILES += *.$(fasl) parser/*.$(fasl) |
| 101 | |
| 102 | ## Autodetected configuration. |
| 103 | EXTRA_DIST += auto.lisp.in |
| 104 | CLEANFILES += auto.lisp |
| 105 | auto.lisp: auto.lisp.in Makefile |
| 106 | $(SUBST) $(srcdir)/auto.lisp.in >$@.new $(SUBSTITUTIONS) && \ |
| 107 | grep '^[^;]' $@.new >$@.strip && \ |
| 108 | rm -f $@.new && mv $@.strip $@ |
| 109 | |
| 110 | ## Building a working-tree system definition. |
| 111 | EXTRA_DIST += sod.asd.in |
| 112 | CLEANFILES += sod.asd |
| 113 | sod.asd: sod.asd.in Makefile |
| 114 | $(SUBST) $(srcdir)/sod.asd.in >$@.new $(SUBSTITUTIONS) && \ |
| 115 | mv $@.new $@ |
| 116 | |
| 117 | EXTRA_DIST += sod-frontend.asd.in |
| 118 | CLEANFILES += sod-frontend.asd |
| 119 | sod-frontend.asd: sod-frontend.asd.in Makefile |
| 120 | $(SUBST) $(srcdir)/sod-frontend.asd.in >$@.new $(SUBSTITUTIONS) && \ |
| 121 | mv $@.new $@ |
| 122 | |
| 123 | ## Building the executable image. |
| 124 | bin_PROGRAMS += sod |
| 125 | sod_SOURCES = |
| 126 | sod$(EXEEXT): $(LISP_SOURCES) sod.asd sod-frontend.asd auto.lisp |
| 127 | $(V_DUMP)$(ASDF_ENV) $(CL_LAUNCH) -o $@ -d ! -l $(LISPSYS) +I \ |
| 128 | -s sod-frontend -r sod-frontend:main |
| 129 | |
| 130 | ###-------------------------------------------------------------------------- |
| 131 | ### Unit testing. |
| 132 | |
| 133 | ## The system definition. |
| 134 | EXTRA_DIST += sod-test.asd.in |
| 135 | |
| 136 | ## Basic utilities. |
| 137 | EXTRA_DIST += test-base.lisp |
| 138 | |
| 139 | ## Parser tests. |
| 140 | EXTRA_DIST += parser/parser-test.lisp |
| 141 | EXTRA_DIST += parser/scanner-charbuf-test.lisp |
| 142 | |
| 143 | ## Translator tests. |
| 144 | EXTRA_DIST += c-types-test.lisp |
| 145 | EXTRA_DIST += codegen-test.lisp |
| 146 | EXTRA_DIST += lexer-test.lisp |
| 147 | |
| 148 | ## The system definition. |
| 149 | EXTRA_DIST += sod-test.asd.in |
| 150 | CLEANFILES += sod-test.asd |
| 151 | sod-test.asd: sod-test.asd.in Makefile |
| 152 | $(SUBST) $(srcdir)/sod-test.asd.in >$@.new $(SUBSTITUTIONS) && \ |
| 153 | mv $@.new $@ |
| 154 | |
| 155 | ## Running the Lisp tests. |
| 156 | check-local: sod sod-test.asd |
| 157 | $(V_TEST)$(ASDF_ENV) $(CL_LAUNCH) -l $(LISPSYS) \ |
| 158 | -s sod-frontend +I \ |
| 159 | -i '(handler-case ;\ |
| 160 | (progn ;\ |
| 161 | (asdf:load-system "sod-test") ;\ |
| 162 | (asdf:test-system "sod")) ;\ |
| 163 | (error (cond) ;\ |
| 164 | (format *error-output* "ERR: ~A~%" cond) ;\ |
| 165 | (optparse:exit 1)))' |
| 166 | |
| 167 | ###-------------------------------------------------------------------------- |
| 168 | ### Manual pages. |
| 169 | |
| 170 | dist_man_MANS += sod.1 |
| 171 | dist_man_MANS += sod-module.5 |
| 172 | |
| 173 | ###-------------------------------------------------------------------------- |
| 174 | ### Installation. |
| 175 | |
| 176 | ## We want a symlink $(lispsysdir)/sod.asd -> $(lispsrcdir)/sod/sod.asd. It |
| 177 | ## would be nice if this were a sane relative symlink, but that involves |
| 178 | ## calculating the proper relative path from $(lispsrcdir)/sod to |
| 179 | ## $(lispsysdir). Oh, well, here we go. This assumes that the path names |
| 180 | ## don't have spaces in them; but that's generally a bad idea in Makefiles |
| 181 | ## anyway. |
| 182 | install-data-local: |
| 183 | $(MKDIR_P) $(DESTDIR)$(lispsysdir) $(DESTDIR)$(pkglispsrcdir) |
| 184 | @set -e; \ |
| 185 | from=$(lispsysdir) to=$(pkglispsrcdir); \ |
| 186 | set -- $$(echo $$from | tr "/" " "); fwd=$$*; \ |
| 187 | set -- $$(echo $$to | tr "/" " "); twd=$$*; \ |
| 188 | while :; do \ |
| 189 | set -- $$fwd; fhd=$$1 fn=$$#; \ |
| 190 | set -- $$twd; thd=$$1 tn=$$#; \ |
| 191 | case :$$fn:$$tn: in *:0:*) break ;; esac; \ |
| 192 | case "$$fhd" in "$$thd") ;; *) break ;; esac; \ |
| 193 | set -- $$fwd; shift; fwd=$$*; \ |
| 194 | set -- $$twd; shift; twd=$$*; \ |
| 195 | done; \ |
| 196 | dots=$$(echo $$fwd | sed 's/[^ ][^ ]*/../g'); \ |
| 197 | rel=$$(echo $$dots $$twd | tr " " "/"); \ |
| 198 | for i in sod.asd sod-frontend.asd; do \ |
| 199 | echo >&2 "CREATE $$to/$$i"; \ |
| 200 | sed -e '/#|@-auto-@|#/ { r auto.lisp' -e ' d; }' \ |
| 201 | -e '/#|@-path-@|#/ d' \ |
| 202 | $(srcdir)/$$i.in >$(DESTDIR)$(pkglispsrcdir)/$$i.new; \ |
| 203 | mv $(DESTDIR)$(pkglispsrcdir)/$$i.new \ |
| 204 | $(DESTDIR)$(pkglispsrcdir)/$$i; \ |
| 205 | echo >&2 "LINK $$rel/$$i $$to/$$i"; \ |
| 206 | ln -s $$rel/$$i $(DESTDIR)$$from/$$i.new; \ |
| 207 | mv $(DESTDIR)$$from/$$i.new $(DESTDIR)$$from/$$i; \ |
| 208 | done |
| 209 | |
| 210 | uninstall-local: |
| 211 | for i in sod.asd sod-frontend.asd; do \ |
| 212 | rm -f $(DESTDIR)$(pkglispsrcdir)/$$i $(DESTDIR)$(lispsysdir)/$$i; \ |
| 213 | done |
| 214 | |
| 215 | ###----- That's all, folks -------------------------------------------------- |