CMake 中的依赖兄弟子目录

Dependent sibling subdirectories in CMake

我当前的项目结构如下:

root
 |- parser
 |     |- include    // a directory for headers
 |     |- src        // a directory for sources
 |     |- parser.yy
 |     |- scanner.ll
 |     |- CmakeLists.txt
 |
 |- preprocessor
 |     |- include    // a directory for headers
 |     |- src        // a directory for sources
 |     |- CmakeLists.txt
 |
 |- main.cpp
 |- CMakeLists.txt

现在我要开始生成汇编代码了。我必须在 parser.yy 和 [=15= 的 src 文件夹中使用 staticstackcodegen(即将定义的 类) ] 福勒.
我不知道该怎么做。
在 CMake 中执行此操作的最佳做​​法是什么?

  1. 我应该在 parser 文件夹中创建名为 semstackcodegen 的子目录吗?这对我来说似乎不正确,因为随着 CMake 项目变得更大,层次结构将变得更深,如果有更多的依赖关系,那将是一团糟。
  2. 我应该在根目录下创建这些子目录吗?如果那么 CMake 中使用同级子目录的语法是什么?

If then what is the syntax in CMake to use sibling subdirectory ?

因为普通(即不是 IMPORTED)目标是全局的,所以没有特殊的语法。如果您在一个子目录中定义了一个库,则可以通过 target_link_libraries.

在任何其他子目录中使用它

例如:

# parser/CMakeLists.txt

add_library(parser ...)
add_library(proj::parser ALIAS parser)

target_include_directories(
  parser PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
target_link_libraries(
  parser PRIVATE proj::semstack proj::codegen)

其他子目录的代码类似。

# ./CMakeLists.txt

cmake_minimum_required(VERSION 3.22)
project(proj)

add_subdirectory(semstack)
add_subdirectory(codegen)
add_subdirectory(parser)
add_subdirectory(preprocessor)

add_executable(main main.cpp)
target_link_libraries(
  main PRIVATE proj::parser proj::preprocessor)

我创建 link 到 ALIAS 目标以避免目标名称中的拼写错误被逐字转发给 linker(CMake 中带有 :: 的名称是总是 考虑目标,这在生成时得到验证)。