~ chicken-core (chicken-5) 9c080bbd0be61e8015eff82795e2f386f9816ca3
commit 9c080bbd0be61e8015eff82795e2f386f9816ca3 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Oct 28 21:41:19 2016 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sun Nov 13 11:41:49 2016 +0100 add generated-files, simplify (sort of) building commands diff --git a/egg-compile.scm b/egg-compile.scm index 0ae8fdf3..30e7ddba 100644 --- a/egg-compile.scm +++ b/egg-compile.scm @@ -63,6 +63,7 @@ (let ((exts '()) (prgs '()) (data '()) + (genfiles '()) (cinc '()) (scminc '()) (target #f) @@ -75,14 +76,16 @@ (deps '()) (lopts '()) (opts '()) + (tfile #f) + (ifile #f) (objext (object-extension platform)) (exeext (executable-extension platform))) (define (check-target t lst) (when (member t lst) (error "target multiply defined" t)) t) - (define (addfiles . files) - (set! ifiles (append files ifiles)) + (define (addfiles . filess) + (set! ifiles (concatenate (cons ifiles filess))) files) (define (compile-component info) (case (car info) @@ -94,21 +97,30 @@ (src #f) (cbuild #f) (link default-extension-linkage) + (tfile #f) + (ifile #f) (lopts '()) (opts '())) (for-each compile-extension/program (cddr info)) (let ((dest (destination-repository mode))) + (when (eq? #t tfile) (set! tfile target)) + (when (eq? #t ifile) (set! ifile target)) (addfiles - (if (memq 'static link) (conc dest "/" target objext) '()) - (if (memq 'dynamic link) (conc dest "/" target ".so") '()) - (if (uses-compiled-import-library? mode) - (conc dest "/" target ".import.so") - (conc dest "/" target ".import.scm")))) + (if (memq 'static link) (list (conc dest "/" target objext)) '()) + (if (memq 'dynamic link) (list (conc dest "/" target ".so")) '()) + (if tfile + (list (conc dest "/" tfile ".types")) + '()) + (if ifile + (list (conc dest "/" ifile ".inline")) + '()) + (list (if (uses-compiled-import-library? mode) + (conc dest "/" target ".import.so") + (conc dest "/" target ".import.scm"))))) (set! exts (cons (list target dependencies: deps source: src options: opts link-options: lopts linkage: link custom: cbuild - mode: mode) - exts)))) + mode: mode types-file: tfile inline-file: ifile) exts)))) ((data) (fluid-let ((target (check-target (cadr info) data)) (dest #f) @@ -117,11 +129,22 @@ (let* ((dest (or dest (if (eq? mode 'target) target-sharedir host-sharedir))) (dest (normalize-pathname (conc dest "/")))) - (for-each addfiles (map (cut conc dest <>) files))) + (addfiles (map (cut conc dest <>) files))) (set! data (cons (list target dependencies: '() files: files destination: dest mode: mode) data)))) + ((generated-source-file) + (fluid-let ((target (check-target (cadr info) data)) + (src #f) + (cbuild #f) + (deps '())) + (unless cbuild + (error "generated source files need a custom build step" target)) + (for-each compile-extension/program (cddr info)) + (set! genfiles + (cons (list target dependencies: deps source: src custom: cbuild) + genfiles)))) ((c-include) (fluid-let ((target (check-target (cadr info) cinc)) (dest #f) @@ -130,7 +153,7 @@ (let* ((dest (or dest (if (eq? mode 'target) target-incdir host-incdir))) (dest (normalize-pathname (conc dest "/")))) - (for-each addfiles (map (cut conc dest <>) files))) + (addfiles (map (cut conc dest <>) files))) (set! cinc (cons (list target dependencies: '() files: files destination: dest mode: mode) @@ -143,11 +166,11 @@ (let* ((dest (or dest (if (eq? mode 'target) target-sharedir host-sharedir))) (dest (normalize-pathname (conc dest "/")))) - (for-each addfiles (map (cut conc dest <>) files))) + (addfiles (map (cut conc dest <>) files))) (set! scminc (cons (list target dependencies: '() files: files destination: dest mode: mode) - scminc))) + scminc))) ((program) (fluid-let ((target (check-target (cadr info) prgs)) (deps '()) @@ -158,7 +181,7 @@ (opts '())) (for-each compile-extension/program (cddr info)) (let ((dest (if (eq? mode 'target) target-bindir host-bindir))) - (addfiles (conc dest "/" target exeext))) + (addfiles (list (conc dest "/" target exeext)))) (set! prgs (cons (list target dependencies: deps source: src options: opts link-options: lopts linkage: link custom: cbuild @@ -172,13 +195,15 @@ (when (eq? mode 'host) (for-each compile-extension/program (cdr info)))) ((linkage) (set! link (cdr info))) + ((types-file) + (set! tfile (or (null? (cdr info)) (arg info 1 name?)))) ((custom-build) (set! cbuild (arg info 1 string?))) ((csc-options) (set! opts (append opts (cdr info)))) ((link-options) (set! lopts (append lopts (cdr info)))) - ((source-file) + ((source) (set! src (->string (arg info 1 name?)))) ((dependencies) (set! deps (append deps (map ->dep (cdr info))))))) @@ -217,83 +242,92 @@ (assq dep data) (assq dep cinc) (assq dep scminc) + (assq dep genfiles) (error "unknown component dependency" dep name)))) deps)) ;; collect information (for-each compile info) ;; sort topologically, by dependencies - (let ((order (reverse (topological-sort + (let* ((all (append prgs exts genfiles)) + (order (reverse (topological-sort (map (lambda (dep) (cons (car dep) (filter-deps (car dep) (get-keyword dependencies: (cdr dep))))) - (append prgs exts)) - dep=?)))) + all) + dep=?)))) ;; generate + return build/install commands (values ;; build commands (append (foldr - (lambda (t cmds) - (let* ((data (assq t exts)) - (link (get-keyword linkage: (cdr data)))) + (lambda (data cmds) + (let ((link (get-keyword linkage: (cdr data)))) (append (if (memq 'dynamic link) - `((compile-dynamic-extension ,@data)) + (list (apply compile-dynamic-extension data)) '()) ;; static must come last, as *.o file will be overwritten ;; and removed by dynamic build (meh) (if (memq 'static link) - `((compile-static-extension ,@data)) + (list (apply compile-static-extension data)) '()) (if (uses-compiled-import-library? mode) - `((compile-import-library ,@data)) + (list (apply compile-import-library data)) '()) cmds))) - '() order) + '() exts) (foldr (lambda (prg cmds) (let ((link (get-keyword linkage: (cdr prg)))) (append (if (memq 'dynamic link) - `((compile-dynamic-program ,@prg)) + (list (apply compile-dynamic-program prg)) '()) (if (memq 'static link) - `((compile-static-program ,@prg)) + (list (apply compile-static-program prg)) '()) cmds))) - '() - prgs)) + '() prgs) + (foldr + (lambda (gen cmds) + (cons (apply compile-generated-file gen) cmds)) + '() genfiles)) ;; installation commands (append (append-map (lambda (ext) (let ((link (get-keyword linkage: (cdr ext)))) - (if (memq 'static link) - `((install-static-extension ,@ext)) - '()) - (if (memq 'dynamic link) - `((install-dynamic-extension ,@ext)) - '()))) - exts) - (map (lambda (ext) + (append + (if (memq 'static link) + (list (apply install-static-extension ext)) + '()) + (if (memq 'dynamic link) + (list (apply install-dynamic-extension ext)) + '()) (if (uses-compiled-import-library? (get-keyword mode: ext)) - `(install-import-library ,@ext) - `(install-import-library-source ,@ext))) - exts) - (map (lambda (prg) `(install-program ,@prg)) prgs) - (map (lambda (data) `(install-data ,@data)) data) - (map (lambda (cinc) `(install-c-include ,@cinc)) cinc) - (map (lambda (scminc) `(install-scheme-include ,@scminc)) scminc)) + (list (apply install-import-library ext)) + (list (apply install-import-library-source ext))) + (if (get-keyword types-file: (cdr ext)) + (list (apply install-types-file ext)) + '()) + (if (get-keyword inline-file: (cdr ext)) + (list (apply install-inline-file ext)) + '())))) + exts) + (map (lambda (prg) (apply install-program prg)) prgs) + (map (lambda (data) (apply install-data data)) data) + (map (lambda (cinc) (apply install-c-include cinc)) cinc) + (map (lambda (scminc) (apply install-data scminc)) scminc)) ;; augmented egg-info (cons `(installed-files ,@ifiles) info))))) ;;; shell code generation - build operations -(define (gen-compile-static-extension name #!key mode platform dependencies source - (options '()) custom srcdir) - (let* ((cmd (or custom +(define ((compile-static-extension name #!key mode dependencies source + (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)) @@ -303,12 +337,12 @@ (print "\n" (slashify default-builder platform) " " out " " cmd " -I " srcdir " -C -I" srcdir (arglist options) " " src " -o " out " : " - src (arglist dependencies)))) + src #;(arglist dependencies)))) -(define (gen-compile-dynamic-extension name #!key mode platform dependencies mode - source (options '()) (link-options '()) - custom srcdir) - (let* ((cmd (or custom +(define ((compile-dynamic-extension name #!key mode dependencies mode + source (options '()) (link-options '()) + custom) srcdir platform) + (let* ((cmd (or (and custom (prefix-custom-command custom)) (conc default-csc " -D compiling-extension -J -s"))) (sname (prefix srcdir name)) (ssname (and source (prefix srcdir source))) @@ -317,12 +351,13 @@ (print "\n" (slashify default-builder platform) " " out " " cmd " -I " srcdir " -C -I" srcdir (arglist options) (arglist link-options) " " src " -o " out " : " - src (arglist dependencies)))) + src #;(arglist dependencies)))) -(define (gen-compile-import-library name #!key platform dependencies source mode - (options '()) (link-options '()) - custom srcdir) - (let* ((cmd (or custom (conc default-csc " -s"))) +(define ((compile-import-library name #!key dependencies source mode + (options '()) (link-options '()) + custom) srcdir platform) + (let* ((cmd (or (and custom (prefix-custom-command custom)) + (conc default-csc " -s"))) (sname (prefix srcdir name)) (ssname (and source (prefix srcdir source))) (out (quotearg (target-file (conc sname ".import.so") mode))) @@ -330,12 +365,13 @@ (print "\n" (slashify default-builder platform) " " out " " cmd " -I " srcdir " -C -I" srcdir (arglist options) (arglist link-options) " " src " -o " out " : " - src (arglist dependencies)))) + src #;(arglist dependencies)))) -(define (gen-compile-dynamic-program name #!key platform dependencies source mode +(define ((compile-dynamic-program name #!key dependencies source mode (options '()) (link-options '()) - custom srcdir) - (let* ((cmd (or custom default-csc)) + custom) srcdir platform) + (let* ((cmd (or (and custom (prefix-custom-command custom)) + default-csc)) (sname (prefix srcdir name)) (ssname (and source (prefix srcdir source))) (out (quotearg (target-file (conc sname @@ -345,12 +381,13 @@ (print "\n" (slashify default-builder platform) " " out " " cmd " -I " srcdir " -C -I" srcdir (arglist options) (arglist link-options) " " src " -o " out " : " - src (arglist dependencies)))) + src #;(arglist dependencies)))) -(define (gen-compile-static-program name #!key platform dependencies source +(define ((compile-static-program name #!key dependencies source (options '()) (link-options '()) - custom mode srcdir) - (let* ((cmd (or custom (conc default-csc " -static-libs"))) + custom mode) srcdir platform) + (let* ((cmd (or (and custom (prefix-custom-command custom)) + (conc default-csc " -static-libs"))) (sname (prefix srcdir name)) (ssname (and source (prefix srcdir source))) (out (quotearg (target-file (conc sname @@ -360,12 +397,21 @@ (print "\n" (slashify default-builder platform) " " out " " cmd " -I " srcdir " -C -I" srcdir (arglist options) (arglist link-options) " " src " -o " out " : " - src (arglist dependencies)))) + src #;(arglist dependencies)))) + +(define ((compile-generated-file name #!key dependencies source custom) + srcdir platform) + (let* ((cmd (prefix-custom-command custom)) + (sname (prefix srcdir name)) + (ssname (and source (prefix srcdir source))) + (out (quotearg (or ssname sname)))) + (print "\n" (slashify default-builder platform) " " out " " cmd " : " + #;(arglist dependencies)))) ;; installation operations -(define (gen-install-static-extension name #!key platform mode srcdir) +(define ((install-static-extension name #!key mode) srcdir platform) (let* ((cmd (install-file-command platform)) (mkdir (mkdir-command platform)) (ext (object-extension platform)) @@ -378,7 +424,7 @@ (print cmd " " out " " ddir (quotearg (slashify (conc dest "/" name ext) platform))))) -(define (gen-install-dynamic-extension name #!key platform mode srcdir (ext ".so")) +(define ((install-dynamic-extension name #!key mode (ext ".so")) srcdir platform) (let* ((cmd (install-executable-command platform)) (dcmd (remove-file-command platform)) (mkdir (mkdir-command platform)) @@ -393,11 +439,10 @@ (print dcmd " " ddir destf)) (print cmd " " out " " ddir destf))) -(define (gen-install-import-library name #!key platform mode srcdir) - (gen-install-dynamic-extension name platform: platform mode: mode srcdir: srcdir - ext: ".import.so")) +(define ((install-import-library name #!key mode) srcdir platform) + ((install-dynamic-extension name mode: mode ext: ".import.so") srcdir platform)) -(define (gen-install-import-library-source name #!key platform mode srcdir) +(define ((install-import-library-source name #!key mode) srcdir platform) (let* ((cmd (install-executable-command platform)) (mkdir (mkdir-command platform)) (sname (prefix srcdir name)) @@ -409,7 +454,31 @@ (print cmd " " out " " ddir (quotearg (slashify (conc dest "/" name ".import.scm") platform))))) -(define (gen-install-program name #!key platform mode srcdir) +(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)) + (out (quotearg (conc types-file ".types"))) + (dest (destination-repository mode)) + (dfile (quotearg (slashify dest platform))) + (ddir (shell-variable "DESTDIR" platform))) + (print "\n" mkdir " " ddir dfile) + (print cmd " " out " " ddir + (quotearg (slashify (conc dest "/" types-file ".types") 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)) + (out (quotearg (conc inline-file ".inline"))) + (dest (destination-repository mode)) + (dfile (quotearg (slashify dest platform))) + (ddir (shell-variable "DESTDIR" platform))) + (print "\n" mkdir " " ddir dfile) + (print cmd " " out " " ddir + (quotearg (slashify (conc dest "/" inline-file ".types") platform))))) + +(define ((install-program name #!key mode) srcdir platform) (let* ((cmd (install-executable-command platform)) (dcmd (remove-file-command platform)) (mkdir (mkdir-command platform)) @@ -425,7 +494,7 @@ (print dcmd " " ddir destf)) (print cmd " " out " " ddir destf))) -(define (gen-install-data name #!key platform files destination mode srcdir) +(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) target-sharedir host-sharedir))) @@ -434,7 +503,7 @@ (print "\n" mkdir " " ddir dfile) (print cmd (arglist (map (cut prefix srcdir <>) files)) " " ddir dfile))) -(define (gen-install-c-include name #!key platform deps files destination mode srcdir) +(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) target-incdir host-incdir))) @@ -443,21 +512,6 @@ (print "\n" mkdir " " ddir dfile) (print cmd (arglist (map (cut prefix srcdir <>) files)) " " ddir dfile))) -(define command-table - `((compile-static-extension ,gen-compile-static-extension) - (compile-dynamic-extension ,gen-compile-dynamic-extension) - (compile-dynamic-program ,gen-compile-dynamic-program) - (compile-static-program ,gen-compile-static-program) - (install-static-extension ,gen-install-static-extension) - (install-dynamic-extension ,gen-install-dynamic-extension) - (install-import-library ,gen-install-import-library) - (install-import-library-source ,gen-install-import-library-source) - (install-data ,gen-install-data) - (compile-import-library ,gen-compile-import-library) - (install-data ,gen-install-data) - (install-c-include ,gen-install-c-include) - (install-scheme-include ,gen-install-data))) ;; might be extended - ;;; Generate shell or batch commands from abstract build/install operations @@ -466,15 +520,7 @@ (lambda () (prefix platform) (for-each - (lambda (cmd) - (d "~s~%" cmd) - (cond ((assq (car cmd) command-table) - => (lambda (op) - (apply (cadr op) - (cons* (cadr cmd) - srcdir: srcdir platform: platform - (cddr cmd))))) - (else (error "invalid command" cmd)))) + (lambda (cmd) (cmd srcdir platform)) cmds) (suffix platform)))) @@ -583,4 +629,14 @@ EOF (case platform ((unix) (string-append "${" var "}")) ((windows) (string-append "%" var "%")))) - \ No newline at end of file + +(define (prefix-custom-command cmd) + (cond ((irregex-match "^csi( .+)$" cmd) => + (lambda (m) (string-append default-csi (irregex-match-substring m 1)))) + ((irregex-match "^csc( .+)$" cmd) => + (lambda (m) (string-append default-csc (irregex-match-substring m 1)))) + ((irregex-match "^cc( .+)$" cmd) => + (lambda (m) (string-append default-cc (irregex-match-substring m 1)))) + ((irregex-match "^c++( .+)$" cmd) => + (lambda (m) (string-append default-cxx (irregex-match-substring m 1)))) + (else cmd)))Trap