*** empty log message ***
This commit is contained in:
parent
3e19944116
commit
af7d20c1b2
|
@ -0,0 +1,106 @@
|
||||||
|
(define-syntax make
|
||||||
|
(syntax-rules ()
|
||||||
|
((make ?rule-trans-set (?target-fname0 ...) ?init-state)
|
||||||
|
(begin
|
||||||
|
(let ((?target-rule (rule-candidate-get ?rule-trans-set ?target-fname0)))
|
||||||
|
(if (not (null? (rule-trans-set-rule-candidates ?rule-trans-set)))
|
||||||
|
(display "warning: rule-candidates not empty!\n"))
|
||||||
|
(if (?target-rule)
|
||||||
|
(rule-make ?target-rule
|
||||||
|
init-state
|
||||||
|
(rule-trans-set-rule-set ?rule-trans-set))
|
||||||
|
(error "target-rule not found in rule-set.")))
|
||||||
|
...))))
|
||||||
|
|
||||||
|
(define-syntax makefile
|
||||||
|
(syntax-rules ()
|
||||||
|
((makefile ?rule0 ...)
|
||||||
|
(let ((rule-trans-set (make-empty-rule-trans-set)))
|
||||||
|
((?rule0) rule-trans-set) ...))))
|
||||||
|
|
||||||
|
(define-syntax make-is-out-of-date?
|
||||||
|
(syntax-rules ()
|
||||||
|
((make-is-out-of-date? ?target)
|
||||||
|
(lambda ?args
|
||||||
|
(cons (file-not-exists? ?target) ?args)))
|
||||||
|
((make-is-out-of-date? ?target ?prereq0 ...)
|
||||||
|
(lambda ?args
|
||||||
|
(cons (or (file-not-exists? ?target)
|
||||||
|
(> (file-last-mod ?prereq0)
|
||||||
|
(file-last-mod ?target))
|
||||||
|
...)
|
||||||
|
(last ?args))))))
|
||||||
|
|
||||||
|
(define-syntax make-is-out-of-date!
|
||||||
|
(syntax-rules ()
|
||||||
|
((make-is-out-of-date? ?target ?prereq0 ...)
|
||||||
|
(lambda ?args
|
||||||
|
(cons #t (last ?args))))))
|
||||||
|
|
||||||
|
(define-syntax make-has-md5-digest=?
|
||||||
|
(syntax-rules ()
|
||||||
|
((make-has-md5-digest=? ?fingerprint ?target)
|
||||||
|
(lambda ?args
|
||||||
|
(cons (or (file-not-exists? ?target)
|
||||||
|
(=? (md5-digest-for-port (open-input-file ?target))
|
||||||
|
?fingerprint))
|
||||||
|
?args)))
|
||||||
|
((make-has-md5-digest=? ?fingerprint ?target ?prereq0 ...)
|
||||||
|
(lambda ?args
|
||||||
|
(cons (or (file-not-exists? ?target)
|
||||||
|
(=? (md5-digest->number (md5-digest-for-port
|
||||||
|
(open-input-file ?target)))
|
||||||
|
(md5-digest->number ?fingerprint)))
|
||||||
|
(last ?args))))))
|
||||||
|
|
||||||
|
(define-syntax makefile-rule
|
||||||
|
(syntax-rules ()
|
||||||
|
((makefile-rule ?target (?prereq0 ...) ?thunk)
|
||||||
|
(makefile-rule-tmpvars () ?target (?prereq0 ...) ?thunk))))
|
||||||
|
|
||||||
|
(define-syntax makefile-rule-tmpvars
|
||||||
|
(syntax-rules ()
|
||||||
|
((makefile-rule-tmpvars (tmp1 ...) ?target () ?thunk)
|
||||||
|
;;
|
||||||
|
;; ?target could be an expr: eval only once
|
||||||
|
;;
|
||||||
|
(let ((target ?target))
|
||||||
|
(lambda (rule-trans-set)
|
||||||
|
(rule-trans-set-add! rule-trans-set
|
||||||
|
target
|
||||||
|
(list tmp1 ...)
|
||||||
|
(make-is-out-of-date? target tmp1 ...)
|
||||||
|
(lambda ?args (?thunk))))))
|
||||||
|
;;
|
||||||
|
;; recursively construct temporary, hygienic variables
|
||||||
|
;;
|
||||||
|
((makefile-rule-tmpvars (tmp1 ...) ?target (?prereq0 ?prereq1 ...) ?thunk)
|
||||||
|
(let ((tmp2 ?prereq0))
|
||||||
|
(makefile-rule-tmpvars (tmp1 ... tmp2) ?target (?prereq1 ...) ?thunk)))))
|
||||||
|
|
||||||
|
(define-syntax makefile-rule-md5
|
||||||
|
(syntax-rules ()
|
||||||
|
((makefile-rule-md5 ?fingerprint ?target (?prereq0 ...) ?thunk)
|
||||||
|
(makefile-rule-md5-tmpvars () ?fingerprint ?target (?prereq0 ...) ?thunk))))
|
||||||
|
|
||||||
|
(define-syntax makefile-rule-md5-tmpvars
|
||||||
|
(syntax-rules ()
|
||||||
|
((makefile-rule-md5-tmpvars (tmp1 ...) ?fingerprint ?target () ?thunk)
|
||||||
|
;;
|
||||||
|
;; ?target could be an expr: eval only once
|
||||||
|
;;
|
||||||
|
(let ((target ?target))
|
||||||
|
(lambda (rule-trans-set)
|
||||||
|
(rule-trans-set-add! rule-trans-set
|
||||||
|
target
|
||||||
|
(list tmp1 ...)
|
||||||
|
(make-has-md5-digest=? ?fingerprint target tmp1 ...)
|
||||||
|
(lambda ?args (?thunk))))))
|
||||||
|
;;
|
||||||
|
;; recursively construct temporary, hygienic variables
|
||||||
|
;;
|
||||||
|
((makefile-rule-md5-tmpvars (tmp1 ...) ?fingerprint ?target
|
||||||
|
(?prereq0 ?prereq1 ...) ?thunk)
|
||||||
|
(let ((tmp2 ?prereq0))
|
||||||
|
(makefile-rule-md5-tmpvars (tmp1 ... tmp2) ?fingerprint
|
||||||
|
?target (?prereq1 ...) ?thunk)))))
|
|
@ -0,0 +1,89 @@
|
||||||
|
;;;
|
||||||
|
;;; RULE-TRANS-SET
|
||||||
|
;;;
|
||||||
|
;;; (make-empty-rule-trans-set) ---> rule-trans-set
|
||||||
|
;;;
|
||||||
|
;;; (make-rule-trans-set rule-candidates known-rules rule-set)
|
||||||
|
;;;
|
||||||
|
;;; (rule-trans-set-rule-candidates rts) ---> (rule-candidate0 ...)
|
||||||
|
;;; (rule-trans-set-known-rules rts) ---> (known-rule0 ...)
|
||||||
|
;;; (rule-trans-set-rule-set rts) ---> rule-set
|
||||||
|
;;;
|
||||||
|
;;; (rule-trans-set-add! rule-trans-set target prereqs wants-build? build-func)
|
||||||
|
;;; ---> rule-trans-set
|
||||||
|
;;;
|
||||||
|
(define-record-type :rule-trans-set
|
||||||
|
(make-rule-trans-set rule-candidates known-rules rule-set)
|
||||||
|
is-rule-trans-set?
|
||||||
|
(rule-candidates rule-trans-set-rule-candidates)
|
||||||
|
(known-rules rule-trans-set-known-rules)
|
||||||
|
(rule-set rule-trans-set-rule-set))
|
||||||
|
|
||||||
|
(define (make-empty-rule-trans-set)
|
||||||
|
(let ((rule-candidates '())
|
||||||
|
(known-rules (alist-cons '() '() '()))
|
||||||
|
(rule-set (make-empty-rule-set)))
|
||||||
|
(make-rule-trans-set rule-candidates known-rules rule-set)))
|
||||||
|
|
||||||
|
(define (rule-trans-set-add! rule-trans-set target prereqs wants-build? build-func)
|
||||||
|
(let ((rule-candidates (rule-trans-set-rule-candidates rule-trans-set))
|
||||||
|
(known-rules (rule-trans-set-known-rules rule-trans-set))
|
||||||
|
(rule-set (rule-trans-set-rule-set rule-trans-set)))
|
||||||
|
(rule-candidate-add! rule-candidates target prereqs wants-build? build-func)
|
||||||
|
(known-rules-update rule-trans-set)))
|
||||||
|
|
||||||
|
;;; o every incoming rule is considered as a rule-candidate so it is added
|
||||||
|
;;; here first
|
||||||
|
(define (rule-candidate-add! rule-candidates target prereqs wants-build? build-func)
|
||||||
|
(set! rule-candidates
|
||||||
|
(alist-cons target (list prereqs wants-build? build-func))))
|
||||||
|
|
||||||
|
(define (rule-candidate-del! rule-candidates target)
|
||||||
|
(alist-delete! target rule-candidates))
|
||||||
|
|
||||||
|
(define (rule-candidate-get rule-trans-set target)
|
||||||
|
(let* ((rule-candidates (rule-trans-set-rule-candidates rule-trans-set))
|
||||||
|
(maybe-rule-candidate (assq target rule-candidates)))
|
||||||
|
(if maybe-rule-candidate
|
||||||
|
(cons target (cdr (assq target rule-candidates)))
|
||||||
|
maybe-rule-candidate)))
|
||||||
|
|
||||||
|
;;; o if a target's prereqs are all in known-rules then the rule-candidate
|
||||||
|
;;; can be added to the known-rules as a freshly created rule
|
||||||
|
;;; o any rule-candidate with () as prereqs can be added to the known-rules
|
||||||
|
;;; as well, so this will be the first element of the known-rules
|
||||||
|
(define (known-rules-add! rule-trans-set target prereqs wants-build? build-func)
|
||||||
|
(let ((rule (make-rule prereqs wants-build? build-func))
|
||||||
|
(known-rules (rule-trans-set-known-rules rule-trans-set))
|
||||||
|
(rule-set (rule-trans-set-rule-set rule-trans-set)))
|
||||||
|
(set! known-rules (alist-cons target rule known-rules))
|
||||||
|
(rule-set-add rule rule-set)))
|
||||||
|
|
||||||
|
;;; look for all rule-candidates that can be added to known-rules
|
||||||
|
(define (known-rules-update rule-trans-set)
|
||||||
|
(let ((rule-candidates (rule-trans-set-rule-candidates rule-trans-set))
|
||||||
|
(known-rules (rule-trans-set-known-rules rule-trans-set))
|
||||||
|
(rule-set (rule-trans-set-rule-set rule-trans-set)))
|
||||||
|
(map (lambda (candidate-desc)
|
||||||
|
;;
|
||||||
|
;; candidate-desc is a list with these four elements
|
||||||
|
;; target prereqs wants-build? build-func
|
||||||
|
;;
|
||||||
|
(apply (lambda (target prereqs wants-build? build-func)
|
||||||
|
(if (not (memq #f (map (lambda (prereq)
|
||||||
|
(assq prereq known-rules))
|
||||||
|
prereqs)))
|
||||||
|
(rule-candidate-del! rule-trans-set target)
|
||||||
|
(apply known-rules-add! (append (list rule-trans-set)
|
||||||
|
candidate-desc))))
|
||||||
|
candidate-desc))
|
||||||
|
;;
|
||||||
|
;; get the (target prereqs wants-build? build-func)-list
|
||||||
|
;; for each target
|
||||||
|
;;
|
||||||
|
(map rule-candidate-get
|
||||||
|
;;
|
||||||
|
;; get all targets
|
||||||
|
;;
|
||||||
|
(map car rule-candidates)))
|
||||||
|
(make-rule-trans-set rule-candidates known-rules rule-set)))
|
Loading…
Reference in New Issue