diff options
author | Craig Scott <craig.scott@crascit.com> | 2022-08-02 12:42:08 (GMT) |
---|---|---|
committer | Craig Scott <craig.scott@crascit.com> | 2022-08-03 23:43:10 (GMT) |
commit | 2a9cc3e8e8254eb1703e7e0931fe062814067454 (patch) | |
tree | 2f7c16c2ec61e3cf58be9dcd538ec9d27b277994 /Modules | |
parent | a2daa18237f2c3c58c37ab9d1c202c63e0f150a7 (diff) | |
download | CMake-2a9cc3e8e8254eb1703e7e0931fe062814067454.zip CMake-2a9cc3e8e8254eb1703e7e0931fe062814067454.tar.gz CMake-2a9cc3e8e8254eb1703e7e0931fe062814067454.tar.bz2 |
FetchContent: Disable header set verification for dependencies
The CMAKE_VERIFY_INTERFACE_HEADER_SETS variable is intended to
be under the control of the user. It doesn't discriminate between
header sets defined in the main project and those defined by
dependencies brought into the build directly via FetchContent.
Developers will usually only be interested in verifying the main project's
header sets, not those from dependencies.
Make the variable effectively only enable header set verification of the
main project by turning it off during FetchContent_MakeAvailable() calls.
The user still has variables like CMAKE_PROJECT_INCLUDE and
CMAKE_PROJECT_<projectName>_INCLUDE available to them if they
want to enable verification of all or specific dependencies respectively.
Fixes: #23808
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/FetchContent.cmake | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/Modules/FetchContent.cmake b/Modules/FetchContent.cmake index 27070c0..d016fb5 100644 --- a/Modules/FetchContent.cmake +++ b/Modules/FetchContent.cmake @@ -364,6 +364,18 @@ Commands FetchContent_Declare(other ...) FetchContent_MakeAvailable(uses_other other) + Note that :variable:`CMAKE_VERIFY_INTERFACE_HEADER_SETS` is explicitly set + to false upon entry to ``FetchContent_MakeAvailable()``, and is restored to + its original value before the command returns. Developers typically only + want to verify header sets from the main project, not those from any + dependencies. This local manipulation of the + :variable:`CMAKE_VERIFY_INTERFACE_HEADER_SETS` variable provides that + intuitive behavior. You can use variables like + :variable:`CMAKE_PROJECT_INCLUDE` or + :variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE` to turn verification back + on for all or some dependencies. You can also set the + :prop_tgt:`VERIFY_INTERFACE_HEADER_SETS` property of individual targets. + .. command:: FetchContent_Populate .. note:: @@ -1814,6 +1826,13 @@ endfunction() # calls will be available to the caller. macro(FetchContent_MakeAvailable) + # We must append an item, even if the variable is unset, so prefix its value. + # We will strip that prefix when we pop the value at the end of the macro. + list(APPEND __cmake_fcCurrentVarsStack + "__fcprefix__${CMAKE_VERIFY_INTERFACE_HEADER_SETS}" + ) + set(CMAKE_VERIFY_INTERFACE_HEADER_SETS FALSE) + get_property(__cmake_providerCommand GLOBAL PROPERTY __FETCHCONTENT_MAKEAVAILABLE_SERIAL_PROVIDER ) @@ -1965,10 +1984,18 @@ macro(FetchContent_MakeAvailable) endif() endforeach() + # Prefix will be "__fcprefix__" + list(POP_BACK __cmake_fcCurrentVarsStack __cmake_original_verify_setting) + string(SUBSTRING "${__cmake_original_verify_setting}" + 12 -1 __cmake_original_verify_setting + ) + set(CMAKE_VERIFY_INTERFACE_HEADER_SETS ${__cmake_original_verify_setting}) + # clear local variables to prevent leaking into the caller's scope unset(__cmake_contentName) unset(__cmake_contentNameLower) unset(__cmake_contentNameUpper) unset(__cmake_providerCommand) + unset(__cmake_original_verify_setting) endmacro() |