~ chicken-core (chicken-5) 36f71387065e74a14eeb69188099157bbf9d10d6
commit 36f71387065e74a14eeb69188099157bbf9d10d6 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sun Jan 1 15:12:33 2017 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sun Jan 1 15:12:33 2017 +0100 added "install-name", order installed eggs by dependencies, check for dependency cycles, in scripts, cd to builddir. diff --git a/chicken-install.scm b/chicken-install.scm index 7ab4274f..24d88ceb 100644 --- a/chicken-install.scm +++ b/chicken-install.scm @@ -178,6 +178,7 @@ (link-options #f #f #f) (custom-build #f #f #f) (linkage #f #f #f) + (install-name #f #f #f (disjoin string? symbol?)) (target #f #t #f) (host #f #t #f) (types-file #f #f ,optname?) @@ -534,7 +535,7 @@ (append missing upgrade))) dependencies)) (when (pair? missing) - (print " missing: " (string-intersperse missing ", ")) + (d " missing: ~a~%" (string-intersperse missing ", ")) (retrieve-eggs missing)) (when (and (pair? upgrade) (or force-install @@ -733,7 +734,9 @@ (install-prefix 'host name info) (install-suffix 'host name info) keepfiles) + (print "building " name) (run-script dir bscript platform) + (print " installing " name) (run-script dir iscript platform sudo: sudo-install) (when run-tests (test-egg egg platform))))) (when target-extension @@ -751,9 +754,19 @@ (install-prefix 'target name info) (install-suffix 'target name info) keepfiles) + (print "building " name " (target)") (run-script dir bscript platform) + (print " installing " name " (target)") (run-script dir iscript platform)))))) - canonical-eggs)) + (order-installed-eggs))) + +(define (order-installed-eggs) + (let* ((dag (reverse (sort-dependencies dependencies string=?))) + (ordered (map (cut assoc <> canonical-eggs) dag))) + (unless quiet + (d "install order:~%") + (pp dag)) + ordered)) (define (test-egg egg platform) (let* ((name (car egg)) @@ -780,14 +793,10 @@ (print script) #t) (else - (let ((old (current-directory))) - (change-directory dir) - (d "running script ~a~%" script) - (let ((r (if (eq? platform 'windows) - (exec script stop) - (exec (string-append (if sudo "sudo " "") "sh " script) stop)))) - (change-directory old) - r))))) + (d "running script ~a~%" script) + (if (eq? platform 'windows) + (exec script stop) + (exec (string-append (if sudo "sudo " "") "sh " script) stop))))) (define (write-info name info mode) (d "writing info for egg ~a~%" name info) diff --git a/egg-compile.scm b/egg-compile.scm index 01eb5433..488c404a 100644 --- a/egg-compile.scm +++ b/egg-compile.scm @@ -55,10 +55,20 @@ ((unix) "rm -f") ((windows) "del /f /q"))) +(define (cd-command platform) "cd") + (define (uses-compiled-import-library? mode) (not (and (eq? mode 'host) staticbuild))) +;;; topological sort with cycle check + +(define (sort-dependencies dag eq) + (condition-case (topological-sort dag eq) + ((exn runtime cycle) + (error "cyclic dependencies" dag)))) + + ;;; compile an egg-information tree into abstract build/install operations (define (compile-egg-info info platform mode) @@ -73,6 +83,7 @@ (files '()) (ifiles '()) (cbuild #f) + (oname #f) (link '()) (dest #f) (deps '()) @@ -102,6 +113,7 @@ (tfile #f) (ifile #f) (lopts '()) + (oname #f) (opts '())) (for-each compile-extension/program (cddr info)) (let ((dest (destination-repository mode))) @@ -122,7 +134,9 @@ (set! exts (cons (list target dependencies: deps source: src options: opts link-options: lopts linkage: link custom: cbuild - mode: mode types-file: tfile inline-file: ifile) exts)))) + mode: mode types-file: tfile inline-file: ifile + output-file: (or oname target)) + exts)))) ((data) (fluid-let ((target (check-target (cadr info) data)) (dest #f) @@ -180,6 +194,7 @@ (src #f) (link default-program-linkage) (lopts '()) + (oname #f) (opts '())) (for-each compile-extension/program (cddr info)) (let ((dest (if (eq? mode 'target) default-bindir host-bindir))) @@ -187,7 +202,7 @@ (set! prgs (cons (list target dependencies: deps source: src options: opts link-options: lopts linkage: link custom: cbuild - mode: mode) + mode: mode output-file: (or oname target)) prgs)))))) (define (compile-extension/program info) (case (car info) @@ -207,6 +222,8 @@ (set! lopts (append lopts (cdr info)))) ((source) (set! src (->string (arg info 1 name?)))) + ((install-name) + (set! oname (->string (arg info 1 name?)))) ((dependencies) (set! deps (append deps (map ->dep (cdr info))))))) (define (compile-data/include info) @@ -251,7 +268,7 @@ (for-each compile info) ;; sort topologically, by dependencies (let* ((all (append prgs exts genfiles)) - (order (reverse (topological-sort + (order (reverse (sort-dependencies (map (lambda (dep) (cons (car dep) (filter-deps (car dep) @@ -323,23 +340,28 @@ ;;; shell code generation - build operations (define ((compile-static-extension name #!key mode dependencies source - (options '()) custom) srcdir platform) + (options '()) custom) + srcdir platform) (let* ((cmd (or (and custom (prefix-custom-command custom)) (conc default-csc " -D compiling-extension -c -J -unit " name " -D compiling-static-extension"))) (sname (prefix srcdir name)) (ssname (and source (prefix srcdir source))) - (out (quotearg (target-file (conc sname (object-extension platform)) mode))) + (out (quotearg (target-file (conc sname + (object-extension platform)) + mode))) (src (quotearg (or ssname (conc sname ".scm"))))) (print "\n" (slashify default-builder platform) " " out " " cmd (if keep-generated-files " -k" "") + " -setup-mode" " -I " srcdir " -C -I" srcdir (arglist options) " " src " -o " out " : " src #;(arglist dependencies)))) (define ((compile-dynamic-extension name #!key mode dependencies mode source (options '()) (link-options '()) - custom) srcdir platform) + custom) + srcdir platform) (let* ((cmd (or (and custom (prefix-custom-command custom)) (conc default-csc " -D compiling-extension -J -s"))) (sname (prefix srcdir name)) @@ -348,13 +370,15 @@ (src (quotearg (or ssname (conc sname ".scm"))))) (print "\n" (slashify default-builder platform) " " out " " cmd (if keep-generated-files " -k" "") + " -setup-mode" " -I " srcdir " -C -I" srcdir (arglist options) (arglist link-options) " " src " -o " out " : " src #;(arglist dependencies)))) (define ((compile-import-library name #!key dependencies source mode (options '()) (link-options '()) - custom) srcdir platform) + custom) + srcdir platform) (let* ((cmd (or (and custom (prefix-custom-command custom)) (conc default-csc " -s"))) (sname (prefix srcdir name)) @@ -363,13 +387,15 @@ (src (quotearg (or source (conc sname ".import.scm"))))) (print "\n" (slashify default-builder platform) " " out " " cmd (if keep-generated-files " -k" "") + " -setup-mode" " -I " srcdir " -C -I" srcdir (arglist options) (arglist link-options) " " src " -o " out " : " src #;(arglist dependencies)))) (define ((compile-dynamic-program name #!key dependencies source mode (options '()) (link-options '()) - custom) srcdir platform) + custom) + srcdir platform) (let* ((cmd (or (and custom (prefix-custom-command custom)) default-csc)) (sname (prefix srcdir name)) @@ -380,13 +406,15 @@ (src (quotearg (or ssname (conc sname ".scm"))))) (print "\n" (slashify default-builder platform) " " out " " cmd (if keep-generated-files " -k" "") + " -setup-mode" " -I " srcdir " -C -I" srcdir (arglist options) (arglist link-options) " " src " -o " out " : " src #;(arglist dependencies)))) (define ((compile-static-program name #!key dependencies source (options '()) (link-options '()) - custom mode) srcdir platform) + custom mode) + srcdir platform) (let* ((cmd (or (and custom (prefix-custom-command custom)) (conc default-csc " -static-libs"))) (sname (prefix srcdir name)) @@ -397,6 +425,7 @@ (src (quotearg (or ssname (conc sname ".scm"))))) (print "\n" (slashify default-builder platform) " " out " " cmd (if keep-generated-files " -k" "") + " -setup-mode" " -I " srcdir " -C -I" srcdir (arglist options) (arglist link-options) " " src " -o " out " : " src #;(arglist dependencies)))) @@ -407,13 +436,15 @@ (sname (prefix srcdir name)) (ssname (and source (prefix srcdir source))) (out (quotearg (or ssname sname)))) - (print "\n" (slashify default-builder platform) " " out " " cmd " : " + (print "\n" (slashify default-builder platform) + " " out " " cmd " : " #;(arglist dependencies)))) ;; installation operations -(define ((install-static-extension name #!key mode) srcdir platform) +(define ((install-static-extension name #!key mode output-file) + srcdir platform) (let* ((cmd (install-file-command platform)) (mkdir (mkdir-command platform)) (ext (object-extension platform)) @@ -423,10 +454,14 @@ (dfile (quotearg dest)) (ddir (shell-variable "DESTDIR" platform))) (print "\n" mkdir " " ddir dfile) - (print cmd " " out " " ddir (quotearg (slashify (conc dest "/" name ext) + (print cmd " " out " " ddir (quotearg (slashify (conc dest "/" + output-file + ext) platform))))) -(define ((install-dynamic-extension name #!key mode (ext ".so")) srcdir platform) +(define ((install-dynamic-extension name #!key mode (ext ".so") + output-file) + srcdir platform) (let* ((cmd (install-executable-command platform)) (dcmd (remove-file-command platform)) (mkdir (mkdir-command platform)) @@ -435,16 +470,21 @@ (dest (destination-repository mode)) (dfile (quotearg (slashify dest platform))) (ddir (shell-variable "DESTDIR" platform)) - (destf (quotearg (slashify (conc dest "/" name ext) platform)))) + (destf (quotearg (slashify (conc dest "/" output-file ext) + platform)))) (print "\n" mkdir " " ddir dfile) (when (eq? platform 'unix) (print dcmd " " ddir destf)) (print cmd " " out " " ddir destf))) -(define ((install-import-library name #!key mode) srcdir platform) - ((install-dynamic-extension name mode: mode ext: ".import.so") srcdir platform)) +(define ((install-import-library name #!key mode output-file) + srcdir platform) + ((install-dynamic-extension name mode: mode ext: ".import.so" + output-file: output-file) + srcdir platform)) -(define ((install-import-library-source name #!key mode) srcdir platform) +(define ((install-import-library-source name #!key mode output-file) + srcdir platform) (let* ((cmd (install-executable-command platform)) (mkdir (mkdir-command platform)) (sname (prefix srcdir name)) @@ -454,9 +494,11 @@ (ddir (shell-variable "DESTDIR" platform))) (print "\n" mkdir " " ddir dfile) (print cmd " " out " " ddir - (quotearg (slashify (conc dest "/" name ".import.scm") platform))))) + (quotearg (slashify (conc dest "/" output-file ".import.scm") + platform))))) -(define ((install-types-file name #!key mode types-file) srcdir platform) +(define ((install-types-file name #!key mode types-file) + srcdir platform) (let* ((cmd (install-executable-command platform)) (mkdir (mkdir-command platform)) (sname (prefix srcdir name)) @@ -466,9 +508,11 @@ (ddir (shell-variable "DESTDIR" platform))) (print "\n" mkdir " " ddir dfile) (print cmd " " out " " ddir - (quotearg (slashify (conc dest "/" types-file ".types") platform))))) + (quotearg (slashify (conc dest "/" types-file ".types") + platform))))) -(define ((install-inline-file name #!key mode inline-file) srcdir platform) +(define ((install-inline-file name #!key mode inline-file) + srcdir platform) (let* ((cmd (install-executable-command platform)) (mkdir (mkdir-command platform)) (sname (prefix srcdir name)) @@ -478,9 +522,10 @@ (ddir (shell-variable "DESTDIR" platform))) (print "\n" mkdir " " ddir dfile) (print cmd " " out " " ddir - (quotearg (slashify (conc dest "/" inline-file ".types") platform))))) + (quotearg (slashify (conc dest "/" inline-file ".types") + platform))))) -(define ((install-program name #!key mode) srcdir platform) +(define ((install-program name #!key mode output-file) srcdir platform) (let* ((cmd (install-executable-command platform)) (dcmd (remove-file-command platform)) (mkdir (mkdir-command platform)) @@ -490,25 +535,33 @@ (dest (if (eq? mode 'target) default-bindir host-bindir)) (dfile (quotearg (slashify dest platform))) (ddir (shell-variable "DESTDIR" platform)) - (destf (quotearg (slashify (conc dest "/" name ext) platform)))) + (destf (quotearg (slashify (conc dest "/" output-file ext) + platform)))) (print "\n" mkdir " " ddir dfile) (when (eq? platform 'unix) (print dcmd " " ddir destf)) (print cmd " " out " " ddir destf))) -(define ((install-data name #!key files destination mode) srcdir platform) +(define ((install-data name #!key files destination mode) + srcdir platform) (let* ((cmd (install-file-command platform)) (mkdir (mkdir-command platform)) - (dest (or destination (if (eq? mode 'target) default-sharedir host-sharedir))) + (dest (or destination (if (eq? mode 'target) + default-sharedir + host-sharedir))) (dfile (quotearg (slashify dest platform))) (ddir (shell-variable "DESTDIR" platform))) (print "\n" mkdir " " ddir dfile) - (print cmd (arglist (map (cut prefix srcdir <>) files)) " " ddir dfile))) + (print cmd (arglist (map (cut prefix srcdir <>) files)) " " ddir + dfile))) -(define ((install-c-include name #!key deps files destination mode) srcdir platform) +(define ((install-c-include name #!key deps files destination mode) + srcdir platform) (let* ((cmd (install-file-command platform)) (mkdir (mkdir-command platform)) - (dest (or destination (if (eq? mode 'target) default-incdir host-incdir))) + (dest (or destination (if (eq? mode 'target) + default-incdir + host-incdir))) (dfile (quotearg (slashify dest platform))) (ddir (shell-variable "DESTDIR" platform))) (print "\n" mkdir " " ddir dfile) @@ -522,6 +575,8 @@ (with-output-to-file dest (lambda () (prefix platform) + (print (cd-command platform) + " " (quotearg (slashify srcdir platform))) (for-each (lambda (cmd) (cmd srcdir platform)) cmds)Trap