# FindBISON

Find `bison` executable and provide a macro to generate custom build rules.

The module defines the following variables:

`BISON_FOUND`

  True if the program was found.

`BISON_EXECUTABLE`

  The path to the `bison` program.

`BISON_VERSION`

  The version of `bison`.

The minimum required version of `bison` can be specified using the standard CMake syntax, e.g. `find_package(BISON 2.1.3)`.

If `bison` is found, the module defines the macro:

bison_target

      bison_target(<Name> <YaccInput> <CodeOutput>
                   [OPTIONS <options>...]
                   [COMPILE_FLAGS <string>]
                   [DEFINES_FILE <file>]
                   [VERBOSE [<file>]]
                   [REPORT_FILE <file>]
                   )

which will create a custom rule to generate a parser. `<YaccInput>` is the path to a yacc file. `<CodeOutput>` is the name of the source file generated by bison. A header file can also be generated, and contains the token list.

Changed in version 3.14: When `CMP0088` is set to `NEW`, `bison` runs in the `CMAKE_CURRENT_BINARY_DIR` directory.

The options are:

`OPTIONS <options>...`

  Added in version 4.0.

  A semicolon-separated list of options added to the `bison` command line.

`COMPILE_FLAGS <string>`

  Deprecated since version 4.0.

  Space-separated bison options added to the `bison` command line. A ;-list will not work. This option is deprecated in favor of `OPTIONS <options>...`.

`DEFINES_FILE <file>`

  Added in version 3.4.

  Specify a non-default header `<file>` to be generated by `bison`.

`VERBOSE [<file>]`

  Tell `bison` to write a report file of the grammar and parser.

  Deprecated since version 3.7: If `<file>` is given, it specifies path the report file is copied to. `[<file>]` is left for backward compatibility of this module. Use `VERBOSE REPORT_FILE <file>`.

`REPORT_FILE <file>`

  Added in version 3.7.

  Specify a non-default report `<file>`, if generated.

The macro defines the following variables:

`BISON_<Name>_DEFINED`

  True if the macro ran successfully.

`BISON_<Name>_INPUT`

  The input source file, an alias for `<YaccInput>`.

`BISON_<Name>_OUTPUT_SOURCE`

  The source file generated by `bison`.

`BISON_<Name>_OUTPUT_HEADER`

  The header file generated by `bison`.

`BISON_<Name>_OUTPUTS`

  All files generated by `bison` including the source, the header and the report.

`BISON_<Name>_OPTIONS`

  Added in version 4.0.

  Options used in the `bison` command line.

`BISON_<Name>_COMPILE_FLAGS`

  Deprecated since version 4.0.

  Options used in the `bison` command line. This variable is deprecated in favor of `BISON_<Name>_OPTIONS` variable.

## Examples

    find_package(BISON)
    bison_target(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp
                 DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/parser.h)
    add_executable(Foo main.cpp ${BISON_MyParser_OUTPUTS})

Adding additional command-line options to the `bison` executable can be passed as a list. For example, adding the `-Wall` option to report all warnings, and `--no-lines` (`-l`) to not generate `#line` directives.

    find_package(BISON)

    if(BISON_FOUND)
      bison_target(MyParser parser.y parser.cpp OPTIONS -Wall --no-lines)
    endif()

Generator expressions can be used in `OPTIONS <options...`. For example, to add the `--debug` (`-t`) option only for the `Debug` build type:

    find_package(BISON)

    if(BISON_FOUND)
      bison_target(MyParser parser.y parser.cpp OPTIONS $<$<CONFIG:Debug>:-t>)
    endif()