The `make' program is the most common way to build multi-module, multi-language software from source. It is used to specify build dependencies between components, so that they will be built in the correct order. Unfortunately, there exist two incompatible flavours of `make': BSD make and GNU make. Both offer a core functionality, extended with seemingly random language extensions. However, `make' is essential for software construction, but is broken in many ways -- it is begging for coherent language design!
An interesting way of designing small, new languages is to embed them as a library in an existing rich host language, an Embedded Domain-Specific Language. By doing so you gain the language/compiler features that would be costly to reimplement. All that is required is that primitives for the new language be written as functions in the host language. This approach would be very suitable for providing a sane `make', with coherent syntax and semantics, with the additional benefit that you gain a module system, string/list libraries and first class functions for free --- exactly what is needed in `make'!
In this project you will design a clean, simple, portable replacement for `make', as a Haskell EDSL. It should retain the language independence of the existing `make' systems and should have a clearly specified syntax and semantics. In many ways make can be considered a functional language, and your design should reflect this connection. You should investigate existing build systems and isolate core functionality, for your language design. Attention should be paid to the structure of the build system.
Expectations-j option.