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

标签 build cmake subdirectory subrepos

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





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/

    相关文章:

    file - 使用powershell计算子文件夹中具有特定名称的文件数量

    c++ - #将所有 .cpp 文件包含在一个编译单元中?

    ubuntu - 建筑外观失败,显示 "No supported regular expression match"

    c - 在 rtems 中使用 powf 函数(对 powf 的 undefined reference )

    c++ - CMake 不在子模块 B 中包含子模块 A 的头目录

    在c中创建一个文件及其父目录

    java - Jenkins 构建失败

    python - 如何构建和安装 OpenCV 4.0?

    cmake - 使用 cmake 时 find_package(<package>) 函数的默认搜索路径是什么?

    Java:使用 Apache commons-IO 2.4 在子目录中递归列出文件