~ruther/guix-local

20d83444dda3ccbb4e8bbff1d4cbfe429eb015f6 — Ludovic Courtès 13 years ago 450ccdc
utils: Remove special `substitute*' syntax for lists of files.

* guix/build/utils.scm (substitute*): Remove special syntax for
  list-of-files; instead, check whether FILE is `list?' at run time.

* distro/packages/base.scm (gcc-4.7, %binutils-static): Adjust
  accordingly.
2 files changed, 44 insertions(+), 36 deletions(-)

M distro/packages/base.scm
M guix/build/utils.scm
M distro/packages/base.scm => distro/packages/base.scm +6 -6
@@ 759,9 759,9 @@ BFD (Binary File Descriptor) library, `gprof', `nm', `strip', etc.")

                 ;; Tell where to find libstdc++, libc, and `?crt*.o', except
                 ;; `crt{begin,end}.o', which come with GCC.
                 (substitute* ("gcc/config/gnu-user.h"
                               "gcc/config/i386/gnu-user.h"
                               "gcc/config/i386/gnu-user64.h")
                 (substitute* '("gcc/config/gnu-user.h"
                                "gcc/config/i386/gnu-user.h"
                                "gcc/config/i386/gnu-user64.h")
                   (("#define LIB_SPEC (.*)$" _ suffix)
                    (format #f "#define LIB_SPEC \"-L~a/lib -rpath=~a/lib \
-rpath=~a/lib64 -rpath=~a/lib \" ~a~%"


@@ 2310,9 2310,9 @@ store.")
                   ;; The `-all-static' libtool flag can only be passed
                   ;; after `configure', since configure tests don't use
                   ;; libtool, and only for executables built with libtool.
                   (substitute* ("binutils/Makefile.in"
                                 "gas/Makefile.in"
                                 "ld/Makefile.in")
                   (substitute* '("binutils/Makefile.in"
                                  "gas/Makefile.in"
                                  "ld/Makefile.in")
                     (("^LDFLAGS =(.*)$" line)
                      (string-append line
                                     "\nAM_LDFLAGS = -static -all-static\n"))))

M guix/build/utils.scm => guix/build/utils.scm +38 -30
@@ 312,10 312,10 @@ evaluated with each MATCH-VAR bound to the corresponding positional regexp
sub-expression.  For example:

  (substitute* file
               ((\"hello\")
                \"good morning\\n\")
               ((\"foo([a-z]+)bar(.*)$\" all letters end)
                (string-append \"baz\" letter end)))
     ((\"hello\")
      \"good morning\\n\")
     ((\"foo([a-z]+)bar(.*)$\" all letters end)
      (string-append \"baz\" letter end)))

Here, anytime a line of FILE contains \"hello\", it is replaced by \"good
morning\".  Anytime a line of FILE matches the second regexp, ALL is bound to


@@ 323,33 323,41 @@ the complete match, LETTERS is bound to the first sub-expression, and END is
bound to the last one.

When one of the MATCH-VAR is `_', no variable is bound to the corresponding
match substring."
    ((substitute* (file ...) clause ...)
     (begin
       (substitute* file clause ...)
       ...))
match substring.

Alternatively, FILE may be a list of file names, in which case they are
all subject to the substitutions."
    ((substitute* file ((regexp match-var ...) body ...) ...)
     (substitute file
                 (list (cons regexp
                             (lambda (l m+)
                               ;; Iterate over matches M+ and return the
                               ;; modified line based on L.
                               (let loop ((m* m+)   ; matches
                                          (o  0)    ; offset in L
                                          (r  '())) ; result
                                 (match m*
                                   (()
                                    (let ((r (cons (substring l o) r)))
                                      (string-concatenate-reverse r)))
                                   ((m . rest)
                                    (let-matches 0 m (match-var ...)
                                      (loop rest
                                            (match:end m)
                                            (cons*
                                             (begin body ...)
                                             (substring l o (match:start m))
                                             r))))))))
                       ...)))))
     (let ()
       (define (substitute-one-file file-name)
         (substitute
          file-name
          (list (cons regexp
                      (lambda (l m+)
                        ;; Iterate over matches M+ and return the
                        ;; modified line based on L.
                        (let loop ((m* m+)  ; matches
                                   (o  0)   ; offset in L
                                   (r  '())) ; result
                          (match m*
                            (()
                             (let ((r (cons (substring l o) r)))
                               (string-concatenate-reverse r)))
                            ((m . rest)
                             (let-matches 0 m (match-var ...)
                               (loop rest
                                     (match:end m)
                                     (cons*
                                      (begin body ...)
                                      (substring l o (match:start m))
                                      r))))))))
                ...)))

       (match file
         ((files (... ...))
          (for-each substitute-one-file files))
         ((? string? f)
          (substitute-one-file f)))))))


;;;