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_target
和 bison_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()