我正在编写一个小型解析器,但在使用 cmake 时遇到问题。
我的目的是:flex F.l => F.cc,bison B.y => B.cc,
my_program.cc + F.cc + B.cc => 库
我的第一次尝试:
FIND_PACKAGE(FLEX REQUIRED)
if (FLEX_FOUND)
ADD_CUSTOM_TARGET(
flex_target
COMMAND ${FLEX_EXECUTABLE}
--header-file=${CMAKE_CURRENT_SOURCE_DIR}/F.h
--outfile=${CMAKE_CURRENT_SOURCE_DIR}/F.cc
${CMAKE_CURRENT_SOURCE_DIR}/F.l
COMMENT "Generating F.cc"
)
endif(FLEX_FOUND)
FIND_PACKAGE(BISON REQUIRED)
if (BISON_FOUND)
ADD_CUSTOM_TARGET(
bison_target
COMMAND ${BISON_EXECUTABLE}
--defines=${CMAKE_CURRENT_SOURCE_DIR}/B.h
--output=${CMAKE_CURRENT_SOURCE_DIR}/B.cc
${CMAKE_CURRENT_SOURCE_DIR}/B.y
COMMENT "Generating B.cc"
)
endif(BISON_FOUND)
add_library(my_library my_program.cc F.cc B.cc)
add_dependencies(my_library bison_target)
add_dependencies(my_library flex_target)
一切都很好,除了每次运行 make 时都会调用 flex 和 bison 命令,甚至 F.l 和 B.y 文件都没有更改。
然后我尝试切换为使用 ADD_CUSTOM_COMMAND 而不是 ADD_CUSTOM_TARGET。
FIND_PACKAGE(FLEX REQUIRED)
if (FLEX_FOUND)
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/F.cc
SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/F.l
COMMAND ${FLEX_EXECUTABLE}
--header-file=${CMAKE_CURRENT_SOURCE_DIR}/F.h
--outfile=${CMAKE_CURRENT_SOURCE_DIR}/F.cc
${CMAKE_CURRENT_SOURCE_DIR}/F.l
COMMENT "Generating F.cc"
)
endif(FLEX_FOUND)
FIND_PACKAGE(BISON REQUIRED)
if (BISON_FOUND)
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/B.cc
SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/B.y
COMMAND ${BISON_EXECUTABLE}
--defines=${CMAKE_CURRENT_SOURCE_DIR}/B.h
--output=${CMAKE_CURRENT_SOURCE_DIR}/B.cc
${CMAKE_CURRENT_SOURCE_DIR}/B.y
COMMENT "Generating B.cc"
)
endif(BISON_FOUND)
add_library(my_library my_program.cc F.cc B.cc)
请注意,我似乎无法添加 ADD_CUSTOM_COMMAND 的依赖项。
然后,当我运行 make 时,flex & bison 似乎只会运行一次。即使 .l 和 .y 文件更改,它也不会第二次运行。
有办法实现我的目标吗?
Thanks.
CMake 有两个模块Flex and Bison,所以你可以这样做:
find_package(FLEX REQUIRED)
find_package(BISON REQUIRED)
flex_target(lexer F.l "${CMAKE_CURRENT_BINARY_DIR}/F.cc")
bison_target(parser B.y "${CMAKE_CURRENT_BINARY_DIR}/B.cc")
add_library(my_library STATIC
${sources}
"${CMAKE_CURRENT_BINARY_DIR}/F.cc"
"${CMAKE_CURRENT_BINARY_DIR}/B.cc"
)
请注意,两者flex_target
and bison_target
use add_custom_command
内部。
Edit:为了完整起见,正如 @vre 在评论中指出的那样,有FindFLEX
提供add_flex_bison_dependency
命令:
add_flex_bison_dependency(lexer parser)
这使得lexer
取决于parser
,以允许前者使用后者的令牌。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)