FindFLEX

查找快速词法分析器 (Flex) 命令行生成器及其库,并提供 CMake 命令来创建使用 Flex 的自定义构建规则

find_package(FLEX [<version>] ...)

Flex 生成词法分析器,也称为 扫描器词法分析器。它还包括一个运行时库(fl),为生成的扫描器提供支持函数,例如输入处理、缓冲区管理和错误报告。

结果变量

此模块定义了以下变量

FLEX_FOUND

布尔值,指示是否找到(请求版本的)Flex。

FLEX_VERSION

找到的 Flex 版本。

FLEX_INCLUDE_DIRS

包含用于使用 Flex 库的头文件的包含目录。

FLEX_LIBRARIES

链接以使用 Flex 库所需的库。

缓存变量

以下缓存变量也可以设置

FLEX_EXECUTABLE

flex 可执行文件的路径。

命令

如果找到 flex,此模块提供以下命令

生成扫描器

flex_target

创建自定义构建规则,以使用 Flex 从 lex 文件生成扫描器文件

flex_target(
  <name>
  <input-lex-file>
  <output-scanner-file>
  [DEFINES_FILE <header>]
  [OPTIONS <options>...]
  [COMPILE_FLAGS <string>] # Deprecated
)

3.17 版中已更改: 当策略 CMP0098 设置为 NEW 时,flexCMAKE_CURRENT_BINARY_DIR 目录中运行。

<name>

用作此命令调用标识符的字符串。

<input-lex-file>

输入 Flex 源文件(.l)的路径。如果给定相对路径,则将其解释为相对于当前源目录(CMAKE_CURRENT_SOURCE_DIR)。

<output-scanner-file>

Flex 生成的输出文件的路径。如果给定相对路径,则将其解释为相对于当前 Flex 工作目录。

DEFINES_FILE <header>

3.5 版本新增。

如果 Flex 配置为输出头文件,则此选项可用于指定其名称。如果给定相对路径,则将其解释为相对于当前 Flex 工作目录。

OPTIONS <options>...

4.0 版本新增。

添加到 flex 命令行中的额外选项的 分号分隔列表

COMPILE_FLAGS <string>

自 4.0 版起已弃用: OPTIONS <options>... 取代。

添加到 flex 命令行中的空格分隔的额外选项字符串。分号分隔列表 将不起作用。

命令变量

此命令还定义以下变量

FLEX_<name>_DEFINED

布尔值,指示此命令是否成功调用。

FLEX_<name>_INPUT

Flex 源文件,<input-lex-file> 的别名。

FLEX_<name>_OUTPUT_HEADER

3.5 版本新增。

flex 生成的头文件(如果有)。

FLEX_<name>_OUTPUTS

flex 生成的文件列表,包括输出扫描器文件和头文件。

FLEX_<name>_OPTIONS

4.0 版本新增。

用于 flex 命令的命令行选项列表。

添加扫描器和解析器之间的依赖关系

add_flex_bison_dependency

添加扫描器和解析器之间所需的依赖关系

add_flex_bison_dependency(<flex-name> <bison-name>)

Flex 扫描器通常依赖于 Bison 生成的令牌定义,这意味着 Flex 生成的代码依赖于 Bison 创建的头文件。

此命令添加扫描器和解析器之间所需的依赖关系,其中 <flex-name><bison-name> 分别是 flex_target(<name> ...)bison_target(<name> ...) 命令的第一个参数。

示例

示例:查找 Flex

查找 Flex

find_package(FLEX)

查找 Flex 并指定其所需的最低版本

find_package(FLEX 2.5.13)

查找 Flex 并使其成为必需(如果找不到 Flex,则停止处理并显示错误消息)

find_package(FLEX 2.5.13 REQUIRED)

示例:生成扫描器

查找 Flex 并在当前二进制目录中从当前源目录中的 lex 源文件生成扫描器源文件

find_package(FLEX)

if(FLEX_FOUND)
  flex_target(MyScanner lexer.l lexer.cpp)
endif()

add_executable(foo foo.cc ${FLEX_MyScanner_OUTPUTS})

示例:命令行选项

可以以列表形式传递添加到 flex 可执行文件的其他命令行选项。例如,添加 --warn 选项以报告警告,以及 --noline (-L) 以不生成 #line 指令。

find_package(FLEX)

if(FLEX_FOUND)
  flex_target(MyScanner lexer.l lexer.cpp OPTIONS --warn --noline)
endif()

生成器表达式 可以在 OPTIONS <options>... 参数中使用。例如,仅为 Debug 构建类型添加 --debug (-d) 选项

find_package(FLEX)

if(FLEX_FOUND)
  flex_target(MyScanner lexer.l lexer.cpp OPTIONS $<$<CONFIG:Debug>:--debug>)
endif()

示例:使用 Flex 库

查找 Flex 并创建接口 导入目标,该目标封装其库使用要求,以便链接到项目目标

find_package(FLEX)

if(FLEX_FOUND AND NOT TARGET FLEX::fl)
  add_library(FLEX::fl INTERFACE IMPORTED)
  set_target_properties(
    FLEX::fl
    PROPERTIES
      INTERFACE_INCLUDE_DIRECTORIES "${FLEX_INCLUDE_DIRS}"
      INTERFACE_LINK_LIBRARIES "${FLEX_LIBRARIES}"
  )
endif()

if(FLEX_FOUND)
  flex_target(MyScanner lexer.l lexer.cpp)
endif()

add_executable(Foo foo.cc ${FLEX_MyScanner_OUTPUTS})
target_link_libraries(Foo PRIVATE FLEX::fl)

示例:使用 Flex 和 Bison

以下示例演示了如何在 CMake 中使用 Flex 和 Bison

find_package(BISON)
find_package(FLEX)

if(BISON_FOUND AND FLEX_FOUND)
  bison_target(MyParser parser.y parser.cpp)
  flex_target(MyScanner lexer.l lexer.cpp)
  add_flex_bison_dependency(MyScanner MyParser)
endif()

add_executable(Foo foo.cc ${BISON_MyParser_OUTPUTS} ${FLEX_MyScanner_OUTPUTS})

# ...

另请参阅

  • FindBISON 模块用于查找 Bison 解析器生成器。