【问题标题】:CMake : parent directory?CMake:父目录?
【发布时间】:2011-10-25 12:44:11
【问题描述】:

如何在 CMake 中找到父目录?

假设${MYPROJECT_DIR}=/dir1/dir2/dir3/myproject/ 我想要${PARENT_DIR}=/dir1/dir2/dir3/

如何做到这一点? SET(PARENT_DIR ${MYPROJECT_DIR}/../) 似乎不是正确的语法。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    从 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)
    

    【讨论】:

    • 如果我想要父母的父母?意思是“/dir1/dir2/”?
    • @Takichiiii :get_filename_component(_parent, ${MYDIR}, DIRECTORY),然后是get_filename_component(_grandparent, ${_parent}, DIRECTORY)
    【解决方案2】:

    从 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()
    

    这实际上并不检查文件系统以验证有效路径,但它是一个非常有用的路径操作命令。

    【讨论】:

      【解决方案3】:

      对我来说它不起作用(在 cmake 3.18)。 我最终使用了:

      get_filename_component(VAR_PARENT ${MYPROJECT_DIR}/.. ABSOLUTE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 2015-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多