#-------------------------------------------------------------------------------
# Copyright (c) 2017-2019, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------

/*! @page pgSoxygenSh Using Doxygen for documenting shell scripts

To overcome Doxygen's shortcoming of not understand shell scripts, a basic
filter is used to convert the shell scripts to C source. The filter will keep
lines starting with '##' or '#!' and drop all other lines.

Doxygen must find the C declaration of all documented entities and thus
fake definitions of each documented entity must be added. It is planned to
develop a smarter filter program which will eliminate the need of fake C code.
This task is lowest possible priority though.

@section pgDoxygenShs0 Instrumenting shell scrips
- Use <em>##</em> to add the Doxygen documentation (i.e. stuff you would add to C
comments in C source files).
- Use <em>#!</em> for to add fake C code.
- The documented item and the and the fake C conterpart must match. I.e. the
  fingerprint of a variable definition must match the fake C declaration.

Notes:
 - You can use a "type" like <em>string</em> or <em>path</em> to make more
   specific what a variable is expected to hold or a function is expected to
   return. These are still is just documentation hoint's as the
   "shell comand language" does not support types.

@section pgDoxygenShs1 Example file documentation
To get any documentation genertased for a shell script file, please incude a
<em>\@file</em> special command in it.

@code{.sh}
##
##@file
##@brief Shell documentation examples
##
##Detailed description.
##
@endcode

This is how the generated documentation looks like: \ref examples.sh

@section pgDoxygenShs2 Example variable documentation
@code{.sh}
##@var string example_variable
##@brief Example variable
##
##This is an example to show ho to document variables.
##
#This is needed for doxygen for now.
#!string example_variable;
@endcode

This is how the generated documentation looks like: \ref example_variable.

Notes:
 - The variable definition at line 1 and line 7, i.e. the documented variable
   and the fake C conterpart must match.

@section pgDoxygenShs3 Example function documentation
@code{.sh}
##@fn example_function(path build_base_dir, string build_config_name)
##@brief En example function.
##@param[in] build_base_dir
##@param[in] build_config_name
##@returns N/A
##
##This function was only made to show how-to document a function.
##
##Usage:
##  command | result
##  --------|-------
##  example_function "test_build_st32" "somestring" | Do whatever is done.
##
#This is needed for doxygen for now.
#!void example_function(path build_base_dir, string build_config_name){};
#
@endcode

This is how the generated documentation looks like: \ref example_function.

Notes:
 - The function definition at line 1 and line 15, i.e. the documented function
   and the fake C conterpart must match.


@section pgSoxygenShs2 General documentation
All documentation which is not documenting source code (shell script)
shall be added to *.dox files.

*/
