1*2abb3134SXin Li#!/bin/bash 2*2abb3134SXin Li# 3*2abb3134SXin Li# Build automation. 4*2abb3134SXin Li# 5*2abb3134SXin Li# Usage: 6*2abb3134SXin Li# ./build.sh [function name] 7*2abb3134SXin Li# 8*2abb3134SXin Li# Important targets are: 9*2abb3134SXin Li# cpp-client: Build the C++ client 10*2abb3134SXin Li# doc: build docs with Markdown 11*2abb3134SXin Li# fastrand: build Python extension module to speed up the client simulation 12*2abb3134SXin Li# 13*2abb3134SXin Li# If no function is specified all 3 targets will be built. 14*2abb3134SXin Li 15*2abb3134SXin Liset -o nounset 16*2abb3134SXin Liset -o pipefail 17*2abb3134SXin Liset -o errexit 18*2abb3134SXin Li 19*2abb3134SXin Lilog() { 20*2abb3134SXin Li echo 1>&2 "$@" 21*2abb3134SXin Li} 22*2abb3134SXin Li 23*2abb3134SXin Lidie() { 24*2abb3134SXin Li log "FATAL: $@" 25*2abb3134SXin Li exit 1 26*2abb3134SXin Li} 27*2abb3134SXin Li 28*2abb3134SXin Lirun-markdown() { 29*2abb3134SXin Li local md=`which markdown || echo "cat"` 30*2abb3134SXin Li 31*2abb3134SXin Li # Markdown is output unstyled; make it a little more readable. 32*2abb3134SXin Li cat <<EOF 33*2abb3134SXin Li <!DOCTYPE html> 34*2abb3134SXin Li <html> 35*2abb3134SXin Li <head> 36*2abb3134SXin Li <meta charset="UTF-8"> 37*2abb3134SXin Li <style type="text/css"> 38*2abb3134SXin Li code { color: green; } 39*2abb3134SXin Li pre { margin-left: 3em; } 40*2abb3134SXin Li </style> 41*2abb3134SXin Li <!-- INSERT LATCH JS --> 42*2abb3134SXin Li </head> 43*2abb3134SXin Li <body style="margin: 0 auto; width: 40em; text-align: left;"> 44*2abb3134SXin Li <!-- INSERT LATCH HTML --> 45*2abb3134SXin LiEOF 46*2abb3134SXin Li 47*2abb3134SXin Li $md "$@" 48*2abb3134SXin Li 49*2abb3134SXin Li cat <<EOF 50*2abb3134SXin Li </body> 51*2abb3134SXin Li </html> 52*2abb3134SXin LiEOF 53*2abb3134SXin Li} 54*2abb3134SXin Li 55*2abb3134SXin Lirun-dot() { 56*2abb3134SXin Li local in=$1 57*2abb3134SXin Li local out=$2 58*2abb3134SXin Li 59*2abb3134SXin Li local msg="dot not found (perhaps 'sudo apt-get install graphviz')" 60*2abb3134SXin Li which dot >/dev/null || die "$msg" 61*2abb3134SXin Li 62*2abb3134SXin Li log "Running dot" 63*2abb3134SXin Li # width, height 64*2abb3134SXin Li dot \ 65*2abb3134SXin Li -Tpng -Gsize='2,4!' -Gdpi=300 \ 66*2abb3134SXin Li -o $out $in 67*2abb3134SXin Li} 68*2abb3134SXin Li 69*2abb3134SXin Li# Scan for TODOs. Does this belong somewhere else? 70*2abb3134SXin Litodo() { 71*2abb3134SXin Li find . -name \*.py -o -name \*.R -o -name \*.sh -o -name \*.md \ 72*2abb3134SXin Li | xargs --verbose -- grep -w TODO 73*2abb3134SXin Li} 74*2abb3134SXin Li 75*2abb3134SXin Li# 76*2abb3134SXin Li# Targets: build "doc" or "fastrand" 77*2abb3134SXin Li# 78*2abb3134SXin Li 79*2abb3134SXin Li# Build dependencies: markdown tool. 80*2abb3134SXin Lidoc() { 81*2abb3134SXin Li mkdir -p _tmp _tmp/doc 82*2abb3134SXin Li 83*2abb3134SXin Li # For now, just one file. 84*2abb3134SXin Li # TODO: generated docs 85*2abb3134SXin Li run-markdown <README.md >_tmp/README.html 86*2abb3134SXin Li run-markdown <doc/randomness.md >_tmp/doc/randomness.html 87*2abb3134SXin Li 88*2abb3134SXin Li run-markdown <doc/data-flow.md >_tmp/doc/data-flow.html 89*2abb3134SXin Li run-dot doc/data-flow.dot _tmp/doc/data-flow.png 90*2abb3134SXin Li 91*2abb3134SXin Li log 'Wrote docs to _tmp' 92*2abb3134SXin Li} 93*2abb3134SXin Li 94*2abb3134SXin Li# Build dependencies: Python development headers. Most systems should have 95*2abb3134SXin Li# this. On Ubuntu/Debian, the 'python-dev' package contains headers. 96*2abb3134SXin Lifastrand() { 97*2abb3134SXin Li pushd tests >/dev/null 98*2abb3134SXin Li python setup.py build 99*2abb3134SXin Li # So we can 'import _fastrand' without installing 100*2abb3134SXin Li ln -s --force build/*/_fastrand.so . 101*2abb3134SXin Li ./fastrand_test.py 102*2abb3134SXin Li 103*2abb3134SXin Li log 'fastrand built and tests PASSED' 104*2abb3134SXin Li popd >/dev/null 105*2abb3134SXin Li} 106*2abb3134SXin Li 107*2abb3134SXin Licpp-client() { 108*2abb3134SXin Li pushd client/cpp 109*2abb3134SXin Li mkdir --verbose -p _tmp 110*2abb3134SXin Li make _tmp/rappor_sim # this builds an executable using it 111*2abb3134SXin Li popd 112*2abb3134SXin Li} 113*2abb3134SXin Li 114*2abb3134SXin Liif test $# -eq 0 ; then 115*2abb3134SXin Li cpp-client 116*2abb3134SXin Li doc 117*2abb3134SXin Li fastrand 118*2abb3134SXin Lielse 119*2abb3134SXin Li "$@" 120*2abb3134SXin Lifi 121