首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake和Flex/Bison

CMake和Flex/Bison
EN

Stack Overflow用户
提问于 2013-10-16 16:03:59
回答 2查看 15K关注 0票数 17

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

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

代码语言:javascript
复制
bison --defines=tokens.h --output=parser.cpp parser.y
flex --outfile=scanner.cpp scanner.l

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

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-04 02:59:52

野牛使用的新hotness实际上记录在cmake.org上,所以对于一个简单的解析器项目:

代码语言:javascript
复制
bison_target(parser fl.ypp fl.tab.cpp)
add_executable(fl ${BISON_parser_OUTPUTS})

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

票数 30
EN

Stack Overflow用户

发布于 2013-10-16 16:35:13

您的add_custom_command%s的格式不完全正确,但它们似乎几乎是正确的。add_custom_command有两个版本,您需要的版本是生成输出文件的版本(方括号内的部分是可选的):

代码语言:javascript
复制
add_custom_command(OUTPUT output1 [output2 ...]
                   COMMAND command1 [ARGS] [args1...]
                   [COMMAND command2 [ARGS] [args2...] ...]
                   [MAIN_DEPENDENCY depend]
                   [DEPENDS [depends...]]
                   [IMPLICIT_DEPENDS <lang1> depend1
                                    [<lang2> depend2] ...]
                   [WORKING_DIRECTORY dir]
                   [COMMENT comment] [VERBATIM] [APPEND])

其思想是,仅当指定为此命令的OUTPUT的文件在同一CMakeLists.txt中的其他位置(例如,在add_libraryadd_executable调用中)用作输入时,才会执行自定义命令。

因此,自定义命令将仅在构建时(即运行make时)运行,而不会在配置时(运行CMake时)运行,并且仅当您正在构建直接或间接需要OUTPUT文件的目标时才会运行。

要修复您的命令,我认为以下命令应该有效(未经测试):

代码语言:javascript
复制
FIND_PACKAGE(BISON REQUIRED)
SET(BisonOutput ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.cpp)
IF(BISON_FOUND)
    ADD_CUSTOM_COMMAND(
      OUTPUT ${BisonOutput}
      COMMAND ${BISON_EXECUTABLE}
              --defines=${CMAKE_SOURCE_DIR}/src/rcdgen/tokens.h
              --output=${BisonOutput}
              ${CMAKE_SOURCE_DIR}/src/rcdgen/parser.y
      COMMENT "Generating parser.cpp"
    )
ENDIF()

FIND_PACKAGE(FLEX REQUIRED)
SET(FlexOutput ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.cpp)
IF(FLEX_FOUND)
    ADD_CUSTOM_COMMAND(
      OUTPUT ${FlexOutput}
      COMMAND ${FLEX_EXECUTABLE}
              --outfile=${FlexOutput}
              ${CMAKE_SOURCE_DIR}/src/rcdgen/scanner.l
      COMMENT "Generating scanner.cpp"
    )
ENDIF()

ADD_LIBRARY(MyLib ${BisonOutput} ${FlexOutput})
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19398113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档