【发布时间】:2011-10-25 12:44:11
【问题描述】:
如何在 CMake 中找到父目录?
假设${MYPROJECT_DIR}=/dir1/dir2/dir3/myproject/ 我想要${PARENT_DIR}=/dir1/dir2/dir3/。
如何做到这一点?
SET(PARENT_DIR ${MYPROJECT_DIR}/../) 似乎不是正确的语法。
【问题讨论】:
标签: cmake
如何在 CMake 中找到父目录?
假设${MYPROJECT_DIR}=/dir1/dir2/dir3/myproject/ 我想要${PARENT_DIR}=/dir1/dir2/dir3/。
如何做到这一点?
SET(PARENT_DIR ${MYPROJECT_DIR}/../) 似乎不是正确的语法。
【问题讨论】:
标签: cmake
从 CMake 2.8.12 开始,推荐的方法是使用 get_filename_component 命令和 DIRECTORY 选项:
get_filename_component(PARENT_DIR ${MYPROJECT_DIR} DIRECTORY)
对于旧版本的 CMake,请使用 PATH 选项:
set (MYPROJECT_DIR /dir1/dir2/dir3/myproject/)
get_filename_component(PARENT_DIR ${MYPROJECT_DIR} PATH)
【讨论】:
get_filename_component(_parent, ${MYDIR}, DIRECTORY),然后是get_filename_component(_grandparent, ${_parent}, DIRECTORY)
从 CMake 3.20 开始,您可以使用cmake_path 命令获取给定路径的父目录:
cmake_path(GET <path-var> PARENT_PATH <out-var>)
此命令取代get_filename_component 命令。
因此,在您的示例中,它看起来像这样:
cmake_path(GET MYPROJECT_DIR PARENT_PATH PARENT_DIR)
也可以先检查路径是否有父目录组件:
cmake_path(HAS_PARENT_PATH MYPROJECT_DIR MyDir_HAS_PARENT)
if(MyDir_HAS_PARENT)
cmake_path(GET MYPROJECT_DIR PARENT_PATH PARENT_DIR)
endif()
这实际上并不检查文件系统以验证有效路径,但它是一个非常有用的路径操作命令。
【讨论】:
对我来说它不起作用(在 cmake 3.18)。 我最终使用了:
get_filename_component(VAR_PARENT ${MYPROJECT_DIR}/.. ABSOLUTE)
【讨论】: