makefile-targets and some other meta info functions added
This commit is contained in:
+66
-10
@@ -2,7 +2,10 @@
|
||||
|
||||
(require racket/list)
|
||||
|
||||
(provide makefile-targets
|
||||
(provide makefile-prefixes
|
||||
makefile-targets
|
||||
makefile-target-exists?
|
||||
makefile-target-procedure
|
||||
current-makefile-prefix
|
||||
begin-makefile!
|
||||
register-target!
|
||||
@@ -18,8 +21,11 @@
|
||||
;; Target procedures are registered globally per makefile prefix. The value is
|
||||
;; deliberately the real target procedure; `make` ultimately resolves a target
|
||||
;; in this hash and calls that procedure.
|
||||
(define makefile-targets (make-hash))
|
||||
(define makefile-target-registry (make-hash))
|
||||
(define target-dependencies (make-hash))
|
||||
(define target-values (make-hash))
|
||||
(define makefile-prefix-values (make-hash))
|
||||
(define makefile-prefix-order '())
|
||||
(define phony-targets (make-hash))
|
||||
(define target-order (make-hash))
|
||||
(define default-targets (make-hash))
|
||||
@@ -57,22 +63,33 @@
|
||||
|
||||
(define (clear-prefix! prefix)
|
||||
(define pkey (prefix-key prefix))
|
||||
(for ([key (in-list (hash-keys makefile-targets))])
|
||||
(for ([key (in-list (hash-keys makefile-target-registry))])
|
||||
(when (equal? (car key) pkey)
|
||||
(hash-remove! makefile-targets key)
|
||||
(hash-remove! makefile-target-registry key)
|
||||
(hash-remove! target-dependencies key)
|
||||
(hash-remove! target-values key)
|
||||
(hash-remove! phony-targets key)))
|
||||
(hash-remove! target-order pkey)
|
||||
(hash-remove! default-targets pkey)
|
||||
(void))
|
||||
|
||||
(define (begin-makefile! prefix)
|
||||
(define pkey (prefix-key prefix))
|
||||
(clear-prefix! prefix)
|
||||
(hash-set! makefile-prefix-values pkey prefix)
|
||||
(set! makefile-prefix-order
|
||||
(append
|
||||
(filter (λ (existing) (not (equal? existing pkey)))
|
||||
makefile-prefix-order)
|
||||
(list pkey)))
|
||||
(void))
|
||||
|
||||
(define (reset-makefiles!)
|
||||
(hash-clear! makefile-targets)
|
||||
(hash-clear! makefile-target-registry)
|
||||
(hash-clear! target-dependencies)
|
||||
(hash-clear! target-values)
|
||||
(hash-clear! makefile-prefix-values)
|
||||
(set! makefile-prefix-order '())
|
||||
(hash-clear! phony-targets)
|
||||
(hash-clear! target-order)
|
||||
(hash-clear! default-targets)
|
||||
@@ -84,12 +101,13 @@
|
||||
(define tkey (target-key name))
|
||||
(define key (cons pkey tkey))
|
||||
|
||||
(unless (hash-has-key? makefile-targets key)
|
||||
(unless (hash-has-key? makefile-target-registry key)
|
||||
(hash-set! target-order
|
||||
pkey
|
||||
(append (hash-ref target-order pkey '()) (list tkey))))
|
||||
|
||||
(hash-set! makefile-targets key procedure)
|
||||
(hash-set! makefile-target-registry key procedure)
|
||||
(hash-set! target-values key name)
|
||||
(hash-set! target-dependencies key (append-map target-keys dependencies))
|
||||
(void))
|
||||
|
||||
@@ -103,8 +121,45 @@
|
||||
(hash-set! default-targets (prefix-key prefix) (target-key name))
|
||||
(void))
|
||||
|
||||
(define (require-current-prefix who)
|
||||
(define prefix (current-makefile-prefix))
|
||||
(unless prefix
|
||||
(error who "no current makefile prefix; evaluate a makefile definition first"))
|
||||
prefix)
|
||||
|
||||
(define (makefile-prefixes)
|
||||
(for/list ([pkey (in-list makefile-prefix-order)])
|
||||
(hash-ref makefile-prefix-values pkey)))
|
||||
|
||||
(define makefile-targets
|
||||
(case-lambda
|
||||
[()
|
||||
(makefile-targets (require-current-prefix 'makefile-targets))]
|
||||
[(prefix)
|
||||
(define pkey (prefix-key prefix))
|
||||
(for/list ([tkey (in-list (hash-ref target-order pkey '()))])
|
||||
(hash-ref target-values (cons pkey tkey) tkey))]))
|
||||
|
||||
(define makefile-target-exists?
|
||||
(case-lambda
|
||||
[(name)
|
||||
(makefile-target-exists?
|
||||
(require-current-prefix 'makefile-target-exists?)
|
||||
name)]
|
||||
[(prefix name)
|
||||
(hash-has-key? makefile-target-registry (registry-key prefix name))]))
|
||||
|
||||
(define makefile-target-procedure
|
||||
(case-lambda
|
||||
[(name)
|
||||
(makefile-target-procedure
|
||||
(require-current-prefix 'makefile-target-procedure)
|
||||
name)]
|
||||
[(prefix name)
|
||||
(target-procedure prefix name)]))
|
||||
|
||||
(define (target-procedure prefix name)
|
||||
(hash-ref makefile-targets
|
||||
(hash-ref makefile-target-registry
|
||||
(registry-key prefix name)
|
||||
(λ ()
|
||||
(error 'racket-makefile
|
||||
@@ -131,7 +186,7 @@
|
||||
(file-or-directory-modify-seconds path #f (λ () #f)))
|
||||
|
||||
(define (registered-target? prefix name)
|
||||
(hash-has-key? makefile-targets (registry-key prefix name)))
|
||||
(hash-has-key? makefile-target-registry (registry-key prefix name)))
|
||||
|
||||
(define (dependency-time prefix name built-results)
|
||||
(cond
|
||||
@@ -159,7 +214,8 @@
|
||||
(and dep-time (> dep-time target-time)))])]))
|
||||
|
||||
(define (execute-target! prefix name)
|
||||
(printf "racket-makefile[~a]: ~a\n" prefix (target-key name))
|
||||
(printf "racket-makefile[~a]: ~a
|
||||
" prefix (target-key name))
|
||||
((target-procedure prefix name))
|
||||
(void))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user