查找FLEX

查找快速词法分析器 (Flex) 可执行文件并提供一个宏来生成自定义构建规则

该模块定义了以下变量:

FLEX_FOUND - True is 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

可以使用标准语法指定最低要求的 flex 版本,例如 find_package(FLEX 2.5.13)()

如果在系统上找到 flex,则该模块提供宏:

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

它创建一个自定义命令以从 FlexInput 文件生成 FlexOutput 文件。名称是用于获取此自定义命令的详细信息的别名。如果指定了 COMPILE_FLAGS 选项,则将下一个参数添加到 flex 命令行。

在 3.5 版本加入: 如果 flex 配置为输出头文件,则可以使用“DEFINES_FILE”选项来指定其名称。

在 3.17 版本发生变更: 当 CMP0098 设置为 NEW 时,flex 在 CMAKE_CURRENT_BINARY_DIR 目录中运行。

该宏定义了以下变量:

FLEX_${Name}_DEFINED - true is 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 扫描器通常使用 Bison 定义的令牌:Flex 生成的代码取决于 Bison 生成的标头。该模块还定义了一个宏:

ADD_FLEX_BISON_DEPENDENCY(FlexTarget BisonTarget)

它在扫描器和解析器之间添加了所需的依赖关系,其中 FlexTargetBisonTarget 分别是 FLEX_TARGETBISON_TARGET 宏的第一个参数。

====================================================================
Example:
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})
====================================================================