#!/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 $md "$@" cat < 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 _tmp/README.html run-markdown _tmp/doc/randomness.html run-markdown _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