For the course Programming Language Design I implemented a simple make-like domain specific language.
Introducing bake
You can define constants to be used later. All definitions are written using an arrow (<-
)
@cc <- gcc
@cflags <- -std=c99 -pedantic -Wall -O2
You can define rules to be used when you have repeating patterns in your scripts
@compileLib(in, out)
@cc -c -o @out @in @cflags
bake
is indentation sensitive just like Python or Haskell. Finally you can define build rules for particular files
libs: math.o list.o libs.zip <- math.c list.c
@compileLib(math.c, math.o)
@compileLib(list.c, list.o)
zip src.zip @input
@input
is bound to the input files and @output
is bound to the output files. To reduce repetition there is also the fish operator (<-<
). This repeats the rule for every file in the argument list. The previous rule can then be written as
libs: math.o list.o <-< math.c list.c
@compileLib(@input, @output)
bake
does automatic dependency resolution and makes sure that all necessary files are present before executing any commands.
Implementation
bake
is implemented in Haskell using megaparsec and the very nice graph library by King and Launchbury.
It uses simple graph algorithms to do dependency resolution and execute the rules in the correct order.