~ chicken-core (chicken-5) a35b0569fa863adc3f274e03c9992411b652272f
commit a35b0569fa863adc3f274e03c9992411b652272f
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Dec 10 20:58:00 2016 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Sat Dec 10 20:58:00 2016 +0100
eval: dropped obscure extension options, depends on egg-information, determine static extensions, if requested
diff --git a/eval.scm b/eval.scm
index 42cb2dec..93ff795c 100644
--- a/eval.scm
+++ b/eval.scm
@@ -65,6 +65,7 @@
(include "common-declarations.scm")
(include "mini-srfi-1.scm")
+(include "egg-information.scm")
(define-syntax d (syntax-rules () ((_ . _) (void))))
@@ -101,6 +102,23 @@
(define-constant setup-file-extension "egg-info")
(define-constant repository-environment-variable "CHICKEN_REPOSITORY")
(define-constant prefix-environment-variable "CHICKEN_PREFIX")
+(define-constant windows-object-file-extension ".obj")
+(define-constant unix-object-file-extension ".o")
+(define-constant loadable-file-extension ".so")
+
+(define object-file-extension
+ (cond ((eq? (software-type) 'windows) windows-object-file-extension)
+ (else unix-object-file-extension)))
+
+(define load-library-extension
+ (cond ((eq? (software-type) 'windows) windows-load-library-extension)
+ ((eq? (software-version) 'macosx) macosx-load-library-extension)
+ ((and (eq? (software-version) 'hpux)
+ (eq? (machine-type) 'hppa)) hppa-load-library-extension)
+ (else default-load-library-extension) ) )
+
+(define ##sys#load-dynamic-extension default-load-library-extension)
+
; these are actually in unit extras, but that is used by default
@@ -703,12 +721,8 @@
[(##core#require-for-syntax)
(let ((id (cadr x)))
(load-extension id)
- (compile
- `(##core#begin
- ,@(map (lambda (x)
- `(##sys#load-extension (##core#quote ,x)))
- (lookup-runtime-requirements id)))
- e #f tf cntr se))]
+ (compile '(##core#undefined)
+ e #f tf cntr se))]
[(##core#require)
(let ((id (cadr x))
@@ -1071,15 +1085,6 @@
(define (load-noisily filename #!key (evaluator #f) (time #f) (printer #f))
(load/internal filename evaluator #t time printer))
-(define load-library-extension ; this is crude...
- (cond [(eq? (software-type) 'windows) windows-load-library-extension]
- [(eq? (software-version) 'macosx) macosx-load-library-extension]
- [(and (eq? (software-version) 'hpux)
- (eq? (machine-type) 'hppa)) hppa-load-library-extension]
- [else default-load-library-extension] ) )
-
-(define ##sys#load-dynamic-extension default-load-library-extension)
-
(define dynamic-load-libraries
(let ((ext
(if uses-soname?
@@ -1261,20 +1266,22 @@
(define (extension-information ext)
(extension-information/internal ext 'extension-information))
-(define (lookup-runtime-requirements id)
- (let ((info (extension-information/internal id #f)))
- (cond ((not info) '())
- ((assq 'require-at-runtime info) => cdr)
- (else '()))))
+(define (static-extension-available? id)
+ (and-let* ((rp (##sys#repository-path)))
+ (let* ((p (##sys#canonicalize-extension-path id #f))
+ (rpath (string-append rp "/" p))
+ (opath (string-append rpath object-file-extension)))
+ (file-exists? opath))))
+
;;
;; Given a library specification, returns three values:
;;
;; - an expression for loading the library, if required
;; - a library id if the library was found, #f otherwise
-;; - a requirement type (e.g. 'dynamic) or #f if provided statically
+;; - a requirement type (e.g. 'dynamic) or #f if provided in core
;;
-(define (##sys#process-require lib #!optional compiling? (alternates '()) (provided '()))
+(define (##sys#process-require lib #!optional compiling? (alternates '()) (provided '()) static mark-static)
(let ((id (library-id lib)))
(cond
((assq id core-unit-requirements) =>
@@ -1291,26 +1298,10 @@
`(##core#declare (uses ,id))
`(##sys#load-library (##core#quote ,id)))
id #f))
- ((extension-information/internal id #f) =>
- (lambda (info)
- (let ((s (assq 'syntax info))
- (nr (assq 'syntax-only info))
- (rr (assq 'require-at-runtime info)))
- (values
- `(##core#begin
- ,@(if (not s)
- '()
- `((##core#require-for-syntax ,id)))
- ,@(if (or nr (and (not rr) s))
- '()
- (map (lambda (id)
- `(##sys#load-extension
- (##core#quote ,id)
- (##core#quote ,alternates)))
- (cond (rr (cdr rr))
- (else (list id))))))
- id
- (if s 'dynamic/syntax 'dynamic)))))
+ ((and compiling? static (static-extension-available? id)) =>
+ (lambda (path)
+ (mark-static id path)
+ (values `(##core#declare (uses ,id)) id 'static)))
(else
(values `(##sys#load-extension
(##core#quote ,id)
diff --git a/rules.make b/rules.make
index 5cad2315..44e212af 100644
--- a/rules.make
+++ b/rules.make
@@ -739,7 +739,7 @@ library.c: $(SRCDIR)library.scm $(SRCDIR)banner.scm $(SRCDIR)common-declarations
-emit-import-library chicken.time
internal.c: $(SRCDIR)internal.scm $(SRCDIR)mini-srfi-1.scm
$(bootstrap-lib) -emit-import-library chicken.internal
-eval.c: $(SRCDIR)eval.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm
+eval.c: $(SRCDIR)eval.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm $(SRCDIR)egg-information.scm
$(bootstrap-lib) -emit-import-library chicken.eval
read-syntax.c: $(SRCDIR)read-syntax.scm $(SRCDIR)common-declarations.scm
$(bootstrap-lib) -emit-import-library chicken.read-syntax
Trap