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时,flex在CMAKE_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>_INPUTFlex 源文件,是
<input-lex-file>的别名。FLEX_<name>_OUTPUT_HEADER3.5 版本新增。
flex生成的头文件(如果有)。FLEX_<name>_OUTPUTSflex生成的文件列表,包括输出扫描器文件和头文件。FLEX_<name>_OPTIONS4.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)
示例:生成扫描器¶
从当前源目录中的 lex 源文件查找 Flex,并在当前二进制目录中生成扫描器源文件。
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 解析器生成器。