gpt4 book ai didi

build - 在 CMakeLists.txt 中,如何判断它是否与 add_subdirectory() 一起使用?

转载 作者:行者123 更新时间:2023-12-01 08:18:00 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to detect if current scope has a parent in CMake?

(3 个回答)


3年前关闭。




我有这个代码项目可以独立构建,也可以作为更大存储库的子项目(将其检查为子存储库)。在后一种情况下,我有一个顶级 CMakeLists.txt对于主要项目有

add_subdirectory(${MY_SUBPROJ_SUBDIR})

现在,我希望子项目的行为有所不同,以防它通过 the add_directory() 使用。 .显然,我会使用一个大的 if操作说明。但是我要检查什么条件? CMake 如何在运行时“告诉”一些 CMakeLists.txt ,到底是subdir文件还是主文件?

最佳答案

  • project()调用项目CMakeLists.txt在项目的子目录中,您可以使用:
     if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
    # I am top-level project.
    else()
    # I am called from other project with add_subdirectory().
    endif()
    注意 :如评论中所述,此方法可能不适用于 Windows,其中 CMAKE_SOURCE_DIR包含 PROJECT_SOURCE_DIR 的小写版本因此不能直接比较是否相等。对于这种情况,检查方法 PARENT_DIRECTORY属性,如 that answer 中所述对于重复的问题,似乎更健壮。
  • 替代用途 之前 project()称呼:
     if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
    # I am top-level project.
    else()
    # I am called from other project with add_subdirectory().
    endif()
    此替代方案也可用于项目 CMakeLists.txt 中的任何位置。 (但不在子目录中)。

  • 假设您有一个项目 A,其中包含两个 CMakeLists.txt : 一个在项目目录,一个在子目录 src/ .上述使用方法的方案:
    CMakeLists.txt :
    cmake_minimum_required(...)
    ...
    <only approach *2* can be used there>
    ...
    project(A)
    ...
    <approach *1* or *2* can be used there>
    ...
    add_subdirectory(src)
    ...
    src/CMakeLists.txt :
    ...
    <only approach *1* can be used there>
    ...
    使用给定的方案,项目 A 可以检测它是独立构建的(顶级项目)还是作为另一个项目 B 的一部分构建。

    关于build - 在 CMakeLists.txt 中,如何判断它是否与 add_subdirectory() 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42716466/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com