build system for multi-file project added by mario-goulart on Thu Dec 4 09:57:20 2014

$ tree
.
├── src
│   ├── vault-build.scm
│   ├── vault-config.scm
│   ├── vault-db.scm
│   ├── vault-lib.scm
│   ├── vault.scm
│   ├── vault-utils.scm
│   └── vault-version.scm
├── vault.meta
└── vault.setup

1 directory, 9 files



$ cat vault.setup 
;; -*- scheme -*-
(use posix make)

(change-directory "src")

(include "vault-version.scm")
(include "vault-build.scm")


$ cat src/vault-build.scm
(define debug-build? (get-environment-variable "VAULT_DEBUG"))

(define make-targets (get-environment-variable "MAKE_TARGETS"))

(define csc-options
  (if debug-build?
      '(-S -O0 -d2)
      '(-O3 -d0)))

(define (mod.so mod)
  (sprintf "~a.so" mod))

(define (mod.scm mod)
  (sprintf "~a.scm" mod))

(define (mod.import.so mod)
  (sprintf "~a.import.so" mod))

(define (mod.import.scm mod)
  (sprintf "~a.import.scm" mod))

(define (mod-rule mod-path mod-deps #!key (non-mod-deps '()))
  (let ((mod.so-deps (cons (mod.scm mod-path)
                           (append (map mod.import.so mod-deps)
                                   non-mod-deps))))
    `((,(mod.so mod-path) ,mod.so-deps
       ,(lambda ()
          (compile -J -s ,@csc-options ,(mod.scm mod-path))))
      (,(mod.import.so mod-path) (,(mod.import.scm mod-path))
       ,(lambda ()
          (compile -s ,@csc-options ,(mod.import.scm mod-path)))))))

;; For libraries only.  The command line app deps doesn't belong here.
(define modules/deps
  `((vault-config)
    (vault-utils vault-config)
    (vault-db vault-config vault-utils)
    (vault-lib vault-config vault-utils vault-db)
    ))

(define modules (map car modules/deps))

(make-nonfile-targets '("clean" "build" "install" "all"))

(define (cleanup!)
  (for-each delete-file*
            (append
             (list "vault")
             (find-files "." test: (lambda (f)
                                     (string-suffix? "~" f)))
             (find-files "." test: (lambda (f)
                                     (or (equal? (pathname-extension f) "so")
                                         (string-suffix? ".import.scm" f)))))))


(define *rules* '())

(define (add-rule! target deps #!optional proc)
  (set! *rules*
        (cons (if proc
                  (list target deps proc)
                  (list target deps))
              *rules*)))

;; Module rules
(set! *rules*
      (append (apply append
                     (map (lambda (mod/deps)
                            (mod-rule (car mod/deps) (cdr mod/deps)))
                          modules/deps))
              *rules*))

;; Rule for the command line application
(add-rule! "vault" (cons "vault.scm"
                           (map mod.so modules))
           (lambda ()
             (compile ,@csc-options vault.scm)))

;; clean
(add-rule! "clean" '() cleanup!)

;; build
(add-rule! "build" (append (map mod.so modules)
                           (map mod.import.so modules)
                           (list "vault")))

;; all
(add-rule! "all" '("build"))

(make/proc *rules* (or make-targets "all"))