FindBISON

尋找 bison 執行檔並提供巨集以產生自訂建置規則。

此模組定義了以下變數

BISON_FOUND

如果找到程式則為真。

BISON_EXECUTABLE

bison 程式的路徑。

BISON_VERSION

bison 的版本。

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

如果找到 bison,此模組會定義巨集

bison_target
bison_target(<Name> <YaccInput> <CodeOutput>
             [OPTIONS <options>...]
             [COMPILE_FLAGS <string>]
             [DEFINES_FILE <file>]
             [VERBOSE [<file>]]
             [REPORT_FILE <file>]
             )

這將建立自訂規則以產生剖析器。<YaccInput> 是 yacc 檔案的路徑。<CodeOutput> 是 bison 產生的原始碼檔案名稱。也可以產生標頭檔,其中包含 token 列表。

變更於 3.14 版本: CMP0088 設定為 NEW 時,bison 會在 CMAKE_CURRENT_BINARY_DIR 目錄中執行。

選項如下

OPTIONS <options>...

新增於 4.0 版本。

加入到 bison 命令列的分號分隔列表 選項。

COMPILE_FLAGS <string>

自 4.0 版本起已棄用。

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

DEFINES_FILE <file>

新增於 3.4 版本。

指定要由 bison 產生的非預設標頭 <file>

VERBOSE [<file>]

告訴 bison 寫入語法和剖析器的報告檔案。

自 3.7 版本起已棄用: 如果給定 <file>,則指定報告檔案複製到的路徑。[<file>] 保留此選項是為了保持此模組的向後相容性。請使用 VERBOSE REPORT_FILE <file>

REPORT_FILE <file>

新增於 3.7 版本。

指定非預設報告 <file> (如果產生)。

此巨集定義了以下變數

BISON_<Name>_DEFINED

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

BISON_<Name>_INPUT

輸入原始檔,<YaccInput> 的別名。

BISON_<Name>_OUTPUT_SOURCE

bison 產生的原始碼檔案。

BISON_<Name>_OUTPUT_HEADER

bison 產生的標頭檔。

BISON_<Name>_OUTPUTS

所有由 bison 產生的檔案,包含原始碼、標頭和報告。

BISON_<Name>_OPTIONS

新增於 4.0 版本。

bison 命令列中使用的選項。

BISON_<Name>_COMPILE_FLAGS

自 4.0 版本起已棄用。

bison 命令列中使用的選項。此變數已棄用,建議改用 BISON_<Name>_OPTIONS 變數。

範例

find_package(BISON)
bison_target(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp
             DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/parser.h)
add_executable(Foo main.cpp ${BISON_MyParser_OUTPUTS})

可以將額外的命令列選項作為列表傳遞到 bison 執行檔。例如,加入 -Wall 選項以報告所有警告,以及 --no-lines (-l) 以不產生 #line 指令。

find_package(BISON)

if(BISON_FOUND)
  bison_target(MyParser parser.y parser.cpp OPTIONS -Wall --no-lines)
endif()

產生器表達式可以用於 OPTIONS <options...。例如,僅針對 Debug 建置類型加入 --debug (-t) 選項

find_package(BISON)

if(BISON_FOUND)
  bison_target(MyParser parser.y parser.cpp OPTIONS $<$<CONFIG:Debug>:-t>)
endif()