| #!/bin/sh |
| |
| # Helper script to build multiple configurations of a benchmark. Patches the |
| # board description files to enable and disable different combinations of |
| # hardware features. Also patches include paths to keep track of the original |
| # locations. |
| |
| set -e |
| |
| SCRIPTPATH=$(dirname $(readlink -f $0)) |
| |
| BOARD=$(realpath $1) |
| BENCHMARK=$(realpath $2) |
| SDK=$(realpath $3) |
| BOARDPATH=$(dirname ${BOARD}) |
| BOARDNAME=$(basename -s .json ${BOARD}) |
| |
| if [ ! -f "${BOARD}" ] ; then |
| echo "First argument must be the path of a board description file. '${BOARD}' is not a valid file" |
| exit 1 |
| fi |
| if [ ! -f "${BENCHMARK}/xmake.lua" ] ; then |
| echo "Second argument must be the path of a benchmark file. '${BENCHMARK}' does not contain an xmake.lua file" |
| exit 1 |
| fi |
| if [ ! -d "${SDK}" ] ; then |
| echo "Third argument must be the path of the sdk. '${SDK}' does not exist" |
| exit 1 |
| fi |
| if [ ! -f "${SDK}/bin/clang" ] ; then |
| echo "Third argument must be the path of the sdk. '${SDK}/bin/clang' does not exist" |
| exit 1 |
| fi |
| |
| # Set up a temporary directory to work in. |
| DIR=$(mktemp -d benchmark.XXX) || exit 1 |
| echo Working in ${DIR}... |
| DIR=$(pwd)/${DIR} |
| cd ${DIR} |
| |
| |
| # Create a directory for the board files |
| |
| mkdir boards |
| cd boards |
| |
| |
| # Our JSON files are slightly extended JSON, parse them with xmake's JSON |
| # parser and spit them out as standard JSON so that jq can consume them. |
| cp ${BOARD} basic.json |
| cat <<EOF > xmake.lua |
| target('fake') |
| on_load(function (target) |
| import("core.base.json") |
| local board = json.loadfile(path.join(os.scriptdir(), 'basic.json')) |
| json.savefile(path.join(os.scriptdir(), 'standard.json'), board) |
| end |
| ) |
| EOF |
| xmake f > /dev/null |
| rm xmake.lua basic.json |
| rm -rf .xmake |
| |
| # Create variants of the board with different versions of the revoker and with |
| # and without the stack high watermark. |
| |
| jq '.revoker="software" | .stack_high_water_mark=false' < standard.json > ${BOARDNAME}-software-revoker.json |
| jq '.revoker="software" | .stack_high_water_mark=true' < standard.json > ${BOARDNAME}-software-revoker-shwm.json |
| jq '.revoker="hardware" | .stack_high_water_mark=false' < standard.json > ${BOARDNAME}-hardware-revoker.json |
| jq '.revoker="hardware" | .stack_high_water_mark=true' < standard.json > ${BOARDNAME}-hardware-revoker-shwm.json |
| jq 'del(.revoker) | .stack_high_water_mark=false' < standard.json > ${BOARDNAME}-no-revoker.json |
| jq 'del(.revoker) | .stack_high_water_mark=false | .defines[.defines| length]|= .+"CHERIOT_FAKE_REVOKER"' < standard.json > ${BOARDNAME}-fake-revoker.json |
| rm standard.json |
| |
| CONFIGS="${BOARDNAME}-software-revoker ${BOARDNAME}-software-revoker-shwm ${BOARDNAME}-hardware-revoker ${BOARDNAME}-hardware-revoker-shwm ${BOARDNAME}-no-revoker ${BOARDNAME}-fake-revoker" |
| |
| # Patch the include directories so that relative paths become absolute relative |
| # to the board file. |
| for I in ${CONFIGS}; do |
| # Fix up includes if they expect to be relative to the board file path |
| # In addition to absolute paths, also pass through anything that starts |
| # with a $. This is a substitution variable that xmake will fill in (for |
| # example ${sdk} for the location of the SDK). |
| jq ".driver_includes = (.driver_includes | map_values(. = if . | startswith(\"/\") or startswith(\"\$\") then . else \"${BOARDPATH}/\" + . end))" < $I.json > $I.json.fixed |
| mv $I.json.fixed $I.json |
| done |
| |
| |
| cd .. |
| |
| # Build each configuration |
| for I in ${CONFIGS}; do |
| echo $I |
| mkdir $I |
| cd $I |
| echo xmake f --sdk=${SDK} --board=${DIR}/boards/$I.json -P ${BENCHMARK} |
| xmake f --sdk=${SDK} --board=${DIR}/boards/$I.json -P ${BENCHMARK} |
| xmake -P ${BENCHMARK} |
| cd .. |
| done |
| |
| # Let the user know where we put them all. |
| for I in ${CONFIGS}; do |
| echo Benchmark built in ${DIR}/$I |
| done |