| #!/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 |