Как я могу сказать, внутри CMakeLists.txt, используется ли он с add_subdirectory()?

У меня есть этот код проекта может быть построен независимо или в качестве подпроекта большого хранилища (проверка его как суб-хранилище). В последнем случае у меня на высшем уровне CMakeLists.txt для основного проекта, который имеет

add_subdirectory(${MY_SUBPROJ_SUBDIR})

Теперь я хочу, чтобы подпроект вел себя несколько иначе, если он используется через the add_directory(), Очевидно, я бы использовал большой if инструкция. Но в каком состоянии я проверяю? Как CMake может "сказать", когда работает для некоторых CMakeLists.txtбудь то файл subdir или основной файл?

1 ответ

  1. После 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()
    
  2. Альтернатива для использования до 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 (но не в подкаталогах).


Предположим, у вас есть проект А с двумя 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.

Другие вопросы по тегам