FindFLEX

尋找快速詞法分析器 (Flex) 執行檔,並提供巨集以產生自訂建置規則。

此模組定義以下變數

FLEX_FOUND

如果找到 flex 執行檔則為 True。

FLEX_EXECUTABLE

flex 執行檔的路徑。

FLEX_VERSION

flex 的版本。

FLEX_LIBRARIES

flex 函式庫。

FLEX_INCLUDE_DIRS

flex 標頭的路徑。

可以使用標準 CMake 語法指定 flex 的最低需求版本,例如 find_package(FLEX 2.5.13)

如果在系統上找到 flex,此模組會定義巨集

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

其建立自訂命令以從 <FlexInput> 檔案產生 <FlexOutput> 檔案。<Name> 是用於取得此自訂命令詳細資訊的別名。

選項如下

OPTIONS <options>...

在版本 4.0 中新增。

以分號分隔的 flex 選項列表,會加入到 flex 命令列。

COMPILE_FLAGS <string>

自版本 4.0 起已棄用。

以空格分隔的 flex 選項,會加入到 flex 命令列。 ;-list 無法運作。此選項已棄用,建議改用 OPTIONS <options>...

DEFINES_FILE <string>

在版本 3.5 中新增。

如果 flex 設定為輸出標頭檔,可以使用此選項指定其名稱。

變更於版本 3.17: CMP0098 設定為 NEW 時,flex 會在 CMAKE_CURRENT_BINARY_DIR 目錄中執行。

此巨集定義以下變數

FLEX_<Name>_DEFINED

如果巨集成功執行則為 True。

FLEX_<Name>_OUTPUTS

由自訂規則產生的原始碼檔案,為 <FlexOutput> 的別名。

FLEX_<Name>_INPUT

flex 原始碼檔案,為 <FlexInput> 的別名。

FLEX_<Name>_OUTPUT_HEADER

標頭 flex 輸出(如果有的話)。

FLEX_<Name>_OPTIONS

在版本 4.0 中新增。

flex 命令列中使用的選項。

Flex 掃描器通常使用 Bison 定義的 tokens:由 Flex 產生的程式碼取決於 Bison 產生的標頭。此模組也定義一個巨集

add_flex_bison_dependency
add_flex_bison_dependency(<FlexTarget> <BisonTarget>)

其在掃描器和剖析器之間加入必要的相依性,其中 <FlexTarget><BisonTarget> 分別是 flex_targetbison_target 巨集的第一個參數。

範例

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})

將額外的命令列選項加入到 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()