如何在CMake中获取父项目的名称?

How to get the name of the parent project in CMake?

请看下面的最小示例:

├───CMakeLists.txt
├───bar
│   ├───CMakeLists.txt

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(foo)
add_subdirectory(bar)

bar/CMakeLists.txt

project(bar)
cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH BAR_PARENT_DIR)
# how can I get `foo` given ${BAR_PARENT_DIR}?
# or is there a better way to get `foo`?

真正的用例是最初 foo 是通过 ${CMAKE_PROJECT_NAME} 提取的,但最近需要使 repo 子模块兼容。一旦这个 repo 被用作子模块,${CMAKE_PROJECT_NAME} 将不再等同于 foo。此外,barfoo 的子模块,因此我们不允许将 foo 硬编码到 bar/CMakeLists.txt 中,因为这会破坏其他使用 bar 作为子模块。

有没有办法从父目录中提取 CMakeLists.txt 的项目名称?

编辑:我正在寻找一种解决方案,使下面的场景可行。意思是 foo 被另一个项目子模块化。例如

baz
├───CMakeLists.txt
├───foo
│   ├───CMakeLists.txt
│   ├───bar
│        ├───CMakeLists.txt

Yes, the project name of the immediate parent.

这并不难。 project() 命令 always 在调用时设置 PROJECT_NAME 变量。所以在 you 调用 project() 之前那个变量的值是直接父代的名字。

这没有什么标准,但实现起来很简单:

cmake_minimum_required(VERSION 3.23)

set(PARENT_PROJECT_NAME "${PROJECT_NAME}")
project(bar)

if (PARENT_PROJECT_NAME)
  message(STATUS "Found parent: ${PARENT_PROJECT_NAME}")
else ()
  message(STATUS "No parent!")
endif ()