~ chicken-core (chicken-5) 58f5296386f84162744472e68bee94738de2a5e0
commit 58f5296386f84162744472e68bee94738de2a5e0
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Dec 10 20:53:15 2016 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Sat Dec 10 20:53:15 2016 +0100
changed semantcis of -static option in csc, added -static to chicken
diff --git a/batch-driver.scm b/batch-driver.scm
index 327d6166..ffdbd0b1 100644
--- a/batch-driver.scm
+++ b/batch-driver.scm
@@ -327,6 +327,9 @@
(set! explicit-use-flag #t)
(set! cleanup-forms '())
(set! initforms '()) )
+ (when (memq 'static options)
+ (set! static-extensions #t)
+ (register-feature! 'chicken-compile-static))
(when (memq 'no-lambda-info options)
(set! emit-closure-info #f) )
(when (memq 'no-compiler-syntax options)
diff --git a/c-platform.scm b/c-platform.scm
index f77c046d..fdf4a59e 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -98,7 +98,7 @@
compile-syntax tag-pointers accumulate-profile
disable-stack-overflow-checks raw specialize
emit-external-prototypes-first release local inline-global
- analyze-only dynamic
+ analyze-only dynamic static
no-argc-checks no-procedure-checks no-parentheses-synonyms
no-procedure-checks-for-toplevel-bindings
no-bound-checks no-procedure-checks-for-usual-bindings no-compiler-syntax
diff --git a/chicken.mdoc b/chicken.mdoc
index d9e6736b..33862c57 100644
--- a/chicken.mdoc
+++ b/chicken.mdoc
@@ -117,6 +117,8 @@ do not use units
and
.Sq eval
by default
+.It Fl static
+Link extensions statically
.It Fl check-syntax
stop compilation after macro-expansion
.It Fl analyze-only
diff --git a/core.scm b/core.scm
index db6337da..423da530 100644
--- a/core.scm
+++ b/core.scm
@@ -287,11 +287,13 @@
optimize-leaf-routines standalone-executable undefine-shadowed-macros
verbose-mode local-definitions enable-specialization block-compilation
inline-locally inline-substitutions-enabled strict-variable-types
+ static-extensions
;; These are set by the (batch) driver, and read by the (c) backend
disable-stack-overflow-checking emit-trace-info external-protos-first
external-variables insert-timer-checks no-argc-checks
no-global-procedure-checks no-procedure-checks emit-debug-info
+ linked-static-extensions
;; Other, non-boolean, flags set by (batch) driver
profiled-procedures import-libraries inline-max-size
@@ -393,6 +395,7 @@
(define bootstrap-mode #f)
(define strict-variable-types #f)
(define enable-specialization #f)
+(define static-extensions #f)
;;; Other global variables:
@@ -419,6 +422,7 @@
(define toplevel-lambda-id #f)
(define file-requirements #f)
(define provided '())
+(define linked-static-extensions '())
(define unlikely-variables '(unquote unquote-splicing))
@@ -677,7 +681,11 @@
(let ((id (cadr x))
(alternates (cddr x)))
(let-values (((exp found type)
- (##sys#process-require id #t alternates provided)))
+ (##sys#process-require
+ id #t
+ alternates provided
+ static-extensions
+ register-static-extension)))
(unless (not type)
(##sys#hash-table-update!
file-requirements type
@@ -1677,6 +1685,12 @@
'(##core#undefined) ) ) )
+;;; Register statically linked extension
+
+(define (register-static-extension id path)
+ (set! linked-static-extensions (cons path linked-static-extensions)))
+
+
;;; Create entry procedure:
(define (build-toplevel-procedure node)
diff --git a/csc.mdoc b/csc.mdoc
index 52e26b58..6066d82b 100644
--- a/csc.mdoc
+++ b/csc.mdoc
@@ -273,9 +273,7 @@ on UNIX,
on Windows
.Pc
.It Fl static-libs
-link with static CHICKEN libraries
-.It Fl static
-generate completely statically linked executable
+link with static CHICKEN libraries and extensions
.It Fl F Ns Ar <DIR>
pass
.Dq -F<DIR>
diff --git a/csc.scm b/csc.scm
index e976e888..57d85bc8 100644
--- a/csc.scm
+++ b/csc.scm
@@ -305,27 +305,18 @@
(define to-stdout #f)
(define shared #f)
(define static #f)
-(define static-libs #f)
;;; Locate object files for linking:
(define (find-object-files name)
-
(define (locate-object-file filename repo)
(and-let* ((f (##sys#resolve-include-filename filename '() repo #f)))
(list f)))
-
- (define (static-extension-information name)
- (and-let* ((info (extension-information name))
- (files (alist-ref 'static info eq?)))
- (map (lambda (f) (make-pathname (repository-path) f)) files)))
-
(let ((f (make-pathname #f name object-extension)))
(or (locate-object-file f #f)
(and (not ignore-repository)
- (or (static-extension-information name)
- (locate-object-file f #t)))
+ (locate-object-file f #t))
(stop "couldn't find linked extension: ~a" name))))
@@ -485,9 +476,8 @@ Usage: #{csc} FILENAME | OPTION ...
-lLIBNAME link with given library
(`libLIBNAME' on UNIX,
`LIBNAME.lib' on Windows)
- -static-libs link with static CHICKEN libraries
- -static generate completely statically linked
- executable
+ -static link with static CHICKEN libraries and
+ extensions (if possible)
-F<DIR> pass \"-F<DIR>\" to C compiler
(add framework header path on Mac OS X)
-framework NAME passed to linker on Mac OS X
@@ -633,12 +623,8 @@ EOF
(set! objc-mode #t) ]
[(-static)
(set! translate-options
- (cons* "-feature" "chicken-compile-static" translate-options))
+ (cons "-static" translate-options))
(set! static #t) ]
- [(-static-libs)
- (set! translate-options
- (cons* "-feature" "chicken-compile-static" translate-options))
- (set! static-libs #t) ]
[(-cflags)
(set! inquiry-only #t)
(set! show-cflags #t) ]
@@ -928,6 +914,8 @@ EOF
(set! ofiles (cons fo ofiles))))
rc-files)
(set! object-files (append (reverse ofiles) object-files)) ; put generated object files first
+ ;; scan generated C files for mark indicating static extension files:
+ (for-each process-generated-file-marks c-files)
(unless keep-files
(for-each $delete-file generated-c-files)
(for-each $delete-file generated-rc-files))))
@@ -936,11 +924,34 @@ EOF
(string-intersperse
(map quote-option
(append
- (if (or static static-libs) '() nonstatic-compilation-options)
compilation-optimization-options
compile-options) ) ) )
+;;; Process "marks" in generated C files
+;
+; used for mapping statically linked extensions to .o files
+
+(define (process-generated-file-marks cfile)
+ (define (process-mark exp)
+ (case (car exp)
+ ((static-objects)
+ (set! object-files (append object-files (cdr exp))))
+ ;; ignore others
+ ))
+ (with-input-from-file cfile
+ (lambda ()
+ (let loop ()
+ (let ((line (read-line)))
+ (cond ((eof-object? line))
+ ((string=? "" line)) ;; scan until empty line
+ ((and (> (string-length line) 6)
+ (string=? "/*### " (substring line 0 6)))
+ (process-mark
+ (with-input-from-string (substring line 6) read)))
+ (else (loop))))))))
+
+
;;; Link object files and libraries:
(define (run-linking)
@@ -1007,10 +1018,10 @@ EOF
(define (linker-libraries)
(string-intersperse
(append
- (if (or static static-libs)
+ (if static
library-files
shared-library-files)
- (if (or static static-libs)
+ (if static
(list extra-libraries)
(list extra-shared-libraries)))))
Trap