首页 > 解决方案 > CMake:如何在不同的子目录下指定 FLEX 和 BISON 目标

问题描述

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

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

现在我有单独CMakeLists.txt的文件flexbison子目录。

CMakeLists.txt我写的根目录中

add_subdirectory(flex)
add_subdirectory(bison)

在我写CMakeLists.txt的里面flex

flex_target(lex ... )

在我写CMakeLists.txt的目录中bison

bison_target(syntax ... )
add_flex_bison_dependency(lex syntax)

lexflex_target另一个目录中的目标flexCMake给我看Flex target 'lex' does not exists.。我想知道如何判断我在另一个目录中CMake有一个先前定义和依赖的目标?flex谢谢。

标签: cmakebison

解决方案


最后我在这里找到了解决方案(也许看起来很尴尬)。

事实证明(正如我在问题中提到的)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)

这适用于两个目录。如果任一模块需要隔离测试,只需使用宏来避免包含来自另一个模块的代码。


推荐阅读