blob: 44c5cd5113295fc4ed5cd802e1566af410a70d71 [file] [log] [blame]
#!/bin/bash
#
# Build automation.
#
# Usage:
# ./build.sh [function name]
#
# Important targets are:
# cpp-client: Build the C++ client
# doc: build docs with Markdown
# fastrand: build Python extension module to speed up the client simulation
#
# If no function is specified all 3 targets will be built.
set -o nounset
set -o pipefail
set -o errexit
log() {
echo 1>&2 "$@"
}
die() {
log "FATAL: $@"
exit 1
}
run-markdown() {
local md=`which markdown || echo "cat"`
# Markdown is output unstyled; make it a little more readable.
cat <<EOF
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">
code { color: green; }
pre { margin-left: 3em; }
</style>
<!-- INSERT LATCH JS -->
</head>
<body style="margin: 0 auto; width: 40em; text-align: left;">
<!-- INSERT LATCH HTML -->
EOF
$md "$@"
cat <<EOF
</body>
</html>
EOF
}
run-dot() {
local in=$1
local out=$2
local msg="dot not found (perhaps 'sudo apt-get install graphviz')"
which dot >/dev/null || die "$msg"
log "Running dot"
# width, height
dot \
-Tpng -Gsize='2,4!' -Gdpi=300 \
-o $out $in
}
# Scan for TODOs. Does this belong somewhere else?
todo() {
find . -name \*.py -o -name \*.R -o -name \*.sh -o -name \*.md \
| xargs --verbose -- grep -w TODO
}
#
# Targets: build "doc" or "fastrand"
#
# Build dependencies: markdown tool.
doc() {
mkdir -p _tmp _tmp/doc
# For now, just one file.
# TODO: generated docs
run-markdown <README.md >_tmp/README.html
run-markdown <doc/randomness.md >_tmp/doc/randomness.html
run-markdown <doc/data-flow.md >_tmp/doc/data-flow.html
run-dot doc/data-flow.dot _tmp/doc/data-flow.png
log 'Wrote docs to _tmp'
}
# Build dependencies: Python development headers. Most systems should have
# this. On Ubuntu/Debian, the 'python-dev' package contains headers.
fastrand() {
pushd tests >/dev/null
python setup.py build
# So we can 'import _fastrand' without installing
ln -s --force build/*/_fastrand.so .
./fastrand_test.py
log 'fastrand built and tests PASSED'
popd >/dev/null
}
cpp-client() {
pushd client/cpp
mkdir --verbose -p _tmp
make _tmp/rappor_sim # this builds an executable using it
popd
}
if test $# -eq 0 ; then
cpp-client
doc
fastrand
else
"$@"
fi