~ 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-syntaxTrap