78 lines
1.9 KiB
Racket
78 lines
1.9 KiB
Racket
#lang racket
|
|
|
|
(require rackunit
|
|
racket/file
|
|
racket-makefile
|
|
(only-in "../private/engine.rkt" reset-makefiles!))
|
|
|
|
(reset-makefiles!)
|
|
|
|
(define tmp (make-temporary-file "racket-makefile-generated~a" 'directory))
|
|
(define called '())
|
|
|
|
(dynamic-wind
|
|
void
|
|
(λ ()
|
|
(parameterize ([current-directory tmp])
|
|
(makefile 'stuff
|
|
(define sources '("foo.c" "bar.c" "baz.c"))
|
|
|
|
(for ([src sources])
|
|
(call-with-output-file src
|
|
#:exists 'truncate/replace
|
|
(λ (out)
|
|
(displayln src out))))
|
|
|
|
(define objects
|
|
(for/list ([src sources])
|
|
(define obj (path-replace-extension src #".o"))
|
|
(target obj
|
|
(deps src)
|
|
(set! called (append called (list (list $< $target))))
|
|
(copy-file $< $target #t))
|
|
obj))
|
|
|
|
(default-target 'all)
|
|
(phony 'all 'clean)
|
|
|
|
(target 'all
|
|
(deps objects))
|
|
|
|
(target 'clean
|
|
(apply rm-f objects)))
|
|
|
|
;; Definitions inside makefile remain ordinary module definitions.
|
|
(check-equal? sources '("foo.c" "bar.c" "baz.c"))
|
|
(check-equal? (map path->string objects) '("foo.o" "bar.o" "baz.o"))
|
|
|
|
(check-equal? (current-makefile-prefix) 'stuff)
|
|
(check-true (procedure? makefile-target-stuff-all))
|
|
(check-true (procedure? makefile-target-stuff-clean))
|
|
|
|
(check-equal?
|
|
(makefile-targets 'stuff)
|
|
(append objects '(all clean)))
|
|
|
|
(for ([obj objects])
|
|
(check-true
|
|
(procedure?
|
|
(makefile-target-procedure 'stuff obj))))
|
|
|
|
(make 'all)
|
|
|
|
(check-equal?
|
|
called
|
|
'(("foo.c" "foo.o")
|
|
("bar.c" "bar.o")
|
|
("baz.c" "baz.o")))
|
|
|
|
(for ([obj objects])
|
|
(check-true (file-exists? obj)))
|
|
|
|
(make 'clean)
|
|
|
|
(for ([obj objects])
|
|
(check-false (file-exists? obj)))))
|
|
(λ ()
|
|
(delete-directory/files tmp #:must-exist? #f)))
|