>From 38500878dd3e6251c8d4ec0de89209d5c22677c7 Mon Sep 17 00:00:00 2001 From: Evan Hanson Date: Sat, 27 Jul 2019 19:46:43 +1200 Subject: [PATCH] Handle import libraries with static linkage egg property For fully-static extensions, we need to both emit import libraries (so they can be installed to support batch compilation) and compile module registration code into the resulting objects (so the modules work when imported in eval from statically-compiled programs). This isn't possible with the current options, so add a flag and make the `compile-module-registration` setting tri-valued: yes, no, and unset (to keep the default behaviour). The egg toolchain then uses this flag to compile static objects as usual while also emitting import libraries when the static-linkage egg property is used. --- NEWS | 5 +++++ batch-driver.scm | 11 +++++++---- c-platform.scm | 3 ++- chicken.mdoc | 7 +++++-- core.scm | 33 ++++++++++++++++----------------- csc.mdoc | 7 +++++-- csc.scm | 8 ++++++-- egg-compile.scm | 14 ++++++++++---- support.scm | 4 +++- 9 files changed, 59 insertions(+), 33 deletions(-) diff --git a/NEWS b/NEWS index 653f5f0d..c25b4b0b 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,11 @@ - Inline files no longer refer to unexported foreign stub functions (fixes #1440, thanks to "megane"). +- Tools + - The new "-module-registration" options causes module registration + code to always be included in the program, even when it has also + been emitted as a separate file (for example with "-J"). + 5.1.0 diff --git a/batch-driver.scm b/batch-driver.scm index a7d791fd..ac871a8b 100644 --- a/batch-driver.scm +++ b/batch-driver.scm @@ -181,8 +181,10 @@ (initialize-compiler) (set! explicit-use-flag (memq 'explicit-use options)) (set! emit-debug-info (memq 'debug-info options)) - (set! enable-module-registration - (not (memq 'no-module-registration options))) + (when (memq 'module-registration options) + (set! compile-module-registration 'yes)) + (when (memq 'no-module-registration options) + (set! compile-module-registration 'no)) (when (memq 'static options) (set! static-extensions #t) (register-feature! 'chicken-compile-static)) @@ -199,10 +201,11 @@ '() `((uses ,@default-units))) (if (and static-extensions - enable-module-registration (not dynamic) (not unit) - (not explicit-use-flag)) + (not explicit-use-flag) + (or (not compile-module-registration) + (eq? compile-module-registration 'yes))) '((uses eval-modules)) '()))) ,@(if explicit-use-flag diff --git a/c-platform.scm b/c-platform.scm index f5206e91..dff89665 100644 --- a/c-platform.scm +++ b/c-platform.scm @@ -102,7 +102,8 @@ no-bound-checks no-procedure-checks-for-usual-bindings no-compiler-syntax no-parentheses-synonyms no-symbol-escape r5rs-syntax emit-all-import-libraries strict-types clustering lfa2 debug-info - regenerate-import-libraries setup-mode no-module-registration)) + regenerate-import-libraries setup-mode + module-registration no-module-registration)) (define valid-compiler-options-with-argument '(debug emit-link-file diff --git a/chicken.mdoc b/chicken.mdoc index 4e885999..d6324203 100644 --- a/chicken.mdoc +++ b/chicken.mdoc @@ -102,12 +102,15 @@ Macros are made available at run-time. Write compile-time module information into separate file. .It Fl emit-all-import-libraries Emit import-libraries for all defined modules. -.It Fl no-module-registration -Do not generate module registration code. .It Fl no-compiler-syntax Disable expansion of compiler-macros. .It Fl module Ar NAME Wrap compiled code in module of the given name. +.It Fl module-registration +Always generate module registration code, even when import libraries are emitted. +.It Fl no-module-registration +Do not generate module registration code. Overrides +.Fl module-registration . .El .Pp Translation options: diff --git a/core.scm b/core.scm index f74b140f..11ee0507 100644 --- a/core.scm +++ b/core.scm @@ -290,7 +290,7 @@ all-import-libraries preserve-unchanged-import-libraries bootstrap-mode compiler-syntax-enabled emit-closure-info emit-profile enable-inline-files explicit-use-flag - first-analysis no-bound-checks enable-module-registration + first-analysis no-bound-checks compile-module-registration optimize-leaf-routines standalone-executable undefine-shadowed-macros verbose-mode local-definitions enable-specialization block-compilation inline-locally inline-substitutions-enabled strict-variable-types @@ -402,7 +402,7 @@ (define import-libraries '()) (define all-import-libraries #f) (define preserve-unchanged-import-libraries #t) -(define enable-module-registration #t) +(define compile-module-registration #f) ; 'no | 'yes (define standalone-executable #t) (define local-definitions #f) (define inline-locally #f) @@ -1020,21 +1020,20 @@ (print-error-message ex (current-error-port)) (exit 1)) (##sys#finalize-module (##sys#current-module))) - (cond ((or (assq name import-libraries) all-import-libraries) - => (lambda (il) - (emit-import-lib name il) - ;; Remove from list to avoid error - (when (pair? il) - (set! import-libraries - (delete il import-libraries equal?))) - (values (reverse xs) '()))) - ((not enable-module-registration) - (values (reverse xs) '())) - (else - (values - (reverse xs) - (##sys#compiled-module-registration - (##sys#current-module)))))) + (let ((il (or (assq name import-libraries) all-import-libraries))) + (when il + (emit-import-lib name il) + ;; Remove from list to avoid error + (when (pair? il) + (set! import-libraries + (delete il import-libraries equal?)))) + (values + (reverse xs) + (if (or (eq? compile-module-registration 'yes) + (and (not il) ; default behaviour + (not compile-module-registration))) + (##sys#compiled-module-registration (##sys#current-module)) + '())))) (else (loop (cdr body) diff --git a/csc.mdoc b/csc.mdoc index 4b6f733d..61d17c37 100644 --- a/csc.mdoc +++ b/csc.mdoc @@ -107,12 +107,15 @@ Macros are made available at run-time. Write compile-time module information into separate file. .It Fl J , Fl emit-all-import-libraries Emit import-libraries for all defined modules. -.It Fl N , Fl no-module-registration -Do not generate module registration code. .It Fl no-compiler-syntax Disable expansion of compiler-macros. .It Fl m Ar NAME , Fl module Ar NAME Wrap compiled code in module of the given name. +.It Fl M , Fl module-registration +Always generate module registration code, even when import libraries are emitted. +.It Fl N , Fl no-module-registration +Do not generate module registration code. Overrides +.Fl module-registration . .El .Pp Translation options: diff --git a/csc.scm b/csc.scm index 3a3b7ab7..d4ce7fa8 100644 --- a/csc.scm +++ b/csc.scm @@ -151,7 +151,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 -no-elevation -no-module-registration + -emit-all-import-libraries -no-elevation -module-registration -no-module-registration -no-procedure-checks-for-usual-bindings -regenerate-import-libraries -specialize -strict-types -clustering -lfa2 -debug-info -no-procedure-checks-for-toplevel-bindings)) @@ -178,6 +178,7 @@ (|-K| "-keyword-style") (|-X| "-extend") (|-J| "-emit-all-import-libraries") + (|-M| "-module-registration") (|-N| "-no-module-registration") (-x "-explicit-use") (-u "-unsafe") @@ -185,6 +186,7 @@ (-b "-block") (-types "-consult-types-file"))) +;; TODO is this up-to-date? (define short-options (string->list "PHhsfiENxubvwAOeWkctgSJM") ) @@ -365,9 +367,11 @@ Usage: #{csc} [OPTION ...] [FILENAME ...] -j -emit-import-library MODULE write compile-time module information into separate file -J -emit-all-import-libraries emit import-libraries for all defined modules - -no-module-registration do not generate module registration code -no-compiler-syntax disable expansion of compiler-macros -m -module NAME wrap compiled code in a module + -M -module-registration always generate module registration code + -N -no-module-registration never generate module registration code + (overrides `-M') Translation options: diff --git a/egg-compile.scm b/egg-compile.scm index e4e4869e..0fd9c242 100644 --- a/egg-compile.scm +++ b/egg-compile.scm @@ -475,12 +475,13 @@ '()) (if (memq 'static link) ;; if compiling both static + dynamic, override - ;; types-file: + inline-file: properties to + ;; modules/types-file/inline-file properties to ;; avoid generating things twice: (list (apply compile-static-extension (if (memq 'dynamic link) (cons (car data) - (append '(types-file: #f + (append '(modules: #f + types-file: #f inline-file: #f) (cdr data))) data))) @@ -559,7 +560,7 @@ source-dependencies source (options '()) predefined-types eggfile - link-objects + link-objects modules custom types-file inline-file) srcdir platform) (let* ((cmd (qs* (or (custom-cmd custom srcdir platform) @@ -594,7 +595,11 @@ platform))) (targets (append (list out3 lfile) (maybe types-file tfile) - (maybe inline-file ifile))) + (maybe inline-file ifile) + (map (lambda (m) + (qs* (prefix srcdir (conc m ".import.scm")) + platform)) + (or modules '())))) (src (qs* (or source (conc name ".scm")) platform))) (when custom (prepare-custom-command cmd platform)) @@ -606,6 +611,7 @@ " : " cmd (if keep-generated-files " -k" "") " -regenerate-import-libraries" + (if modules " -J" "") " -M" " -setup-mode -static -I " srcdir " -emit-link-file " lfile (if (eq? mode 'host) " -host" "") diff --git a/support.scm b/support.scm index 1d078ca0..53dcbf99 100644 --- a/support.scm +++ b/support.scm @@ -1726,9 +1726,11 @@ Usage: chicken FILENAME [OPTION ...] -emit-import-library MODULE write compile-time module information into separate file -emit-all-import-libraries emit import-libraries for all defined modules - -no-module-registration do not generate module registration code -no-compiler-syntax disable expansion of compiler-macros -module NAME wrap compiled code in a module + -module-registration always generate module registration code + -no-module-registration never generate module registration code + (overrides `-module-registration') Translation options: -- 2.22.0