mescc: Mes C Library: Use __ as global internal prefix.
[mes.git] / configure
1 #! /bin/sh
2 # -*-scheme-*-
3 MES_ARENA=100000000 exec ${SCHEME-guile} -L . --no-auto-compile -e '(configure)' -s "$0" ${1+"$@"}
4 !#
5
6 ;;; GNU Mes --- Maxwell Equations of Software
7 ;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
8 ;;;
9 ;;; configure: This file is part of GNU Mes.
10 ;;;
11 ;;; GNU Mes is free software; you can redistribute it and/or modify it
12 ;;; under the terms of the GNU General Public License as published by
13 ;;; the Free Software Foundation; either version 3 of the License, or (at
14 ;;; your option) any later version.
15 ;;;
16 ;;; GNU Mes is distributed in the hope that it will be useful, but
17 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 ;;; GNU General Public License for more details.
20 ;;;
21 ;;; You should have received a copy of the GNU General Public License
22 ;;; along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
23
24 (define-module (configure)
25   #:use-module (srfi srfi-1)
26   #:use-module (srfi srfi-9)
27   #:use-module (srfi srfi-9 gnu)
28   #:use-module (srfi srfi-26)
29   #:use-module (ice-9 getopt-long)
30   #:use-module (ice-9 optargs)
31   #:use-module (ice-9 popen)
32   #:use-module (ice-9 rdelim)
33   #:export (main))
34
35 (cond-expand
36  (guile)
37  (mes (mes-use-module (srfi srfi-1))
38       (mes-use-module (srfi srfi-9))
39       (mes-use-module (srfi srfi-9 gnu))
40       (mes-use-module (srfi srfi-26))
41       (mes-use-module (mes getopt-long))
42       (mes-use-module (mes guile))
43       (mes-use-module (mes misc))
44       (mes-use-module (mes optargs))
45       (define %host-type "x86_64-unknown-linux-gnu")
46       (define OPEN_READ "r")
47       (define (canonicalize-path o)
48         (if (string-prefix? "/" o) o
49             (string-append (getcwd) "/" o)))
50       (define (sort lst less)
51         lst)
52       (define (close-pipe o) 0)
53       (define (open-pipe* OPEN_READ . commands)
54         (let ((fake-pipe ".pipe"))
55           (with-output-to-file fake-pipe
56             (lambda _
57               (let ((status (apply system* (append commands))))
58                 (set! close-pipe (lambda _ status)))))
59           (open-input-file fake-pipe)))))
60
61 (define* (PATH-search-path name #:key (default name) warn?)
62   (or (search-path (string-split (getenv "PATH") #\:) name)
63       (and (and warn? (format (current-error-port) "warning: not found: ~a\n" name))
64            default)))
65
66 (define *shell* "sh")
67 (define PACKAGE "mes")
68 (define VERSION "0.19")
69
70 ;;; Utility
71 (define (logf port string . rest)
72   (apply format (cons* port string rest))
73   (force-output port)
74   #t)
75
76 (define (stderr string . rest)
77   (apply logf (cons* (current-error-port) string rest)))
78
79 (define (stdout string . rest)
80   (apply logf (cons* (current-output-port) string rest)))
81
82 (define %verbose? #f)
83
84 (define (verbose string . rest)
85   (if %verbose? (apply stderr (cons string rest))))
86
87 (define (gulp-pipe* . command)
88   (let* ((err (current-error-port))
89          (foo (set-current-error-port (open-output-file ".error")))
90          (port (apply open-pipe* OPEN_READ command))
91          (output (read-string port))
92          (status (close-pipe port))
93          (error (with-input-from-file ".error" read-string)))
94     (when (file-exists? ".error")
95       (delete-file ".error"))
96     (set-current-error-port err)
97     (verbose "command[~a]: ~s => ~a [~a]\n" status command output error)
98     (if (not (zero? status)) ""
99         (string-trim-right (string-append output error)))))
100
101 (define (tuple< a b)
102   (cond
103    ((and (null? a) (null? b)) #t)
104    ((null? a) (not (null? b)))
105    ((null? b) #f)
106    ((and (not (< (car a) (car b)))
107          (not (< (car b) (car a))))
108     (tuple< (cdr a) (cdr b)))
109    (else (< (car a) (car b)))))
110
111 (define (tuple<= a b)
112   (or (equal? a b) (tuple< a b)))
113
114 (define (conjoin . predicates)
115   (lambda (. arguments)
116     (every (cut apply <> arguments) predicates)))
117
118 (define (char->char from to char)
119   (if (eq? char from) to char))
120
121 (define (string-replace-char string from to)
122   (string-map (cut char->char from to <>) string))
123
124 (define (string-replace-string string from to)
125   (cond ((string-contains string from)
126          => (lambda (i) (string-replace string to i (+ i (string-length from)))))
127         (else string)))
128
129 (define (string-replace-string/all string from to)
130   (or (and=> (string-contains string from)
131              (lambda (i)
132                (string-append
133                 (substring string 0 i)
134                 to
135                 (string-replace-string/all
136                  (substring string (+ i (string-length from))) from to))))
137       string))
138
139 ;;; Configure
140
141 (define-immutable-record-type <dependency>
142   (make-dependency name version-expected optional? version-option commands file-name data version-found)
143   dependency?
144   (name dependency-name)
145   (version-expected dependency-version-expected)
146   (optional? dependency-optional?)
147   (version-option dependency-version-option)
148   (commands dependency-commands)
149   (file-name dependency-file-name)
150   (data dependency-data)
151   (version-found dependency-version-found))
152
153 (define* (make-dep name #:key (version '(0)) optional? (version-option "--version") (commands (list name)) file-name data)
154   (let* ((env-var (getenv (name->shell-name name)))
155          (commands (if env-var (cons env-var commands) commands)))
156     (make-dependency name version optional? version-option commands file-name data #f)))
157
158 (define (find-dep name deps)
159   (find (compose (cut equal? <> name) dependency-name) deps))
160
161 (define (file-name name deps)
162   (and=> (find-dep name deps) dependency-file-name))
163
164 (define (variable-name dependency)
165   (and=>
166    (dependency-name dependency)
167    name->shell-name))
168
169 (define (name->shell-name name)
170   (string-upcase (string-replace-char name #\- #\_)))
171
172 (define (->string o)
173   (cond ((number? o) (number->string o))
174         ((string? o) o)
175         (else (format #f "~a" o))))
176
177 (define (version->string version)
178   (and version (string-join (map ->string version) ".")))
179
180 (define (string->version string)
181   (let ((split (string-tokenize string
182                                 (char-set-adjoin char-set:digit #\.))))
183     (and (pair? split)
184          (let* ((version (sort split (lambda (a b) (> (string-length a) (string-length b)))))
185                 (version (car version))
186                 (version (string-tokenize version
187                                           (char-set-complement (char-set #\.)))))
188            (map string->number version)))))
189
190 (define (check-program-version dependency)
191   (let ((name (dependency-name dependency))
192         (expected (dependency-version-expected dependency))
193         (version-option (dependency-version-option dependency))
194         (commands (dependency-commands dependency)))
195     (let loop ((commands commands))
196       (if (null? commands) dependency
197           (let ((command (car commands)))
198             (stdout "checking for ~a~a... " name
199                     (if (null? expected) ""
200                         (format #f " [~a]" (version->string expected))))
201             (let* ((output (gulp-pipe* command version-option))
202                    ;;(foo (stderr "output=~s\n" output))
203                    (actual (string->version output))
204                    ;;(foo (stderr "actual=~s\n" actual))
205                    ;;(foo (stderr "expected=~s\n" expected))
206                    (pass? (and actual (tuple< expected actual)))
207                    ;;(foo (stderr "PASS?~s\n" pass?))
208                    (dependency (set-field dependency (dependency-version-found) actual)))
209               (stdout "~a ~a\n" (if pass? (if (pair? actual) "" " yes")
210                                     (if actual " no, found" "no"))
211                       (or (version->string actual) ""))
212               (if pass? (let ((file-name (or (PATH-search-path command)
213                                              (dependency-file-name dependency))))
214                           (set-field dependency (dependency-file-name) file-name))
215                   (loop (cdr commands)))))))))
216
217 (define (check-file dependency)
218   (stdout "checking for ~a... " (dependency-name dependency))
219   (let ((file-name (and (file-exists? (dependency-file-name dependency))
220                         (dependency-file-name dependency))))
221     (stdout "~a\n" (or file-name ""))
222     (set-field dependency (dependency-file-name) file-name)))
223
224 (define* (check-header-c cc dependency #:optional (check check-preprocess-header-c))
225   (let ((name (dependency-name dependency)))
226     (stderr "checking for ~a..." name)
227     (let ((result (check cc name)))
228       (when (file-exists? ".config.c")
229         (delete-file ".config.c"))
230       (stderr " ~a\n" (if result "yes" "no"))
231       (if result (set-field dependency (dependency-file-name) name)
232           dependency))))
233
234 (define* (check-compile-c cc dependency #:optional (check check-compile-string-c))
235   (let ((name (dependency-name dependency)))
236     (stderr "checking for ~a..." name)
237     (let ((result (check cc (dependency-data dependency))))
238       (when (file-exists? ".config.c")
239         (delete-file ".config.c"))
240       (stderr " ~a\n" (if result "yes" "no"))
241       (if result (set-field dependency (dependency-file-name) name)
242           dependency))))
243
244 (define* (check-link-c cc dependency #:optional (check check-link-string-c))
245   (let ((name (dependency-name dependency)))
246     (stderr "checking for ~a..." name)
247     (let ((result (check cc (dependency-data dependency))))
248       (when (file-exists? ".config.c")
249         (delete-file ".config.c"))
250       (stderr " ~a\n" (if result "yes" "no"))
251       (if result (set-field dependency (dependency-file-name) name)
252           dependency))))
253
254 (define (check-preprocess-header-c cc header)
255   (with-output-to-file ".config.c"
256     (cut format #t "#include \"~a\"" header))
257   (with-error-to-file "/dev/null"
258     (cut zero? (system* cc "-E" "-o" ".config.E" ".config.c"))))
259
260 (define (check-compile-string-c cc string)
261   (with-output-to-file ".config.c"
262     (cut display string))
263   (with-error-to-file "/dev/null"
264     (cut zero? (system* cc "--std=gnu99" "-c" "-o" ".config.o" ".config.c"))))
265
266 (define (check-link-string-c cc string)
267   (with-output-to-file ".config.c"
268     (cut display string))
269   (with-error-to-file "/dev/null"
270     (cut zero? (system* cc "--std=gnu99" "-o" ".config" ".config.c"))))
271
272 (define (parse-opts args)
273   (let* ((option-spec
274           '((build (value #t))
275             (host (value #t))
276
277             (prefix (value #t))
278             (program-prefix (value #t))
279             (bindir (value #t))
280             (datadir (value #t))
281             (docdir (value #t))
282             (libdir (value #t))
283             (srcdir (value #t))
284             (sysconfdir (value #t))
285
286             (mes)
287             (help (single-char #\h))
288             (verbose (single-char #\v))
289             (with-cheating)
290             (with-courage)
291             (infodir (value #t))
292             (mandir (value #t))
293             (disable-silent-rules)
294             (enable-silent-rules)
295
296             (enable-fast-install)       ; Ignored for Guix
297             (includedir (value #t))     ; Ignored for Debian
298             (mandir (value #t))         ; Ignored for Debian
299             (localstatedir (value #t))  ; Ignored for Debian
300             (libdir (value #t))         ; Ignored for Debian
301             (libexecdir (value #t))     ; Ignored for Debian
302             (runstatedir (value #t))    ; Ignored for Debian
303             (disable-maintainer-mode)   ; Ignored for Debian
304             (disable-dependency-tracking) ; Ignored for Debian
305             )))
306
307     (getopt-long args option-spec)))
308
309 (define* (print-help #:optional (port (current-output-port)))
310   (format port "\
311 `configure' configures ~a ~a to adapt to many kinds of systems.
312
313 Usage: ./configure [OPTION]... [VAR=VALUE]
314
315 To assign environment variables (e.g., CC, CFLAGS...), specify them as
316 VAR=VALUE.  See below for descriptions of some of the useful variables.
317
318 Defaults for the options are specified in brackets.
319
320 Options:
321   -h, --help           display this help
322       --build=BUILD    configure for building on BUILD [guessed]
323       --disable-silent-rules
324                        verbose build output [V=1]
325       --host=HOST      cross-compile to build programs to run on HOST [BUILD]
326       --mes            use Mes C Library
327   -v, --verbose        be verbose
328   --with-courage       assert being courageous to configure for unsupported platform
329   --with-cheating      cheat using Guile instead of Mes
330
331 Installation directories:
332   --prefix=DIR         install in prefix DIR [~a]
333   --infodir=DIR        info documentation [PREFIX/share/info]
334   --mandir=DIR         man pages [PREFIX/share/man]
335
336 Program names:
337   --program-prefix=PREFIX            prepend PREFIX to installed program names
338   --program-suffix=SUFFIX            append SUFFIX to installed program names
339
340 Ignored for Guix:
341   --enable-fast-install
342
343 Ignored for Debian:
344   --disable-dependency-tracking
345   --disable-maintainer-mode
346   --includedir=DIR
347   --libdir=DIR
348   --libexecdir=DIR
349   --localstatedir=DIR
350   --runstatedir=DIR
351
352 Some influential environment variables:
353   CC                C compiler command
354   CFLAGS            C compiler flags
355   GUILE             guile command
356   GUILD             guild command
357   MES_FOR_BUILD     build system MES [can be mes or guile]
358   MES_SEED          location of mes-seed
359   TINYCC_PREFIX     location of tinycc [for tests/test2]
360 " PACKAGE VERSION (getenv "prefix")))
361
362 (define (main args)
363   (let* ((options (parse-opts args))
364          (build-type (option-ref options 'build %host-type))
365
366          (host-type (option-ref options 'host %host-type))(prefix "/usr/local")
367
368          (prefix "/usr/local")
369          (prefix (option-ref options 'prefix prefix))
370          (program-prefix (option-ref options 'program-prefix ""))
371          (program-suffix (option-ref options 'program-suffix ""))
372          (infodir (option-ref options 'infodir "${prefix}/share/info"))
373          (mandir (option-ref options 'infodir "${prefix}/share/man"))
374          (sysconfdir (option-ref options 'sysconfdir "${prefix}/etc"))
375
376          (bindir (option-ref options 'bindir "${prefix}/bin"))
377          (datadir (option-ref options 'datadir "${prefix}/share"))
378          (docdir (option-ref options 'docdir "${datadir}/doc/mes-${VERSION}"))
379          (libdir (option-ref options 'libdir "${prefix}/lib"))
380          (moduledir "${datadir}/mes/module")
381          (moduledir/ (string-append
382                       (gulp-pipe* "echo" prefix)
383                       "/share/mes/module/"))
384          (guile-effective-version (effective-version))
385          (guile-site-dir (if (equal? prefix ".") (canonicalize-path ".")
386                              (string-append prefix "/share/guile/site/" guile-effective-version)))
387          (guile-site-ccache-dir (if (equal? prefix ".") (canonicalize-path ".")
388                                     (string-append prefix "/lib/guile/" guile-effective-version "/site-ccache")))
389
390          (srcdir (dirname (car (command-line))))
391          (srcdest (if (equal? srcdir ".") ""
392                       (string-append srcdir "/")))
393          (abs-top-srcdir (canonicalize-path srcdir))
394          (abs-top-builddir (canonicalize-path (getcwd)))
395          (top-builddir (if (equal? srcdir ".") "."
396                            abs-top-builddir))
397
398          (with-cheating? (option-ref options 'with-cheating #f))
399          (with-courage? (option-ref options 'with-courage #f))
400          (disable-silent-rules? (option-ref options 'disable-silent-rules #f))
401          (enable-silent-rules? (option-ref options 'enable-silent-rules #f))
402          (vars (filter (cut string-index <> #\=) (option-ref options '() '())))
403          (help? (option-ref options 'help #f))
404          (mes? (option-ref options 'mes #f)))
405     (when help?
406       (print-help)
407       (exit 0))
408     (set! %verbose? (option-ref options 'verbose #f))
409     (when %verbose?
410       (stderr "configure args=~s\n" args))
411     (for-each (lambda (v) (apply setenv (string-split v #\=))) vars)
412     (let* ((mes-seed (or (getenv "MES_SEED")
413                          (string-append srcdest "../mes-seed")))
414            (mes-seed (and mes-seed
415                           (file-exists? (string-append mes-seed "/x86-mes/mes.S"))
416                           mes-seed))
417            (tinycc-prefix (or (getenv "TINYCC_PREFIX")
418                               (string-append srcdest "../tinycc-prefix")))
419            (gcc (or (getenv "CC") "gcc"))
420            (tcc (or (getenv "TCC") "tcc"))
421            (mescc (or (getenv "MESCC") "mescc"))
422            (deps (fold (lambda (program results)
423                          (cons (check-program-version program) results))
424                        '()
425                        (list (make-dep "hex2" #:version '(0 3))
426                              (make-dep "M1" #:version '(0 3))
427                              (make-dep "blood-elf" #:version '(0 1))
428                              (make-dep "guile" #:version '(2 0) #:commands '("guile-2.2" "guile-2.0" "guile-2" "guile") #:optional? #t)
429                              (make-dep "mes" #:version '(0 18) #:optional? #t)
430                              (make-dep "guix" #:version '(0 13) #:optional? #t)
431                              (make-dep "ar" #:version '(2 10) #:optional? #t)
432                              (make-dep "sh" #:version '(0) #:optional? #t)
433                              (make-dep "bash" #:version '(2 0) #:optional? #t)
434                              (make-dep "guild" #:version '(2 0) #:commands '("guild" "guile-tools"))
435                              (make-dep "cc" #:commands (list gcc tcc mescc) #:optional? #t)
436                              (make-dep "make" #:optional? #t)
437                              (make-dep "makeinfo" #:optional? #t)
438                              (make-dep "dot" #:version-option "-V" #:optional? #t)
439                              (make-dep "help2man" #:version '(1 47) #:optional? #t)
440                              (make-dep "perl" #:version '(5) #:optional? #t)
441                              (make-dep "git" #:version '(2) #:optional? #t))))
442            (guile (file-name "guile" deps))
443            (deps (if guile (cons (check-program-version (make-dep "nyacc" #:version '(0 86 0) #:commands (list (string-append guile " -c '(use-modules (nyacc lalr)) (display *nyacc-version*)'")) #:file-name #t))
444                                  deps)
445                      deps))
446            (guile (or guile "guile"))
447            (cc (file-name "cc" deps))
448            (deps (if cc
449                      (cons* (check-header-c cc (make-dep "limits.h"))
450                             (check-header-c cc (make-dep "stdio.h" #:optional? #t))
451                             deps)
452                      deps))
453            (deps (cons (check-file (make-dep "tinycc-prefix" #:optional? #t
454                                              #:file-name tinycc-prefix))
455                        deps))
456            (missing (filter (conjoin (negate dependency-file-name)
457                                      (negate dependency-optional?)) deps))
458            (deps (if cc
459                      (cons (check-compile-c cc (make-dep "cc is GNU C" #:data "#if !defined (__GNUC__)
460 #error no gnuc
461 #endif
462 "))
463                            deps)
464                      deps))
465            (gcc? (file-name "cc is GNU C" deps))
466            (deps (if cc
467                      (cons (check-compile-c cc (make-dep "cc is Mes C" #:data "#if !defined (__MESC__)
468 #error no mesc
469 #endif
470 "))
471                            deps)
472                      deps))
473            (mesc? (file-name "cc is Mes C" deps))
474            (deps (if cc
475                      (cons (check-compile-c cc (make-dep "cc is Tiny CC" #:data "#if !defined (__TINYCC__)
476 #error no tinycc
477 #endif
478 "))
479                            deps)
480                      deps))
481            (tcc? (file-name "cc is Tiny CC" deps))
482            (deps (if cc
483                      (cons (check-link-c cc (make-dep "if cc can create executables" #:data "int main () {return 0;}"))
484                            deps)
485                      deps))
486            (mes? (or mes? (not (file-name "if cc can create executables" deps))))
487            (build-type (or (and cc (gulp-pipe* cc "-dumpmachine")) build-type))
488            (arch (car (string-split build-type #\-)))
489            (arch (if (member arch '("i386" "i486" "i586" "i686")) "x86"
490                      arch))
491            (mes-arch arch)
492            (mes-arch (if mes? (string-append mes-arch "-mes") mes-arch))
493            (mes-arch (if gcc? (string-append mes-arch "-gcc") mes-arch))
494            (mes-arch (if tcc? (string-append mes-arch "-gcc") mes-arch))
495            (posix? (and (not mesc?) (not mes?))))
496
497       (define* (substitute file-name pairs
498                            #:key (target (if (string-suffix? ".in" file-name)
499                                              (string-drop-right file-name 3) file-name)))
500         (system* "mkdir" "-p" (dirname target))
501         (with-output-to-file target
502           (lambda _
503             (let ((in (open-input-file file-name)))
504               (let loop ((line (read-line in 'concat)))
505                 (when (not (eof-object? line))
506                   (display (fold (lambda (o result)
507                                    (string-replace-string/all result (car o) (cdr o)))
508                                  line pairs))
509                   (loop (read-line in 'concat))))))))
510
511       (when (and (not (member arch '("x86" "x86_64"))) (not with-courage?))
512         (stderr "platform not supported: ~a, try --with-courage\n" arch)
513         (exit 1))
514       (when (pair? missing)
515         (stderr "\nMissing dependencies: ~a\n" (string-join (map dependency-name missing)))
516         (exit 1))
517       (let ((git (find-dep "git" deps)))
518         (when (and git
519                    (not (file-exists? ".git")))
520           ;; Debian wants to run `make clean' from a tarball
521           (and (zero? (system* "git" "init"))
522                (zero? (system* "git" "add" "."))
523                (zero? (system* "git" "commit" "--allow-empty" "-m" "Import mes")))))
524
525       (let ((pairs `(("@PACKAGE@" . ,PACKAGE)
526                      ("@VERSION@" . ,VERSION)
527
528                      ("@arch@" . ,arch)
529                      ("@build@" . ,build-type)
530                      ("@host@" . ,host-type)
531
532                      ("@gcc_p@" . ,(if gcc? "1" ""))
533                      ("@mes_arch@" . ,mes-arch)
534                      ("@mes_p@" . ,(if mes? "1" ""))
535                      ("@mesc_p@" . ,(if mesc? "1" ""))
536                      ("@posix_p@" . ,(if posix? "1" ""))
537                      ("@tcc_p@" . ,(if tcc? "1" ""))
538
539                      ("@abs_top_srcdir@" . ,abs-top-srcdir)
540                      ("@abs_top_builddir@" . ,abs-top-builddir)
541                      ("@top_builddir@" . ,top-builddir)
542
543                      ("@srcdest@" . ,srcdest)
544                      ("@srcdir@" . ,srcdir)
545
546                      ("@prefix@" . ,prefix)
547                      ("@program_prefix@" . ,program-prefix)
548                      ("@bindir@" . ,bindir)
549                      ("@datadir@" . ,datadir)
550                      ("@docdir@" . ,docdir)
551                      ("@guile_site_ccache_dir@" . ,guile-site-ccache-dir)
552                      ("@guile_site_dir@" . ,guile-site-dir)
553                      ("@infodir@" . ,infodir)
554                      ("@libdir@" . ,libdir)
555                      ("@mandir@" . ,mandir)
556                      ("@moduledir@" . ,moduledir)
557                      ("@sysconfdir@" . ,sysconfdir)
558
559                      ("@GUILE_EFFECTIVE_VERSION@" . ,(effective-version))
560                      ("@V@" . ,(if disable-silent-rules? 1 0))
561
562                      ("@AR@" . ,(or (file-name "ar" deps) ""))
563                      ("@BASH@" . ,(or (file-name "bash" deps) ""))
564                      ("@CC@" . ,(or (file-name "cc" deps) ""))
565                      ("@DOT@" . ,(or (file-name "dot" deps) ""))
566                      ("@GIT@" . ,(or (file-name "git" deps) ""))
567                      ("@GUILE@" . ,guile)
568                      ("@GUIX@" . ,(or (file-name "guix" deps) ""))
569                      ("@HELP2MAN@" . ,(or (file-name "help2man" deps) ""))
570                      ("@MAKEINFO@" . ,(or (file-name "makeinfo" deps) ""))
571                      ("@MES_FOR_BUILD@" . ,(or (file-name "mes" deps)
572                                                guile))
573                      ("@MES_SEED@" . ,(or mes-seed ""))
574                      ("@PERL@" . ,(or (file-name "perl" deps) ""))
575                      ("@SHELL@" . ,(or (file-name "sh" deps) ""))
576
577                      ("@CFLAGS@" . ,(or (getenv "CFLAGS") ""))
578                      ("@HEX2FLAGS@" . ,(or (getenv "HEX2FLAGS") ""))
579                      ("@M1FLAGS@" . ,(or (getenv "M1FLAGS") ""))
580
581                      ("mes/module/" . ,(string-append moduledir/))
582                      ,@(map
583                         (lambda (o)
584                           (cons (string-append "@" (variable-name o) "@") (or (format #f "~a" (dependency-file-name o)) "")))
585                         deps))))
586
587         (when (and (not cc)
588                    (not mes-seed))
589           (format (current-error-port) "must supply C compiler or MES_SEED/x86-mes/mes.S\n")
590           (exit 2))
591         (for-each (lambda (o)
592                     (let* ((src (string-append srcdest o))
593                            (target (string-drop-right o 3))
594                            (target (if (not (string-prefix? "build-aux/" target)) target
595                                        (string-drop target (string-length "build-aux/")))))
596                       (substitute src pairs #:target target)))
597                   '(
598                     "build-aux/GNUmakefile.in"
599                     "build-aux/config.status.in"
600                     "build-aux/build.sh.in"
601                     "build-aux/bootstrap.sh.in"
602                     "build-aux/check.sh.in"
603                     "build-aux/install.sh.in"
604                     "build-aux/pre-inst-env.in"
605                     "build-aux/uninstall.sh.in"
606                     "mes/module/mes/boot-0.scm.in"
607                     "scripts/mescc.scm.in"
608                     "scripts/mescc.in"
609                     ))
610         (chmod "pre-inst-env" #o755)
611         (chmod "scripts/mescc" #o755)
612         (chmod "scripts/mescc.scm" #o755)
613         (chmod "build.sh" #o755)
614         (chmod "bootstrap.sh" #o755)
615         (chmod "check.sh" #o755)
616         (chmod "install.sh" #o755)
617         (chmod "uninstall.sh" #o755)
618         (substitute (string-append srcdest "build-aux/config.make.in") pairs #:target ".config.make"))
619
620       (let ((make (and=> (file-name "make" deps) basename)))
621         (format (current-output-port)
622                 "
623 GNU Mes is configured for ~a
624
625 Run:
626   ~a            to build mes
627   ~a help       for help on other targets\n"
628                 mes-arch
629                 (or make "./build.sh")
630                 (or make "./build.sh"))))))