2.5 KiB
racket-makefile
racket-makefile is a small #lang for make-style builds. It keeps ordinary
Racket available and only adds targets, dependencies, timestamp based rebuilds,
phony targets, external command execution and a few cleanup helpers.
A makefile only defines its targets. Loading or running the file does not build
anything by itself. Builds are started explicitly with make.
#lang racket-makefile
(define CC 'cc)
(define CFLAGS '(-Wall -O2))
(default-target all)
(phony all clean)
(target all
(deps "hello"))
(target "hello"
(deps "hello.c")
(run `(,CC ,@CFLAGS -o $target $<)))
(target clean
(rm-f "hello")
(rm-rf "compiled")
(cleanup "scrbl" '("**.html" "**.js" "**.css")))
Installation
Install a local checkout with:
raco pkg install
For a versioned archive, give the package name explicitly:
raco pkg install --name racket-makefile racket-makefile-0.1.2.zip
Running targets
Load the makefile with -t and evaluate a make expression with -e:
racket -t Makefile.rkt -e "(make)"
racket -t Makefile.rkt -e "(make all)"
racket -t Makefile.rkt -e "(make clean)"
racket -t Makefile.rkt -e "(make clean all)"
(make) uses the target selected with default-target. If no default target is
specified, the first declared target is used.
Loading the file alone only registers the targets:
racket -t Makefile.rkt
No recipe is executed in that case.
In DrRacket, open the makefile and press Run. This also only loads and registers the targets. Then use the Interactions window:
> (make)
> (make clean)
> (make all)
> (make clean all)
Bare identifiers in make are target names, so no quote is needed. For
example, (make clean) selects the target named clean.
Generated targets
Because the rest of the language is ordinary Racket, targets can be generated with normal definitions and loops:
(define sources '("foo.c" "bar.c" "baz.c"))
(define objects
(for/list ([src sources])
(define obj (path-replace-extension src #".o"))
(target obj
(deps src)
(run `(cc -c $< -o $target)))
obj))
(target all
(deps objects))
Dependency expressions may produce lists; they are recursively flattened.
The language adds target, deps, phony, default-target, make, run,
rm-f, rm-rf, cleanup, $target, $deps and $<. Everything else is
ordinary Racket.
See the installed racket-makefile Scribble documentation for the full API.