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.
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_library
或add_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)