CMake:如何在不同的子目录下指定FLEX和BISON目标

时间:2019-09-29 10:17:36

标签: cmake bison

我的项目可以简化为以下结构。

--+ project directory
  +--+ flex (subdir)
  |  +-- CMakeLists.txt
  |  +-- xxx.l
  |
  +--+ bison (subdir)
  |  +-- CMakeLists.txt
  |  +-- xxx.y
  |
  +--- CMakeLists.txt
  +--- other source files

现在我为CMakeLists.txtflex子目录有单独的bison文件。

我在根目录的CMakeLists.txt

add_subdirectory(flex)
add_subdirectory(bison)

在我写的CMakeLists.txt的{​​{1}}中

flex

我在flex_target(lex ... ) 目录的CMakeLists.txt

bison

这里bison_target(syntax ... ) add_flex_bison_dependency(lex syntax) 是另一个目录lexflex_target的目标。 flex告诉我CMake。我想知道如何告诉Flex target 'lex' does not exists.我在另一个目录中有一个先前定义和依赖的CMake目标吗?谢谢。

1 个答案:

答案 0 :(得分:0)

最后,我在这里有一个解决方案(也许看起来很尴尬)。

事实证明(如我在问题中提到的那样),CMake无法识别另一个子目录中的flex_target。为避免再次发生此错误,我尝试在该目录中显式声明“其他相同目标”。可以。

在我编写的CMakeLists.txt子目录的flex文件中:

bison_target(syntax ${PROJECT_SOURCE_DIR}/bison/parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.c)
flex_target(lex scanner.l ${CMAKE_CURRENT_BINARY_DIR}/scanner.yy.c)
add_flex_bison_dependency(lex syntax)

在我编写的CMakeLists.txt子目录的bison文件中:

bison_target(syntax parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.c)
flex_target(lex ${PROJECT_SOURCE_DIR}/flex/scanner.l ${CMAKE_CURRENT_BINARY_DIR}/scanner.yy.c)
add_flex_bison_dependency(lex syntax)

对两个目录都适用。如果任何一个模块需要隔离测试,只需使用宏即可避免包含另一个模块的代码。