CMake和Flex/Bison

Lor*_*Aro 16 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
Run Code Online (Sandbox Code Playgroud)

我遇到了这个古老的链接,似乎解释了如何做到这一点,但是当我使用以下自定义命令运行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)
Run Code Online (Sandbox Code Playgroud)

我是cmake的新手,所以这对我来说有点混乱.有没有人知道什么是有效的custom_command?

car*_*man 27

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

bison_target(parser fl.ypp fl.tab.cpp)
add_executable(fl ${BISON_parser_OUTPUTS})
Run Code Online (Sandbox Code Playgroud)

是你要做的.同样适用于Flex.

  • 不适用于旧版本为此,Flex版本应为2.5.5或更高。原因是这些函数传递的参数。 (2认同)

Fra*_*ser 12

add_custom_command的格式不太对,但它们看起来几乎是正确的.有两个版本add_custom_command,你想要的是产生输出文件的那个(方括号内的部分是可选的):

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])
Run Code Online (Sandbox Code Playgroud)

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

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

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

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})
Run Code Online (Sandbox Code Playgroud)