CMake 中调用 Bison/Flex
CMake 默认不支持 Bison/Flex 工具链. 需要自行调用 add_custom_command, 比较麻烦.
在 C/C++ 社区, Bison/Flex 应该还算比较常用的工具. CMake 团队其实完全可以做成可引入的模块, 省却用户的麻烦.
有人碰到和我一样的困扰, 写了两个 CMake 扩展模块 : Support for Flex/Bison .
附件中的 “Find-Bison-Flex-2009-06-29.zip” 压缩包是我合并补丁之后的版本.
使用方法
确保 $PATH 路径中能找到 bison 和 flex 可执行文件. Linux/Unix/Cygwin 下应该问题不大. 如果在 Windows 下使用 MinGW 或其它编译器, 建议从 GnuWin32 项目 下载最新 bison/felx 压缩包, 解压后将路径添加到 $PATH 环境变量.
下载 “Find-Bison-Flex-2009-06-29.zip”, 解压缩到项目的根路径. 以下是一个典型的项目布局:
myproject | |-- FindBISON.cmake # Bison 扩展 | |-- FindFLEX.cmake # Flex 扩展 | |-- src/ | |- CMakeLists.txt | |- ... | |-- parser/ | |- inilex.ll # 词法文件 | |- iniparse.yy # 语法文件 | |- CMakeLists.txt | |- ... | |-- tests/ | |- CMakeLists.txt | |- ... | |-- CMakeLists.txt # 根 | |- ...在 parser/CMakeLists.txt 文件中按如下规则使用:
# 引入模块 include(${PROJECT_SOURCE_DIR}/FindBISON.cmake) include(${PROJECT_SOURCE_DIR}/FindFLEX.cmake) # 添加 Bison/Flex 目标, IniParse/IniLex 是目标名. # 最终生成的 cpp 文件输出到 ${PROJECT_BINARY_DIR} BISON_TARGET(IniParse iniparse.yy ${PROJECT_BINARY_DIR}/yacc_iniparse.cpp) FLEX_TARGET(IniLex inilex.ll ${PROJECT_BINARY_DIR}/lex_inilex.cpp) # Flex 依赖 Bison 的输出文件 ADD_FLEX_BISON_DEPENDENCY(IniLex IniParse) # 添加 include 路径, 为了其它源文件能找到生成的 .hpp 文件 include_directories( ./ ${PROJECT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR} ) # Bison/Flex 生成的文件分别存放在 BISON_[targetname]_OUTPUTS / FLEX_[targetname]_OUTPUTS 变量中. # 相应的, 本例中就是: BISON_IniParse_OUTPUTS 和 FLEX_IniLex_OUTPUTS add_library(testlib SHARED ${libfiles} ${BISON_IniParse_OUTPUTS} ${FLEX_IniLex_OUTPUTS} )注意事项: 由于 Bison/Flex 本身, 以及这两个扩展模块的双重制约, 词法文件和语法文件 必须 要分别以 .ll / .yy 作为后缀.