~ chicken-core (chicken-5) f701e594dd59b8ab4dc04d340e81440f84ae5d9a
commit f701e594dd59b8ab4dc04d340e81440f84ae5d9a
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Nov 13 17:11:52 2018 +0100
Commit: Kooda <kooda@upyum.com>
CommitDate: Sun Nov 18 20:50:25 2018 +0100
Add support for cond-expand and error forms in .egg files.
Adds "cond-expand" and "error" egg specification forms, usable
at both toplevel and component-level. Also revives the "-feature"
option for "chicken-install" to allow configuring build variants or
options during egg installation.
Signed-off-by: Kooda <kooda@upyum.com>
diff --git a/NEWS b/NEWS
index 31fded0f..c643784b 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,9 @@
- It is now possible to quote free variables in type declarations,
which acts as shorthand for `forall' (thanks to "megane")
+- Egg specifications
+ - Allows "cond-expand" and "error" forms in egg specification files.
+
5.0.0
diff --git a/chicken-install.mdoc b/chicken-install.mdoc
index 284e74fc..1b2f940f 100644
--- a/chicken-install.mdoc
+++ b/chicken-install.mdoc
@@ -99,6 +99,10 @@ which has the same format as
This option may be given multiple times.
.It Fl cached
Install given eggs from cache and do not download.
+.It Fl feature , Fl D Ar name
+Register feature
+.Ar name ,
+usable as a condition in cond-expand clauses.
.El
.Sh ENVIRONMENT
Following environment variables change the behaviour of
diff --git a/chicken-install.scm b/chicken-install.scm
index 5774df92..2111695b 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -195,6 +195,8 @@
(data #f #t #t)
(modules #f #f #f)
(component-options #t #f #f)
+ (cond-expand * #t #f)
+ (error * #f #f)
(c-include #f #f #t)
(scheme-include #f #f #t)))
@@ -208,11 +210,15 @@
(error "invalid egg information item" item))
((assq (car item) egg-info-items) =>
(lambda (a)
- (apply (lambda (_ toplevel nested named #!optional validator)
- (cond ((and top? (not toplevel))
+ (apply (lambda (name toplevel nested named #!optional validator)
+ (cond ((and top?
+ (not (eq? toplevel '*))
+ (not toplevel))
(error "egg information item not allowed at toplevel"
item))
- ((and toplevel (not top?))
+ ((and (not (eq? toplevel '*))
+ toplevel
+ (not top?))
(error "egg information item only allowed at toplevel" item))
((and named
(or (null? (cdr item))
@@ -222,7 +228,16 @@
(not (validator (cdr item))))
(error "egg information item has invalid structure" item)))
(when nested
- (validate (if named (cddr item) (cdr item)) #f)))
+ (cond (named (validate (cddr item) #f))
+ ((eq? name 'cond-expand)
+ (for-each
+ (lambda (clause)
+ (unless (and (list? clause)
+ (>= (length clause) 1))
+ (error "invalid syntax in `cond-expand' clause" clause))
+ (validate (cdr clause) top?))
+ (cdr item)))
+ (else (validate (cdr item) #f)))))
a)))
(else (error "unknown egg information item" item))))
info))
@@ -232,7 +247,7 @@
;; utilities
-;; Simpler replacement for SRFI-13's string-suffix?
+;; Simpler replacement for SRFI-13's "string-suffix?"
(define (string-suffix? suffix s)
(let ((len-s (string-length s))
(len-suffix (string-length suffix)))
@@ -1037,6 +1052,7 @@ usage: chicken-install [OPTION ...] [NAME[:VERSION] ...]
-from-list FILENAME install eggs from list obtained by `chicken-status -list'
-v -verbose be verbose
-cached only install from cache
+ -D -feature NAME define build feature
-defaults FILENAME use FILENAME as defaults instead of the installed `setup.defaults'
file
@@ -1075,6 +1091,9 @@ EOF
((equal? arg "-version")
(print (chicken-version))
(exit 0))
+ ((member arg '("-D" "-feature"))
+ (register-feature! (cadr args))
+ (loop (cddr args)))
((equal? arg "-recursive")
(set! retrieve-recursive #t)
(loop (cdr args)))
diff --git a/egg-compile.scm b/egg-compile.scm
index bff0383e..bbf59858 100644
--- a/egg-compile.scm
+++ b/egg-compile.scm
@@ -116,6 +116,25 @@
(list (implib rtarget))))
+;;; check condition in conditional clause
+
+(define (check-condition tst mode link)
+ (define (fail x)
+ (error "invalid conditional expression in `cond-expand' clause"
+ x))
+ (let walk ((x tst))
+ (cond ((and (list? x) (pair? x))
+ (cond ((and (eq? (car x) 'not) (= 2 (length x)))
+ (not (walk (cadr x))))
+ ((eq? 'and (car x)) (every walk (cdr x)))
+ ((eq? 'or (car x)) (any walk (cdr x)))
+ (else (fail x))))
+ ((memq x '(dynamic static)) (memq x link))
+ ((memq x '(target host)) (memq x mode))
+ ((symbol? x) (feature? x))
+ (else (fail x)))))
+
+
;;; compile an egg-information tree into abstract build/install operations
(define (compile-egg-info eggfile info version platform mode)
@@ -321,7 +340,11 @@
(for-each walk (cdr info))))
((host)
(when (eq? mode 'host)
- (for-each walk (cdr info))))))
+ (for-each walk (cdr info))))
+ ((error)
+ (apply error (cdr info)))
+ ((cond-expand)
+ (compile-cond-expand info walk))))
(define (compile-data/include info)
(case (car info)
((destination)
@@ -334,6 +357,15 @@
((csc-options) (set! opts (append opts (cdr info))))
((link-options) (set! lopts (append lopts (cdr info))))
(else (error "invalid option specification" info))))
+ (define (compile-cond-expand info walk)
+ (let loop ((clauses (cdr info)))
+ (cond ((null? clauses)
+ (error "no matching clause in `cond-expand' form"
+ info))
+ ((or (eq? 'else (caar clauses))
+ (check-condition (caar clauses) mode link))
+ (for-each walk (cdar clauses)))
+ (else (loop (cdr clauses))))))
(define (->dep x)
(if (name? x) x (error "invalid dependency" x)))
(define (compile info)
diff --git a/manual/Egg specification format b/manual/Egg specification format
index bd7da264..3268f4d6 100644
--- a/manual/Egg specification format
+++ b/manual/Egg specification format
@@ -147,6 +147,28 @@ intended for cross compilation.
Specifies global options for all programs and extensions compiled for this egg.
{{OPTIONSPEC}} may be {{csc-options}} or {{link-options}} specifications.
+==== cond-expand
+
+[egg property] (cond-expand CLAUSE ...)
+
+Conditionally expand egg specification forms, depending on system
+features. Each {{CLAUSE}} should be of the form
+{{(TEST PROPERTY)}} where {{TEST}} is a feature identifier or a
+conditional form, in the same syntax as used in the {{cond-expand}}
+syntactic form.
+
+In addition to normal system-wide feature identifiers, feature identifiers
+given via the {{-feature}} option to {{chicken-install}} are visible in
+the tests. Also, the features {{target}}, {{host}}, {{dynamic}} and
+{{static}} are visible, depending on surrounding egg specification
+forms for constraining mode and linkage.
+
+==== error
+
+[egg property] (error STRING ARG ...)
+
+Signal an error and abort processing. Mostly useful inside {{cond-expand}} forms.
+
=== Components
==== extension
@@ -260,7 +282,6 @@ are set in the execution environment of the script:
* {{CHICKEN_CSC}}: path to {{csc}}
* {{CHICKEN_CSI}}: path to {{csi}}
-
==== csc-options
[egg property] (csc-options OPTION ...)
@@ -359,6 +380,19 @@ Specifies modules that the component (usually an extension) contains.
If this property is not given, then it is assumed that the extension has a single
module of the same name as the component.
+==== cond-expand
+
+ [egg property] (cond-expand CLAUSE ...)
+
+Similar to the toplevel {{cond-expand}} clause and may appear inside
+component specifications.
+
+==== error
+
+ [egg property] (error STRING ARG ...)
+
+Similar to the toplevel {{error}} form, may appear inside component specifications.
+
---
Previous: [[Extension tools]]
diff --git a/manual/Extension tools b/manual/Extension tools
index 8d28a01e..dc0fdcd6 100644
--- a/manual/Extension tools
+++ b/manual/Extension tools
@@ -232,6 +232,7 @@ Available options:
; {{-override FILENAME}} : override versions for installed eggs with information given in {{FILENAME}}, which can be generated by {{-scan}} or by the {{-list}} option of the {{chicken-status}} program
; {{-from-list FILENAME}} : install eggs given in {{FILENAME}}, in the same format as produced by the {{-list}} option in {{chicken-status}}; this option may be given multiple times
; {{-v -verbose}} : be verbose
+; {{-D -feature NAME}} : defines a build feature, that can be tested using {{cond-expand}} in egg specifications
; {{ -defaults FILENAME }} : use {{FILENAME}} as defaults instead of the installed {{setup.defaults}} file
{{chicken-install}} recognizes the {{SUDO}}, {{http_proxy}} and {{proxy_auth}} environment variables, if set.
Trap