xref: /aosp_15_r20/external/rappor/build.sh (revision 2abb31345f6c95944768b5222a9a5ed3fc68cc00)
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