FindFLEX

Find Fast Lexical Analyzer (Flex) executable and provide a macro to generate custom build rules.

The module defines the following variables:

FLEX_FOUND

True if flex executable is found.

FLEX_EXECUTABLE

The path to the flex executable.

FLEX_VERSION

The version of flex.

FLEX_LIBRARIES

The flex libraries.

FLEX_INCLUDE_DIRS

The path to the flex headers.

The minimum required version of flex can be specified using the standard CMake syntax, e.g. find_package(FLEX 2.5.13).

If flex is found on the system, the module defines the macro:

flex_target
flex_target(<Name> <FlexInput> <FlexOutput>
            [COMPILE_FLAGS <string>]
            [DEFINES_FILE <string>]
            )

which creates a custom command to generate the <FlexOutput> file from the <FlexInput> file. <Name> is an alias used to get details of this custom command.

The options are:

COMPILE_FLAGS <string>

Space-separated flex options added to the flex command line. A ;-list will not work.

DEFINES_FILE <string>

Added in version 3.5.

If flex is configured to output a header file, this option may be used to specify its name.

Changed in version 3.17: When CMP0098 is set to NEW, flex runs in the CMAKE_CURRENT_BINARY_DIR directory.

The macro defines the following variables:

FLEX_<Name>_DEFINED

True if the macro ran successfully.

FLEX_<Name>_OUTPUTS

The source file generated by the custom rule, an alias for <FlexOutput>.

FLEX_<Name>_INPUT

The flex source file, an alias for <FlexInput>.

FLEX_<Name>_OUTPUT_HEADER

The header flex output, if any.

Flex scanners often use tokens defined by Bison: the code generated by Flex depends of the header generated by Bison. This module also defines a macro:

add_flex_bison_dependency
add_flex_bison_dependency(<FlexTarget> <BisonTarget>)

which adds the required dependency between a scanner and a parser where <FlexTarget> and <BisonTarget> are the first parameters of respectively flex_target and bison_target macros.

Examples

find_package(BISON)
find_package(FLEX)

bison_target(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp)
flex_target(MyScanner lexer.l  ${CMAKE_CURRENT_BINARY_DIR}/lexer.cpp)
add_flex_bison_dependency(MyScanner MyParser)

include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(Foo
  Foo.cc
  ${BISON_MyParser_OUTPUTS}
  ${FLEX_MyScanner_OUTPUTS}
)
target_link_libraries(Foo ${FLEX_LIBRARIES})