~ chicken-core (chicken-5) a9fcaf7f59a3379fc5389534a9a605ed894f232f
commit a9fcaf7f59a3379fc5389534a9a605ed894f232f
Author: Evan Hanson <evhan@foldling.org>
AuthorDate: Sun Jun 10 08:19:44 2018 +1200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Sun Jun 10 10:16:26 2018 +0200
Link with static objects named "${x}.static.o" in setup mode
When building an egg, the generated installation script gives static
objects a "static.o" file extension, to avoid collisions with other
build artifacts. To account for this, teach csc.scm about setup-mode and
make it check for both "o" and "static.o" files when that's enabled.
Then, because link file entries do not actually correspond 1:1 with
filenames, drop the file extensions from that list and make them library
names instead. This makes them easier to transform into filenames when
looking for object files, and makes generating the link files simpler
too.
Finally, make sure generated object files are always given as the first
arguments to the linker by *prepending* the files for linked extensions
to the list of object-files, rather than appending (see csc.scm:923).
Fixes #1468.
Signed-off-by: felix <felix@call-with-current-continuation.org>
diff --git a/core.scm b/core.scm
index f0c88f76..a09ba4af 100644
--- a/core.scm
+++ b/core.scm
@@ -1766,10 +1766,8 @@
;;; Register statically linked extension
-(define (register-static-extension id path)
- (set! linked-static-extensions
- (cons (pathname-strip-directory path)
- linked-static-extensions)))
+(define (register-static-extension id)
+ (set! linked-static-extensions (cons id linked-static-extensions)))
;;; Create entry procedure:
diff --git a/csc.scm b/csc.scm
index c9d7c969..2c3c4ce6 100644
--- a/csc.scm
+++ b/csc.scm
@@ -107,6 +107,7 @@
(define executable-extension "")
(define compile-output-flag "-o ")
(define shared-library-extension ##sys#load-dynamic-extension)
+(define static-object-extension (##sys#string-append "static." object-extension))
(define default-translation-optimization-options '())
(define pic-options (if (or mingw cygwin) '("-DPIC") '("-fPIC" "-DPIC")))
(define generate-manifest #f)
@@ -148,7 +149,7 @@
-analyze-only -keep-shadowed-macros -inline-global -ignore-repository
-no-symbol-escape -no-parentheses-synonyms -r5rs-syntax
-no-argc-checks -no-bound-checks -no-procedure-checks -no-compiler-syntax
- -emit-all-import-libraries -setup-mode -no-elevation -no-module-registration
+ -emit-all-import-libraries -no-elevation -no-module-registration
-no-procedure-checks-for-usual-bindings
-specialize -strict-types -clustering -lfa2 -debug-info
-no-procedure-checks-for-toplevel-bindings))
@@ -292,11 +293,14 @@
(destination-repository 'target)))
(define (find-object-file name)
- (let ((o (make-pathname #f name object-extension)))
+ (let ((o (make-pathname #f name object-extension))
+ ;; In setup mode, objects in build dir may also end with "static.o"
+ (static-o (make-pathname #f name static-object-extension)))
(or (file-exists? o)
+ (and (eq? ##sys#setup-mode #t)
+ (file-exists? static-o))
(and (not ignore-repository)
- (chicken.load#find-file o (repo-path)))
- (stop "could not find linked extension: ~a" name))))
+ (chicken.load#find-file o (repo-path))))))
;;; Display usage information:
@@ -553,7 +557,7 @@ EOF
(exit) )
(when (pair? linked-extensions)
(set! object-files ; add objects from linked extensions
- (append object-files (map find-object-file linked-extensions))))
+ (append (filter-map find-object-file linked-extensions) object-files)))
(cond ((null? scheme-files)
(when (and (null? c-files)
(null? object-files))
@@ -660,6 +664,9 @@ EOF
((-ignore-repository)
(set! ignore-repository #t)
(t-options arg))
+ ((-setup-mode)
+ (set! ##sys#setup-mode #t)
+ (t-options arg))
((-no-elevation)
(set! generate-manifest #t))
[(-gui)
@@ -965,18 +972,23 @@ EOF
transient-link-files)))))
(define (collect-linked-objects ofiles gen-ofiles)
- (define (locate lst)
- (map (lambda (ofile)
- (chicken.load#find-file ofile (repo-path)))
- lst))
+ (define (locate-link-file o)
+ (let* ((p (pathname-strip-extension o))
+ ;; Also strip "static.o" extension when in setup mode:
+ (f (if ##sys#setup-mode (string-chomp p ".static") p)))
+ (file-exists? (make-pathname #f f "link"))))
+ (define (locate-objects libs)
+ (map (lambda (id)
+ (or (find-object-file id)
+ (stop "could not find linked extension: ~A" id)))
+ (map ->string libs)))
(let loop ((os ofiles) (os2 ofiles))
(cond ((null? os)
(delete-duplicates (reverse os2) string=?))
((or static (not (member (car os) gen-ofiles)))
- (let* ((o (car os))
- (lfile (pathname-replace-extension o "link"))
- (newos (if (file-exists? lfile)
- (locate (with-input-from-file lfile read))
+ (let* ((lfile (locate-link-file (car os)))
+ (newos (if lfile
+ (locate-objects (with-input-from-file lfile read))
'())))
(loop (append newos (cdr os)) (append newos os2))))
(else (loop (cdr os) (cons (car os) os2))))))
diff --git a/eval.scm b/eval.scm
index a615fa72..24cfd127 100644
--- a/eval.scm
+++ b/eval.scm
@@ -1327,7 +1327,7 @@
(values `(##sys#load-library (##core#quote ,id)) #f)))
((and compiling? static? (find-static-extension id)) =>
(lambda (path)
- (mark-static id path)
+ (mark-static id)
(values `(##core#declare (uses ,id)) 'static)))
(else
(values `(chicken.load#load-extension
Trap