Many small scripts generate, comprise, and run a build system. (An adaptation of djb's "redo" build-tool idea.)
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
bash Add a bash version of pastout, and the log command. Plan to have ever… Mar 15, 2013
ish Rename lib/do and lib/env subdirectories sh-inferno to ish. May 8, 2015
man/1 Rename directory sh-inferno to ish. Jan 23, 2015
test/1 Ignore intermediate files. Apr 10, 2015
.gitignore minor cleanup Jun 23, 2013
Aide Rename directory sh-inferno to ish. Jan 23, 2015
README Document license and note work by A. Grosskurth. Sep 19, 2013



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 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?

Set the shell variable crecho to echo, to print instead of execute key
production commands in do scripts.

Crelay walks the dependency graph from a file to targets which depend on it.


A new credo: no more complex makefiles.

How credo handles manual changes to generated files; default do scripts.

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


Credo is an adaptation of the unpublished build tool redo,
proposed and sketched by D.J. Bernstein.

Avery Pennarun implemented redo in python.

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.

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.