kconfig_lint is a tool to help identify issues within coreboot's Kconfig
files.  It is very specific to coreboot, and is not intended to be used as a
generic Kconfig lint tool for other projects.

Operation:
kconfig_lint parses the entire kconfig tree, building up a hash table of all
of the statements.  It then searches the coreboot tree looking for all usage of
any Kconfig symbols.  By combining these two, it is able to find many issues
that would be difficult to locate otherwise.

Usage:
kconfig_lint <options>
 -o|--output=file    Set output filename
 -p|--print          Print full output
 -e|--errors_off     Don't print warnings or errors
 -w|--warnings_off   Don't print warnings
 -n|--notes          Show minor notes
 -G|--no_git_grep    Use standard grep tools instead of git grep


Options:
 -o|--output=file    Send the output to a file instead of printing to stdout.

 -p|--print          Shows the entire Kconfig tree as parsed by kconfig_lint,
                     including the filename and line number of each statement.
                     This can be very helpful for debugging Kconfig issues.

 -e|--errors_off     Suppress both error and warning output.  Useful along with
                     the --print command

-w|--warnings_off    Suppress warning output

-n|--notes           Enable the display of minor notes that kconfig_lint has
                     found.  These might be issues, but probably are not.

 -G|--no_git_grep    Instead of using the 'git grep' command, use regular grep.
                     This is useful for checking coreboot trees that are not
                     contained in a git repo.

Issues that kconfig_lint checks for:

Notes:
- Show when the range set for a hex or int does not match a previous range

Warnings in Kconfig files:
- Any 'default' expressions that can never be reached.
- Symbols that are defined but never used.
- Help text starting with no whitespace.
- Directories specified in a 'source' keyword do not exist.
- A 'source' keyword loading a Kconfig file that has already been loaded.
- A 'source' keyword loading a Kconfig file that doesn't exist. Note that
  globs are excluded from this check.

Warnings in coreboot source files:
- #define of Kconfig symbol - Symbols should only be defined in Kconfig.
- #define starting with 'CONFIG_' - these should be reserved for Kconfig
  symbols.
- 'IS_ENABLED()' block that could not be interpreted.
- Kconfig files that are not loaded by a 'source' keyword.
- '#ifdef' or '#if defined' used on bool, int, or hex - these are always
  defined in coreboot's version of Kconfig.

Errors in Kconfig files:
- Selects do not work on symbols created in a choice block.
- All symbols used in selects or expressions must be defined in a config
  statement.
- 'endchoice' keyword not used in a choice block
- Choice block defined with no symbols.
- The 'tristate' type is not used in coreboot.
- A 'select' keyword used outside of a config block.
- Symbols created both inside and outside of a choice block.
- A 'range' keyword has higher minimum than maximum value.
- A config block with a prompt at the top level (the top level is currently
  just for menus).
- Indentation using spaces instead of tabs.  We indent using tabs, although
  the tab may be followed by spaces, particularly for help blocks.
- Lines not ending with a linefeed.  These can cause some keywords to not
  function properly ('source' keywords in particular).  It's also just
  generally good to end the file with a linefeed.

Errors in Kconfig that are also caught by Kconfig itself:
- Invalid expressions.
- Unrecognized keywords.
- An 'optional' keyword used outside of a choice block
- The 'select' keyword only works on bool symbols.
- A 'range' keyword used outside of a config block.
- A 'default' keyword used outside of a config or choice block.
- Symbol types must be consistent - they cannot be bool in one location and
  int in another location.
- Type keywords (bool, int, hex, string) used outside of a config block.
- Using a 'prompt' keyword not inside a config or choice block.

Errors in coreboot source files:
- The IS_ENABLED macro is only valid for bool symbols.
- The IS_ENABLED used on unknown CONFIG_ value, like an obsolete symbol.
- The IS_ENABLED macro is used on a symbol without the CONFIG_ prefix.

TODO: check for choice entries at the top level