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