Credo
Many small scripts generate, comprise, and run a build system. (An adaptation of djb's "redo" build-tool idea.)
Install / Use
/learn @catenate/CredoREADME
DESCRIPTION
Credo calls scripts to create files, after doing the same for files on which they depend. Libdo copies templates of those scripts, and lists of default dependencies, from a library, and customizes them for a given target. Libenv composes shell variable settings from a variety of aspects.
Credo is a set of small shell scripts, which stores its data (such as a checksum for each file on which a target depends) in flat files in the current directory. This creates clutter, but also an interface for higher-level tools.
Credo is currently only implemented in Inferno’s sh: I really like its shell language (especially apply, <{}, and quoting rules); and Inferno exposes all the shell variables of a process as files in /env, which makes writing dependencies on them much simpler. I expect that it will need a port to Linux for wider adoption, either as shell scripts or a program.
LITERATE TESTS
Literate programs to test credo and describe its features. Credo’s test suite also serves as its expository documentation.
Credo example: Hello, world! A view over credo. Generate and run a build system. So, what’s going on here? What are all these other files in my source code directory, how can I ignore them, and how do I get rid of them? https://github.com/catenate/credo/blob/master/test/1/credo/hello/hello.test
Set the shell variable crecho to echo, to print instead of execute key production commands in do scripts. https://github.com/catenate/credo/blob/master/test/1/credo/hello/crecho.test
Crelay walks the dependency graph from a file to targets which depend on it. https://github.com/catenate/credo/blob/master/test/1/credo/hello/relay.test
ARTICLES
A new credo: no more complex makefiles. http://groups.google.com/group/redo-list/browse_thread/thread/643db9316b09c47a
How credo handles manual changes to generated files; default do scripts. http://groups.google.com/group/redo-list/browse_thread/thread/e048dd2a3f473822/
Credo example: from lex and c source to cygwin executable, across directories. http://swtools.wordpress.com/2011/07/03/credo-example-from-lex-and-c-source-to-cygwin-executable-across-directories/
One change since the example is new addenv/rmenv commands, to manage target dependencies on environment variables. For example, these commands can replace the echo commands in the example:
addenv default srcdir ../src/
addenv default cpp cpp-3
addenv default cppflags -I../src/
addenv default cc gcc-3
RELATED WORK
Credo is an adaptation of the unpublished build tool redo, proposed and sketched by D.J. Bernstein. http://cr.yp.to/redo.html
Avery Pennarun implemented redo in python. https://github.com/apenwarr/redo
In 2006 and 2007 Alan Grosskurth gave a talk¹ and wrote a master’s thesis² on purely top-down software rebuilding. The thesis implements redo in sh-bourne and compares it to make. ¹ http://grosskurth.ca/talks/2006.04.10/slides.pdf ² http://grosskurth.ca/papers/mmath-thesis.pdf
Credo’s most significant differences from redo is that there are no redo-* commands in the do scripts; credo has a new set of shell script commands to create, examine, and maintain the build system (for higher-level tools to automatically generate a build system); and credo exposes all of its record-keeping in flat files in the current directory.
