如何在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
。此外,bar
是 foo
的子模块,因此我们不允许将 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 ()
请看下面的最小示例:
├───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
。此外,bar
是 foo
的子模块,因此我们不允许将 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 ()