1#!/bin/bash -u
2
3if [[ -z "${ANDROID_BUILD_TOP:-}" ]] ; then
4  echo >&2 "*** ERROR: $(basename $0) requires envar ANDROID_BUILD_TOP to be set"
5  exit 1
6fi
7
8DRYRUN=""
9MODE="update"
10while [[ $# -ne 0 ]] ; do
11  case "${1}" in
12    --dryrun)
13      DRYRUN="echo"
14      shift
15      ;;
16    --mode=*)
17      MODE=${1#"--mode="}
18      shift
19      ;;
20    *)
21      echo >&2 "*** USAGE: $(basename $0) [--dryrun] [--mode={update|hook}]"
22      exit 1
23      ;;
24  esac
25done
26
27TOOL=$(dirname $0)/generate_api.py
28SPECFILE=$(dirname $0)/types.spec
29HALDIR=${ANDROID_BUILD_TOP}/hardware/interfaces/neuralnetworks
30NDKDIR=${ANDROID_BUILD_TOP}/packages/modules/NeuralNetworks/runtime/include
31CANONICALDIR=${ANDROID_BUILD_TOP}/packages/modules/NeuralNetworks/common/include/nnapi
32
33RET=0
34function doit {
35  typeset -r kind="$1" in="$2" out="$3"
36  echo "=== $kind"
37  ${DRYRUN} ${TOOL} --kind ${kind} --specification ${SPECFILE} --template ${in} --out ${out}
38  if [[ $? -ne 0 ]] ; then RET=1 ; fi
39}
40
41function check {
42  typeset -r kind="$1" in="$2" out="$3"
43  TEMPFILE=$(mktemp)
44  doit ${kind} ${in} ${TEMPFILE}
45  if [[ ${RET} -eq 0 ]] ; then
46    ${DRYRUN} cmp -s ${out} ${TEMPFILE} || {
47      RET=1
48      echo >&2 "Error: $(basename ${out}) is out of sync with $(basename ${in}) or types.spec. Please run generate_api.sh before uploading."
49    }
50  fi
51}
52
53case "${MODE}" in
54  update)
55    doit canonical $(dirname $0)/Types.t ${CANONICALDIR}/Types.h
56    doit canonical $(dirname $0)/OperandTypes.t ${CANONICALDIR}/OperandTypes.h
57    doit canonical $(dirname $0)/OperationTypes.t ${CANONICALDIR}/OperationTypes.h
58    doit ndk $(dirname $0)/NeuralNetworksTypes.t ${NDKDIR}/NeuralNetworksTypes.h
59    doit hal_1.0 ${HALDIR}/1.0/types.t ${HALDIR}/1.0/types.hal
60    doit hal_1.1 ${HALDIR}/1.1/types.t ${HALDIR}/1.1/types.hal
61    doit hal_1.2 ${HALDIR}/1.2/types.t ${HALDIR}/1.2/types.hal
62    doit hal_1.3 ${HALDIR}/1.3/types.t ${HALDIR}/1.3/types.hal
63    ;;
64  hook)
65    check canonical $(dirname $0)/Types.t ${CANONICALDIR}/Types.h
66    check canonical $(dirname $0)/OperandTypes.t ${CANONICALDIR}/OperandTypes.h
67    check canonical $(dirname $0)/OperationTypes.t ${CANONICALDIR}/OperationTypes.h
68    check ndk $(dirname $0)/NeuralNetworksTypes.t ${NDKDIR}/NeuralNetworksTypes.h
69    ;;
70  *)
71    echo >&2 "*** Unknown mode: ${MODE}"
72    exit 1
73    ;;
74esac
75
76if [[ ${RET} -ne 0 ]] ; then
77  echo >&2 "*** FAILED"
78fi
79exit ${RET}
80