~ chicken-core (chicken-5) 15f900e4404e2a4cd7faf9b8073184c0620d7b90


commit 15f900e4404e2a4cd7faf9b8073184c0620d7b90
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Nov 25 16:03:00 2017 +0100
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Sat Dec 2 15:34:40 2017 +0100

    Improve using custom build scripts
    
    Refactored common "recursive" egg properties; custom build commands
    are made executable and are prefixed with the source directory. Also
    add bindir to the PATH. In build scripts CHICKEN_CC and CHICKEN_CXX
    are set to point to the required C/C++ compilers.
    
    Signed-off-by: Peter Bex <peter@more-magic.net>

diff --git a/chicken-install.scm b/chicken-install.scm
index 09580d35..17af8116 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -201,6 +201,7 @@
     (data #f #t #t)
     (modules #f #f #f)
     (c-include #f #f #t)
+    (only #f #t #t)
     (scheme-include #f #f #t)))
 
 (define (validate-egg-info info)
@@ -886,17 +887,17 @@
   (exec (if (eq? platform 'windows)
             script
             (string-append
-              (if sudo 
-                  (string-append sudo-program " ")
-                  "")
-              (let ((dyld (and (eq? (software-version) 'macosx)
-                               (get-environment-variable "DYLD_LIBRARY_PATH"))))
-                (if dyld
-                    (string-append "/usr/bin/env DYLD_LIBRARY_PATH="
-                                   (qs dyld)
-                                   " ")
-                    ""))
-              "sh " script))
+             (if sudo
+                 (string-append sudo-program " ")
+                 "")
+             (let ((dyld (and (eq? (software-version) 'macosx)
+                              (get-environment-variable "DYLD_LIBRARY_PATH"))))
+               (if dyld
+                   (string-append "/usr/bin/env DYLD_LIBRARY_PATH="
+                                  (qs dyld)
+                                  " ")
+                   ""))
+             "sh " script))
         stop))
 
 (define (write-info name info mode)
diff --git a/egg-compile.scm b/egg-compile.scm
index 55b19b20..a6e0f571 100644
--- a/egg-compile.scm
+++ b/egg-compile.scm
@@ -151,8 +151,6 @@
       files)
     (define (compile-component info)
       (case (car info)
-        ((target) (when (eq? mode 'target) (for-each compile-component (cdr info))))
-        ((host) (when (eq? mode 'host) (for-each compile-component (cdr info))))
         ((extension)
           (fluid-let ((target (check-target (cadr info) exts))
                       (deps '())
@@ -269,13 +267,10 @@
 		(cons (list target dependencies: deps source: src options: opts
 			    link-options: lopts linkage: link custom: cbuild
 			    mode: mode output-file: rtarget)
-		      prgs)))))))
+		      prgs)))))
+        (else (compile-common info compile-component))))
     (define (compile-extension/program info)
       (case (car info)
-        ((target) 
-          (when (eq? mode 'target) (for-each compile-extension/program (cdr info))))
-        ((host) 
-          (when (eq? mode 'host) (for-each compile-extension/program (cdr info))))
         ((linkage) 
          (set! link (cdr info)))
         ((types-file)
@@ -303,22 +298,29 @@
         ((modules)
          (set! mods (map ->string (cdr info))))
         ((dependencies)
-         (set! deps (append deps (map ->dep (cdr info)))))))
+         (set! deps (append deps (map ->dep (cdr info)))))
+        (else (compile-common info compile-extension/program))))
+    (define (compile-common info walk)
+      (case (car info)
+        ((target)
+         (when (eq? mode 'target)
+           (for-each walk (cdr info))))
+        ((host)
+         (when (eq? mode 'host)
+           (for-each walk (cdr info))))))
     (define (compile-data/include info)
       (case (car info)
-        ((target) (when (eq? mode 'target) (for-each compile-data/include (cdr info))))
-        ((host) (when (eq? mode 'host) (for-each compile-data/include (cdr info))))
         ((destination)
          (set! dest (->string (arg info 1 name?))))
         ((files) 
-         (set! files (append files (map ->string (cdr info)))))))
+         (set! files (append files (map ->string (cdr info)))))
+        (else (compile-common info compile-data/include))))
     (define (->dep x)
       (if (name? x) x (error "invalid dependency" x)))
     (define (compile info)
       (case (car info)
-        ((target) (when (eq? mode 'target) (for-each compile (cdr info))))
-        ((host) (when (eq? mode 'host) (for-each compile (cdr info))))
-        ((components) (for-each compile-component (cdr info)))))
+        ((components) (for-each compile-component (cdr info)))
+        (else (compile-common info compile))))
     (define (arg info n #!optional (pred (constantly #t)))
       (when (< (length info) n)
         (error "missing argument" info n))
@@ -440,7 +442,7 @@
                                    predefined-types
                                    custom types-file inline-file)
          srcdir platform)
-  (let* ((cmd (or (and custom (prefix-custom-command custom))
+  (let* ((cmd (or (and custom (prefix srcdir custom))
                   default-csc))
          (sname (prefix srcdir name))
          (ssname (and source (prefix srcdir source)))
@@ -461,6 +463,8 @@
                                            (object-extension platform))
                                      mode)))
          (src (quotearg (or ssname (conc sname ".scm")))))
+    (when custom
+      (prepare-custom-command cmd platform))
     (print "\n" (slashify default-builder platform) " " out " " cmd 
            (if keep-generated-files " -k" "")
            " -setup-mode -static -I " srcdir 
@@ -478,7 +482,7 @@
                                     predefined-types
                                     custom types-file inline-file)
          srcdir platform)
-  (let* ((cmd (or (and custom (prefix-custom-command custom)) 
+  (let* ((cmd (or (and custom (prefix srcdir custom))
                   default-csc))
          (sname (prefix srcdir name))
          (opts (append (if (null? options)
@@ -496,6 +500,8 @@
          (ssname (and source (prefix srcdir source)))
          (out (quotearg (target-file (conc sname ".so") mode)))
          (src (quotearg (or ssname (conc sname ".scm")))))
+    (when custom
+      (prepare-custom-command cmd platform))
     (print "\n" (slashify default-builder platform) " " out " " cmd 
            (if keep-generated-files " -k" "")
            (if (eq? mode 'host) " -host" "")
@@ -508,7 +514,7 @@
                                  (options '()) (link-options '())
                                  custom)
          srcdir platform)
-  (let* ((cmd (or (and custom (prefix-custom-command custom))
+  (let* ((cmd (or (and custom (prefix srcdir custom))
                   default-csc))
          (sname (prefix srcdir name))
          (opts (if (null? options) 
@@ -516,6 +522,8 @@
                    options))
          (out (quotearg (target-file (conc sname ".import.so") mode)))
          (src (quotearg (conc sname ".import.scm"))))
+    (when custom
+      (prepare-custom-command cmd platform))
     (print "\n" (slashify default-builder platform) " " out " " cmd 
            (if keep-generated-files " -k" "")
            " -setup-mode -s"
@@ -528,7 +536,7 @@
                                      (options '()) (link-options '())
                                      custom)
          srcdir platform)
-  (let* ((cmd (or (and custom (prefix-custom-command custom))
+  (let* ((cmd (or (and custom (prefix srcdir custom))
                   default-csc))
          (sname (prefix srcdir name))
          (ssname (and source (prefix srcdir source)))
@@ -539,6 +547,8 @@
                                            (executable-extension platform)) 
                                      mode)))
          (src (quotearg (or ssname (conc sname ".scm")))))
+    (when custom
+      (prepare-custom-command cmd platform))
     (print "\n" (slashify default-builder platform) " " out " " cmd 
            (if keep-generated-files " -k" "")
            " -setup-mode"
@@ -551,7 +561,7 @@
                                     (options '()) (link-options '())
                                     custom mode)
          srcdir platform)
-  (let* ((cmd (or (and custom (prefix-custom-command custom))
+  (let* ((cmd (or (and custom (prefix srcdir custom))
                   default-csc))
          (sname (prefix srcdir name))
          (ssname (and source (prefix srcdir source)))
@@ -562,6 +572,8 @@
                                            (executable-extension platform)) 
                                      mode)))
          (src (quotearg (or ssname (conc sname ".scm")))))
+    (when custom
+      (prepare-custom-command cmd platform))
     (print "\n" (slashify default-builder platform) " " out " " cmd 
            (if keep-generated-files " -k" "")
            (if (eq? mode 'host) " -host" "")
@@ -572,10 +584,12 @@
 
 (define ((compile-generated-file name #!key dependencies source custom) 
          srcdir platform)
-  (let* ((cmd (prefix-custom-command custom))
+  (let* ((cmd (prefix srcdir custom))
          (sname (prefix srcdir name))
          (ssname (and source (prefix srcdir source)))
          (out (quotearg (or ssname sname))))
+    (when custom
+      (prepare-custom-command cmd platform))
     (print "\n" (slashify default-builder platform)
            " " out " " cmd " : "
            #;(arglist dependencies))))
@@ -739,14 +753,20 @@
      (printf #<<EOF
 #!/bin/sh~%
 set -e
+PATH="~a":$PATH
+CHICKEN_CC="~a"
+CHICKEN_CXX="~a"
 
 EOF
-             ))
+             default-bindir default-cc default-cxx))
     ((windows)
      (printf #<<EOF
 @echo off~%
+set PATH=~a;%PATH%
+set CHICKEN_CC=~a
+set CHICKEN_CXX=~a
 EOF
-             ))))
+             default-bindir default-cc default-cxx))))
 
 (define ((build-suffix mode name info) platform)
   (case platform
@@ -841,13 +861,6 @@ EOF
     ((unix) (string-append "${" var "}"))
     ((windows) (string-append "%" var "%"))))
   
-(define (prefix-custom-command cmd)
-  (cond ((irregex-match "^csi( .+)$" cmd) =>
-         (lambda (m) (string-append default-csi (irregex-match-substring m 1))))
-        ((irregex-match "^csc( .+)$" cmd) =>
-         (lambda (m) (string-append default-csc (irregex-match-substring m 1))))
-        ((irregex-match "^cc( .+)$" cmd) =>
-         (lambda (m) (string-append default-cc (irregex-match-substring m 1))))
-        ((irregex-match "^c\\+\\+( .+)$" cmd) =>
-         (lambda (m) (string-append default-cxx (irregex-match-substring m 1))))
-        (else cmd)))
+(define (prepare-custom-command cmd platform)
+  (unless (eq? 'windows platform)
+    (print "chmod +x " (quotearg cmd))))
diff --git a/manual/Extensions b/manual/Extensions
index c73b5c4a..0ad06287 100644
--- a/manual/Extensions
+++ b/manual/Extensions
@@ -77,6 +77,9 @@ can also be used to override include- and linker-paths. Each of these variables
 may contain one or more directory names, separated by {{:}} or {{;}} and will
 be passed using {{-I}} and {{-L}} to the C compiler.
 
+Finally, you can use the {{custom-build}} egg file property to use a
+custom script to compile your extension's code. See below for more information.
+
 === Creating eggs
 
 An egg can be created by placing its code and some special
@@ -319,6 +322,14 @@ instead of the default build operations. This property is mandatory
 for components of type {{generated-source-file}}. {{STRING}}
 usually contains a shell command and thus may be platform sensitive.
 
+The script will be made executable on UNIX systems, if necessary,
+and will be invoked like the {{csc}} program and
+is executed with the location of the CHICKEN
+binaries in the {{PATH}}. Also, tjhe environment variables
+{{CHICKEN_CC}} and {{CHICKEN_CXX}} are set to the
+names of the C and C++ compiler that were used for building the 
+system.
+
 ====== csc-options
 
 [egg property] (csc-options OPTION ...)
Trap