c++ - CMake 和 Flex/Bison

标签 c++ makefile cmake bison flex-lexer

我正在将我的构建系统从 configure/make 转换为 cmake 系统

系统有一些自动生成的文件,来自 bison/flex。原来的makefile命令是:

bison --defines=tokens.h --output=parser.cpp parser.y
flex --outfile=scanner.cpp scanner.l

我遇到了this ancient link这似乎解释了如何做到这一点,但是当我使用以下自定义命令运行 cmake 时,似乎什么也没发生(没有错误消息,没有文件生成)

FIND_PACKAGE(BISON REQUIRED)
IF(BISON_FOUND)
    ADD_CUSTOM_COMMAND(
      SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y
      COMMAND ${BISON_EXECUTABLE}
      ARGS --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h
           -o ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp
           ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y
      COMMENT "Generating parser.cpp"
      OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp
    )
ENDIF(BISON_FOUND)

FIND_PACKAGE(FLEX REQUIRED)
IF(FLEX_FOUND)
    ADD_CUSTOM_COMMAND(
      SOURCE ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l
      COMMAND ${FLEX_EXECUTABLE}
      ARGS -o${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp
           ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l
      COMMENT "Generating scanner.cpp"
      OUTPUT ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp
    )
ENDIF(FLEX_FOUND)

我是 cmake 的新手,所以对我来说有点困惑。有谁知道一个有效的 custom_command 是什么?

最佳答案

Bison 使用的新热点实际上记录在FindBison中所以对于一个简单的解析器项目:

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

是你会做的。 Flex 也是如此.

关于c++ - CMake 和 Flex/Bison,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19398113/

相关文章:

C++ 对齐 new[]

c++ - 如何在 CentOS 7 中为 C++ 应用程序生成具有完整回溯跟踪的核心转储文件

c++ - QtCreator 和 "Run CMake"

c - QT Creator CMake 未设置 C 编译器路径

c++ - 为什么 C++ 将范数定义为欧几里得范数的平方?

C++:Windows 套接字错误 10013

makefile - 你如何实现一个记住最后一个构建目标的 Makefile?

c - gcc 退出时未定义对头文件中函数的引用

c++ - OPENCV 错误 : undefined reference to "cvLoadImage"

c++ - qt private slot moc undefined reference错误