Yang Yubo's Life @ Refactoring

CMake 中调用 Bison/Flex

written on Monday, June 29, 2009

CMake 默认不支持 Bison/Flex 工具链. 需要自行调用 add_custom_command, 比较麻烦.

在 C/C++ 社区, Bison/Flex 应该还算比较常用的工具. CMake 团队其实完全可以做成可引入的模块, 省却用户的麻烦.

有人碰到和我一样的困扰, 写了两个 CMake 扩展模块 : Support for Flex/Bison .

附件中的 "Find-Bison-Flex-2009-06-29.zip" 压缩包是我合并补丁之后的版本.

使用方法

  1. 确保 $PATH 路径中能找到 bisonflex 可执行文件. Linux/Unix/Cygwin 下应该问题不大. 如果在 Windows 下使用 MinGW 或其它编译器, 建议从 GnuWin32 项目 下载最新 bison/felx 压缩包, 解压后将路径添加到 $PATH 环境变量.

  2. 下载 "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         # 根
        |
        |- ...
    
  3. 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} )
    
  4. 注意事项: 由于 Bison/Flex 本身, 以及这两个扩展模块的双重制约, 词法文件和语法文件 必须 要分别以 .ll / .yy 作为后缀.

UPDATE: CMake 2.8 Bison/Flex 被收为官方模块.

This entry was tagged Bison, CMake and Flex

blog comments powered by Disqus