如何在CMake中找到父目录?
假设${MYPROJECT_DIR}=/dir1/dir2/dir3/myproject/
和我想要${PARENT_DIR}=/dir1/dir2/dir3/
。
怎么做?SET(PARENT_DIR ${MYPROJECT_DIR}/../)
似乎不是正确的语法
对于CMake 3.20及更新版本,推荐的方法是使用带有PARENT_PATH
选项的cmake_path:
cmake_path(GET MYPROJECT_DIR PARENT_PATH PARENT_DIR)
对于旧版本到CMake 2.8.12,使用get_filename_component命令和DIRECTORY
选项:
get_filename_component(PARENT_DIR ${MYPROJECT_DIR} DIRECTORY)
对于2.8.12以前的CMake版本,使用PATH
选项:
set (MYPROJECT_DIR /dir1/dir2/dir3/myproject/)
get_filename_component(PARENT_DIR ${MYPROJECT_DIR} PATH)
从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)