How can I tell, within a CMakeLists.txt, whether it's used with add_subdirectory()? [duplicate]

有些话、适合烂在心里 提交于 2019-12-21 19:53:32

问题


I have this code project can be built either independently or as a subproject of a larger repository (checking it our as a sub-repository). In the latter case, I have a top-level CMakeLists.txt for the main project which has

add_subdirectory(${MY_SUBPROJ_SUBDIR})

now, I want the subproject to behave somewhat differently in case it's used via the add_directory(). Obviously, I would be using a large if instruction. But what condition do I check? How can CMake "tell", when running for some CMakeLists.txt, whether it's a subdir file or the main file?


回答1:


  1. After the project() call in project's CMakeLists.txt and in the project's subdirectories you may use:

    if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
        # I am top-level project.
    else()
        # I am called from other project with add_subdirectory().
    endif()
    
  2. Alternative for use before the project() call:

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

    This alternative can also be used anywhere in project's CMakeLists.txt (but not in subdirectories).


Assume you have a project A with two CMakeLists.txt: one in the project's directory, and one in subdirectory src/. Scheme for use approaches described above:

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>
...

With given scheme project A may detect, whether it is built standalone (top-level project) or as a part of another project B.



来源:https://stackoverflow.com/questions/42716466/how-can-i-tell-within-a-cmakelists-txt-whether-its-used-with-add-subdirectory

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!