blob: 630a8e744954617c85bf7510bf64145fdbfec55b [file] [log] [blame]
#!/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