#
# This file specifies defaults so the testcase running system knows
# how to build Zephyr apps.
#
# It looks all like comments so that it can also put this stuff inside
# Makefiles, shell scripts, python, C, etc...
#
# Things like:
#
## ^COMMAND ARGUMENTS
## @COMMAND ARGUMENTS
#
# are what the parser looks for. ^COMMAND means that if it fails or
# block, the list of COMMANDs will not continue being executed, @
# means the next commands still will be executed. Note the ## is so
# that the parser doesn't interpret it as a command, as we are
# documenting it.

# Variables
# ---------
#
# Every %(VARIABLE)s you are going to use or maybe override has to be
# defined; otherwise it'll throw a KeyError exception on you.
#
# Some are pre-filled by the system (see below), but others are
# user-defined and some test cases make use of it, so we define a
# default value (empty) here:
#
# @var extra_args


# Building
# --------
#
# - we always remove the configuration file to force it being
#   re-generated. Why? because otherwise, in some cases,
#   'silentoldconfig' tries to update it with input from the user and
#   fails. When it is not needed. So before we start mucking with it,
#   remove it.
#
# - then we generate the init config -- why? because to filter which
#   test cases we can run, we need to see if a CONFIG option is
#   enabled or not.
#
# - We need to put the output of the compilation on a directory
#   specific to the target and testcase we are building for because:
#
#   - two targets, although the same hardware, might have differences
#     that could be or not specified in the target's tags.
#
#   - multiple paralallel builds for the same testcase PATH with
#     different testcase names (especially those coming from
#     testcase.ini) files can collide with each other.
#
# Thus is the `%(tchash)s` substitution, which is a unique hash
# for a combination of the testcase name, the target and the
# bsp_model.

# (1) First build step to generate the configuration:
#
# ^build \
#   rm -f %(srcdir)s/outdir-%(tchash)s-%(board)s/.config; \
#   mkdir -p %(srcdir)s/outdir-%(tchash)s-%(board)s; \
#   make -j -C %(srcdir)s/ %(extra_args)s \
#       BOARD=%(board)s O=outdir-%(tchash)s-%(board)s \
#       initconfig
#
#     Once we have the configuration generated, for Sanity Check test
#     cases (and others) evaluate if we have to run or not based on
#     configuration values. This is done by a Python function
#     (tcfl.tc_tci.action_eval_skip). This looks at CONFIG_ options
#     and decides if we are to skip for any reason.
#
# ^build @tcfl.tc_tci.action_eval_skip %(srcdir)s/outdir-%(tchash)s-%(board)s


# (2) Support for building/running multiple core SOC/platforms (like
#     Quark SE); each core is called 'a BSP'.
#
#     Some targets have multiple BSPs and need a stub in BSP1 for BSP2
#     to work independently, so these first @build rules take care of
#     that. How we handle this might change in the future.
#
#     The hack for altering the configuration is dirty. Looking for
#     better ones.

# (2.1) For running on Quark SE ARC only, we need to make a stub for
#       the x86 core to pipe the serial from/to the ARC. It has to
#       also be deployed, so we add said kernel to @images.
#
#    (a) Arduino 101
#
# @build [ type == "arduino101" and quark_se_stub == 'yes' and bsp_model == 'arc' ] \
#   rm -f %(srcdir_abs)s/outdir-%(tchash)s-stub-x86-arduino_101/.config; \
#   make -j -C $ZEPHYR_BASE/samples/stub \
#       BOARD=arduino_101 \
#       O=%(srcdir_abs)s/outdir-%(tchash)s-stub-x86-arduino_101
#
# @images [ type == "arduino101" and quark_se_stub == 'yes' and bsp_model == 'arc'] \
#   kernel-x86:%(srcdir)s/outdir-%(tchash)s-stub-x86-arduino_101/zephyr.bin
#
#    (b) For Quark SE Devboard v1
#
# @build [ type == "ah" and quark_se_stub == 'yes' and bsp_model == 'arc' ] \
#   rm -f %(srcdir_abs)s/outdir-%(tchash)s-stub-x86-quark_se_devboard/.config; \
#   make -j -C $ZEPHYR_BASE/samples/stub \
#       BOARD=quark_se_devboard \
#       O=%(srcdir_abs)s/outdir-%(tchash)s-stub-x86-quark_se_devboard
#
# @images [ type == "ah" and quark_se_stub == 'yes' and bsp_model == 'arc'] \
#   kernel-x86:%(srcdir)s/outdir-%(tchash)s-stub-x86-quark_se_devboard/zephyr.bin
#
#    (c) For Quark SE Devboard
#
# @build [ type == "ma" and quark_se_stub == 'yes' and bsp_model == 'arc' ] \
#   rm -f %(srcdir_abs)s/outdir-%(tchash)s-stub-x86-quark_se_devboard/.config; \
#   make -j -C $ZEPHYR_BASE/samples/stub \
#       BOARD=quark_se_devboard \
#       O=%(srcdir_abs)s/outdir-%(tchash)s-stub-x86-quark_se_devboard
#
# @images [ type == "ma" and quark_se_stub == 'yes' and bsp_model == 'arc'] \
#   kernel-x86:%(srcdir)s/outdir-%(tchash)s-stub-x86-quark_se_devboard/zephyr.bin
#

# (2.2) On Quark SE, when running the x86 core only we need to make
#       sure the kernel doesn't wait for the ARC to initialize. So we
#       do the initial config, pluck the CONFIG_ARC_INIT away and
#       reconfigure before compiling. UGLY, but it works
#
# @build [ quark_se_stub == 'yes'  and bsp_model == 'x86' ] \
#   sed -i 's/^CONFIG_ARC_INIT.*//' \
#       %(srcdir)s/outdir-%(tchash)s-%(board)s/.config; \
#   make -j -C %(srcdir)s/ %(extra_args)s \
#       BOARD=%(board)s O=outdir-%(tchash)s-%(board)s \
#       olddefconfig

# (2.3) If we are running both cores at the same time, make sure
#       ARC_INIT is set
#
# @build [ quark_se_stub == 'yes'  and bsp_model == 'x86+arc' ] \
#   echo CONFIG_ARC_INIT=y >> \
#       %(srcdir)s/outdir-%(tchash)s-%(board)s/.config; \
#   make -j -C %(srcdir)s %(extra_args)s \
#       BOARD=%(board)s O=outdir-%(tchash)s-%(board)s \
#       %(extra_args)s olddefconfig

# (2.4) Now the basic build and deploy commands that apply to all the
#       platforms
#
#       Note: we pass a RUNID that is a compositon of the RunID passed
#             with '-i' to 'tcf run' (if passed) TCHASH (which is
#             unique hash of the target and testcase name) -- this
#             ensures that succesive test cases ran in the same target
#             will have a different TC_RUNID. We will in
#             tests/.tcdefaults (when using TC_PRINT_RUNID /
#             TC_END_REPORT) to verify that the right image has been
#             deployed to the target.
#
# @build \
#   make -j -C %(srcdir)s %(extra_args)s \
#       KCPPFLAGS=-DTC_RUNID=%(runid)s:%(tchash)s \
#       BOARD=%(board)s O=outdir-%(tchash)s-%(board)s
#
#       And deploy the kernel we just built
#
# @images kernel-%(bsp)s:%(srcdir)s/outdir-%(tchash)s-%(board)s/%(kernelname)s


# Cleaning up
# -----------
#
# This is only invoked when you give `--clean` or `-L` to `tcf run`
#
# @clean rm -rf %(srcdir)s/outdir-%(tchash)s-*


# Evaluation of the test case
# ---------------------------
#
# These are the steps performed to evaluate a test case / sample for
# success in execution. In here we only list the general ones that
# apply to all of them, but each testcase will have it's specific
# ones.
#
# (1) In general, before evaluating, reset/power-cycle/resume the
#     target.
#
#     `one-shot` means only once if we are running multiple BSPs and fail
#     inmediately if it doesn't work):
#
# ^eval [ type:"(?!^emsk.*)" ] target-reset one-shot
#
#     EMSKs get their firmware loaded into RAM; if we do a full reset,
#     it is wiped, so we just do a raw reset (which means a CPU reset
#     in this case) and resume
#
# ^eval [ type:"^emsk.*" ] debug-reset-halt one-shot
# ^eval [ type:"^emsk.*" ] debug-resume one-shot
#
# (2) Fail inmmediately (^) if we find these messages, that's bad
#     stuff happening in the kernel.
#
# ^eval console-rx   %(console)s::fail USAGE FAULT
# ^eval console-rx   %(console)s::fail fatal fault in fiber
#
# For testcases under tests/, the .tcdefaults in there adds more steps
# to verify; test cases are picked up based on their
# testcase.ini. Each test case is then free to add more, if
# needed. Note than in samples, most of that information is going to
# be in .tc files.
