~ chicken-core (chicken-5) 36fb9cfe19fc049272cd6f236b4a4ef2317ba119
commit 36fb9cfe19fc049272cd6f236b4a4ef2317ba119 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Dec 22 22:05:01 2022 +0100 Commit: Mario Domenech Goulart <mario@parenteses.org> CommitDate: Wed Feb 15 18:57:10 2023 +0100 Respect component-dependencies in build rules. Component-dependencies determine order of build but do not yet actually force a rebuild of the depending component. This patch adds the output of a component to the build dependencies of depending components. Fixes #1684 Signed-off-by: Mario Domenech Goulart <mario@parenteses.org> diff --git a/NEWS b/NEWS index 1d874890..a1af480b 100644 --- a/NEWS +++ b/NEWS @@ -26,6 +26,9 @@ and TIMESTAMP with an underscore to reduce likelihood of collisions with source files on case-insensitive file systems like on MacOS (#1753, reported by Kon Lovett). + - chicken-install: Fix #1684 (programs that specify + component-dependencies should build-depend on their import + libraries). - Compiler - When emitting types files, the output list is now sorted, to ensure diff --git a/egg-compile.scm b/egg-compile.scm index 9ba45681..99a94fe8 100644 --- a/egg-compile.scm +++ b/egg-compile.scm @@ -49,6 +49,7 @@ (define +link-file-extension+ ".link") (define keep-generated-files #f) +(define dependency-targets '()) ;;; some utilities @@ -588,7 +589,7 @@ ;;; shell code generation - build operations -(define ((compile-static-extension name #!key mode +(define ((compile-static-extension name #!key mode dependencies source-dependencies source (options '()) predefined-types eggfile @@ -620,18 +621,20 @@ (target-file (conc out1 (archive-extension platform)) mode))) + (imps (map (lambda (m) + (prefix srcdir (conc m ".import.scm"))) + (or modules '()))) (targets (append (list out3 lfile) (maybe types-file tfile) (maybe inline-file ifile) - (map (lambda (m) - (prefix srcdir (conc m ".import.scm"))) - (or modules '())))) + imps)) (src (or source (conc name ".scm")))) (when custom (prepare-custom-command cmd platform)) (print-build-command targets `(,@(filelist srcdir source-dependencies) ,src ,eggfile - ,@(if custom (list cmd) '())) + ,@(if custom (list cmd) '()) + ,@(get-dependency-targets dependencies)) `(,cmd ,@(if keep-generated-files '("-k") '()) "-regenerate-import-libraries" ,@(if modules '("-J") '()) "-M" @@ -654,7 +657,7 @@ platform))) (print-end-command platform))) -(define ((compile-dynamic-extension name #!key mode mode +(define ((compile-dynamic-extension name #!key mode mode dependencies source (options '()) (link-options '()) predefined-types eggfile @@ -684,18 +687,21 @@ (object-extension platform)) mode)) link-objects)) + (imps (map (lambda (m) + (prefix srcdir (conc m ".import.scm"))) + modules)) (targets (append (list out) (maybe inline-file ifile) (maybe types-file tfile) - (map (lambda (m) - (prefix srcdir (conc m ".import.scm"))) - modules)))) + imps))) + (add-dependency-target name out) (when custom (prepare-custom-command cmd platform)) (print-build-command targets `(,src ,eggfile ,@(if custom (list cmd) '()) ,@(filelist srcdir lobjs) - ,@(filelist srcdir source-dependencies)) + ,@(filelist srcdir source-dependencies) + ,@(get-dependency-targets dependencies)) `(,cmd ,@(if keep-generated-files '("-k") '()) ,@(if (eq? mode 'host) '("-host") '()) "-D" "compiling-extension" @@ -734,7 +740,7 @@ platform) (print-end-command platform))) -(define ((compile-static-object name #!key mode +(define ((compile-static-object name #!key mode dependencies source-dependencies source (options '()) eggfile custom) @@ -755,7 +761,8 @@ (prepare-custom-command cmd platform)) (print-build-command (list out) `(,@(filelist srcdir source-dependencies) ,src ,eggfile - ,@(if custom (list cmd) '())) + ,@(if custom (list cmd) '()) + ,@(get-dependency-targets dependencies)) `(,cmd "-setup-mode" "-static" "-I" ,srcdir ,@(if (eq? mode 'host) '("-host") '()) "-c" "-C" ,(conc "-I" srcdir) @@ -763,7 +770,7 @@ platform) (print-end-command platform))) -(define ((compile-dynamic-object name #!key mode mode +(define ((compile-dynamic-object name #!key mode mode dependencies source (options '()) eggfile source-dependencies @@ -780,18 +787,20 @@ (object-extension platform)) mode)) (src (or ssname (conc sname ".c")))) + (add-dependency-target name out) (when custom (prepare-custom-command cmd platform)) (print-build-command (list out) `(,src ,eggfile ,@(if custom (list cmd) '()) - ,@(filelist srcdir source-dependencies)) + ,@(filelist srcdir source-dependencies) + ,@(get-dependency-targets dependencies)) `(,cmd ,@(if (eq? mode 'host) '("-host") '()) "-s" "-c" "-C" ,(conc "-I" srcdir) ,@opts ,src "-o" ,out) platform) (print-end-command platform))) -(define ((compile-dynamic-program name #!key source mode +(define ((compile-dynamic-program name #!key source mode dependencies (options '()) (link-options '()) source-dependencies custom eggfile link-objects) @@ -816,7 +825,8 @@ (print-build-command (list out) `(,src ,eggfile ,@(if custom (list cmd) '()) ,@(filelist srcdir source-dependencies) - ,@(filelist srcdir lobjs)) + ,@(filelist srcdir lobjs) + ,@(get-dependency-targets dependencies)) `(,cmd ,@(if keep-generated-files '("-k") '()) "-setup-mode" ,@(if (eq? mode 'host) '("-host") '()) @@ -828,7 +838,7 @@ platform) (print-end-command platform))) -(define ((compile-static-program name #!key source +(define ((compile-static-program name #!key source dependencies (options '()) (link-options '()) source-dependencies custom mode eggfile link-objects) @@ -853,7 +863,8 @@ (print-build-command (list out) `(,src ,eggfile ,@(if custom (list cmd) '()) ,@(filelist srcdir lobjs) - ,@(filelist srcdir source-dependencies)) + ,@(filelist srcdir source-dependencies) + ,@(get-dependency-targets dependencies)) `(,cmd ,@(if keep-generated-files '("-k") '()) ,@(if (eq? mode 'host) '("-host") '()) "-static" "-setup-mode" "-I" ,srcdir @@ -864,15 +875,17 @@ platform) (print-end-command platform))) -(define ((compile-generated-file name #!key source custom +(define ((compile-generated-file name #!key source custom dependencies source-dependencies eggfile) srcdir platform) (let ((cmd (custom-cmd custom srcdir platform)) (out (or source name))) + (add-dependency-target name out) (prepare-custom-command cmd platform) (print-build-command (list out) `(,cmd ,eggfile - ,@(filelist srcdir source-dependencies)) + ,@(filelist srcdir source-dependencies) + ,@(get-dependency-targets dependencies)) (list cmd) platform) (print-end-command platform))) @@ -1041,6 +1054,22 @@ host-incdir))) files mode srcdir platform)) +;; manage dependency-targets + +(define (add-dependency-target target output) + (cond ((assq target dependency-targets) => + (lambda (a) + (set-cdr! a output))) + (else (set! dependency-targets + (cons (cons target output) dependency-targets))))) + +(define (get-dependency-targets targets) + (append-map + (lambda (t) + (cond ((assq t dependency-targets) => (lambda (a) (list (cdr a)))) + (else '()))) + targets)) + ;;; Generate shell or batch commands from abstract build/install operationsTrap