~ 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 operations
 
Trap