mbld [-?hcfrSs] [-b bin] [-l lib]
[-R src] [-I inc] [-B base] [-r runtime]
[all | clean | install | uninstall | test | file... | target...]
The 'mbld' tool takes as input a list of Myrddin or assembly
sources, and compiles them in the correct dependency order into either a
library or an executable.
By default, it reads from an input file called 'bld.proj', but if
given the option -b or -l, it will build a binary or library,
respectively, from the arguments specified on the command lines.
Mbld will default to building for the current architecture and
operating system.
- -h | -?
- Print a summary of the available options.
- -b binname
- Compile source into a binary named 'name'. If neither this option nor the
-l option are given, mbld will create a binary called a.out.
- -I path
- Add 'path' to the search path for unquoted use statments. This option does
not affect the search path for local usefiles, which are always searched
relative to the compiler's current working directory. Without any options,
the search path defaults to /usr/include/myr.
- -l libname
- Compile source given into a library called 'libname.a' (or the
equivalent for the target platform), and a matching usefile called 'name'.
Only static libraries are currently supported. Ignores the contents of
bld.proj and bld.sub if they exist.
- -R src
- Compile source given into a binary in temporary storage, and then execute
it with the command line arguments passed in.
- -S
- Tell the toolchain to generate assembly for the code being compiled as
well as the .o files, as though -S was passed to 6m.
- -r runtime
- Compile a binary using the runtime rt. If the runtime name given is
none, then no runtime will be linked. If this option is not
provided, then the default runtime in
$INSTALL_ROOT/myr/lib/_myrrt.o will be used.
Mbld already knows how to do most of the common commands. Given a
file describing your project, it can build, test, clean, install, uninstall,
and benchmark your code.
- all
- The all action will build all the non-test targets specified in the
build file. If there are generated files included in the build, then their
generation commands will be run.
- clean
- The clean action will remove all compiled files and non-durable
generated inputs from the build directories.
- install
- The install action will copy the generated sources, manpages, data
files, and anything else installable into the appropriate directories for
the current system. If the DESTDIR environment variable is set,
then its contexts will be prepended to the install path.
- uninstall
- The uninstall action will remove the files installed by the
install action.
- test
- The test action will build the test cases, and run them. If the
test case exits with a non-zero status, that is counted as a failure. If a
test outputs subtest data, then this target will show the output in a
pretty format.
- bench
- The bench action will build the benchmarks and run them. At the end
of the run, the run statistics are shown. Benchmarks must generate output
in the subtest format.
- list
- The list action lists all available targets for the build.
Build files contain lists of targets. Targets generally consist of
a target type. This is usually followed by target name, an attribute list,
and the list of inputs.
Each Myrddin source file may have a corresponding implicit test.
If a source file foo.myr is built, then the corresponding
test/foo.myr is used as the testcase for foo.myr if it
exists.
A typical build file may look something like:
bin foo = main.myr gen-foo.myr ;;
man = foo.1 ;;
gen gen-foo.myr = sh -c "echo $FOO > gen-foo.myr" ;;
lib foothing = lib.myr ;;
The full grammar is listed below:
bldfile : bldent+
bldent
: "bin" target
| "lib" target
| "test" target
| "bench" target
| "gen" target
| "cmd" target
| "data" flist
| "man" flist
| "sub" flist
| option
option
: "incpath" "=" list
| "libdeps" "=" list
| "testdeps" "=" list
| "runtime" word
| "noinst"
target : name [attrs] "=" list
flist : [attrs] "=" list
list : name+ ";;"
attrs : "{" (key [ "=" value])* "}"
name : <nonspace> | <quoted word>
Bin, test, and bench targets all behave in a very similar way.
They all produce a single binary from a list of Myrddin sources, scraping
the appropriate library dependencies and building any libraries from the
local source directories. Bin targets are installed to ${BASEDIR}/bin
when invoking mbld install. Test and bench targets built and
run when invoking mbldbench. Tests are run with the cwd
set to the directory that contains the test source
Lib targets also resemble bin targets, but instead of producing a
binary, they produce a .use and .a file pair. These files are
installed to ${BASEDIR}/lib/myr when invoking
mbldinstall.
Gen and cmd targets are also similar to each other, varying
largely in when and how they are invoked. Gen targets specify an output
file, and are run in response to a target requiring their output.
On the other targets are not invoked implicitly at all, unless
they have an attribute such as test or bench. Instead, they
are invoked explicitly by the user, bundling up some useful command or
another, possibly providing system specific variants.
Data targets allow the specification of bundled static data. This
data may be generated from a gen target, or may simply be shipped as
a file. The data is installed to the system specific share directory. For
example, on Unix, this may be ${BASEDIR}/share.
Man targets are installed to the system-appropriate manual
directory. The section is determined by the manpage suffix. For example
foo.1 would be installed into section 1 of the manual.
Sub targets include a bld.sub or bld.proj from a
subdirectory. If the file in the subdirectory is bld.proj then the
root of the project is changed for that subbuild.
Many targets support attributes. These are the valid attributes
allowed in the targets.
- ldscript
- Link the target using an ldscript. This is a system dependent option, and
should be avoided. Valid on binary targets.
- runtime
- Link the target using a custom runtime. Valid on binary targets
- inc=path
- Add a path to the include path. Valid on binary targets.
- tag=tagname
- Build this target only when the build tag tag is specified.
- inst
- Install this target. This is the default for all non-test targets.
- noinst
- Do not install this target when running mbld install.
- test
- This target should run as a test. This is how command targets are turned
into test runners.
- bench
- This target is run as a benchmark. This is how command targets are turned
into benchmark runners.
- notest
- This target is not to be run as a benchmark. It's particularly fun to use
in conjunction with test targets, in spite of being spectacularly useless.
- durable
- The file generated by this gen or cmd target should not be
removed with mbld clean. This is useful for keeping around
files where the user may not have or want to run the generation code.
- dep=path
- Specifies that a gen or cmd target should be re-run when the
argument changes.
- path=path
- When specified on a data target, provides the desired installation
directory. Defaults to ${BASEDIR}/share.
- bld.proj
- The root project file. All paths in bldfiles are relative to the most
recent one in the directory heirarchy.
- bld.sub
- A sub build. This contains targets, and may specify dependencies on other
targets within the same project.
mbld
The command above will load bld.proj and all associated sub
builds, and run the commands to incrementally rebuild the code.
mbld -l foo bar.myr baz.myr
The command above will ignore bld.proj and produce a library named
libfoo.a, consisting of the files bar.myr and
baz.myr
- DESTDIR
- prepends $DESTDIR to the path to install to. For example, if the installgg
prefix is /usr, the binary path is bin/, then binaries will get copied to
$DESTDIR/usr/bin on mbld install
- MYR_MC
- Compiles the binaries with $MYR_MC instead of the default value,
6m.
- MYR_MUSE
- Merges usefiles with $MYR_MUSE instead of hte default value
muse.
- MYR_RT
- Links with the runtime $MYR_RT instead of the default
${BASEDIR}/lib/myr/_myrrt.o.
The source for mbld is available from
git://git.eigenstate.org/git/ori/mc.git and lives in the mbld/
directory within the source tree.
6m(1) muse(1) ld(1) as(1)