# generic_script_wrapper

This module provides a way to integrate an external command into an f4pga flow.
Its inputs and outputs are fully defined by the author of flow definition.

## Parameters

Parameters are everything when it comes to this module:

* `stage_name` (string, optional): Name describing the stage
* `script` (string, mandatory): Path to the script to be executed
* `interpreter` (string, optional): Interpreter for the script
* `cwd` (string, optional): Current Working Directory for the script
* `outputs` (dict[string -> dict[string -> string]],
           mandatory):
  A dict with output descriptions (dicts). Keys name output dependencies.
  * `mode` (string, mandatory): "file" or "stdout". Describes how the output is
    grabbed from the script.
  * `file` (string, required if `mode` is "file"): Name of the file generated by the
    script.
  * `target` (string, required): Default name of the file of the generated
    dependency. You can use all values available during map_io stage. Each input
    dependency also gets two extra values associated with it:
    `:dependency_name[noext]`, which contains the path to the dependency the
    extension with anything after last "." removed and `:dependency_name[dir]` which
    contains directory paths of the dependency. This is useful for deriving an output
    name from the input.
  * `meta` (string, optional): Description of the output dependency.
* `inputs` (dict[string -> string | bool], mandatory):
  A dict with input descriptions. Key is can be a name of a named argument, a
  position of unnamed argument, when prefaced with "#" (eg. "#1"), or a name of an
  environmental variable, when prefaced with "$". Positions are indexed
  from 1, as it's a convention that 0th argument is the path of the executed program.
  Values are strings that can contain references to variables to be resolved
  after the project flow configuration is loaded (that means they can reference
  values and dependencies which are to be set by the user). All of modules inputs
  will be determined by the references used. Thus dependency and value definitions
  are implicit. If the value of the resolved string is empty and is associated with a
  named argument, the argument in question will be skipped entirely. This allows
  using optional dependencies. To use a named argument as a flag instead, set it to
  `true`.
