summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2024-05-31 13:20:16 (GMT)
committerKitware Robot <kwrobot@kitware.com>2024-05-31 13:20:27 (GMT)
commite0a11dfa24a7fb3bb288fc7ccf4a4ccdbfe9262f (patch)
tree999b08053f794de0a373acdf8c0be68ca5128dc6
parent5899d11a8e1e6e7b2674b39c42124608a272fdbb (diff)
parent4cb5bb014d0c09a7df4d64ad0f87d782acf95c14 (diff)
downloadCMake-e0a11dfa24a7fb3bb288fc7ccf4a4ccdbfe9262f.zip
CMake-e0a11dfa24a7fb3bb288fc7ccf4a4ccdbfe9262f.tar.gz
CMake-e0a11dfa24a7fb3bb288fc7ccf4a4ccdbfe9262f.tar.bz2
Merge topic 'dep-provider-try_compile'
4cb5bb014d try_compile: Propagating top level includes into whole-project calls Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: Robert Maynard <robertjmaynard@gmail.com> Merge-request: !9532
-rw-r--r--Help/command/cmake_language.rst5
-rw-r--r--Help/command/try_compile.rst11
-rw-r--r--Help/manual/cmake-properties.7.rst1
-rw-r--r--Help/prop_gbl/PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE.rst19
-rw-r--r--Help/release/dev/dep-provider-try_compile.rst9
-rw-r--r--Help/variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES.rst11
-rw-r--r--Source/cmCoreTryCompile.cxx11
-rw-r--r--Tests/RunCMake/try_compile/RunCMakeTest.cmake1
-rw-r--r--Tests/RunCMake/try_compile/TopIncludes-config.txt85
-rw-r--r--Tests/RunCMake/try_compile/TopIncludes.cmake34
-rw-r--r--Tests/RunCMake/try_compile/include_error.cmake1
-rw-r--r--Tests/RunCMake/try_compile/include_pass1.cmake1
-rw-r--r--Tests/RunCMake/try_compile/include_pass2.cmake1
-rw-r--r--Tests/RunCMake/try_compile/proj/CMakeLists.txt2
14 files changed, 187 insertions, 5 deletions
diff --git a/Help/command/cmake_language.rst b/Help/command/cmake_language.rst
index 38d06bb..a9c7653 100644
--- a/Help/command/cmake_language.rst
+++ b/Help/command/cmake_language.rst
@@ -271,6 +271,11 @@ Dependency Providers
:command:`project`. Calling ``cmake_language(SET_DEPENDENCY_PROVIDER)``
outside of that context will result in an error.
+ .. versionadded:: 3.30
+ The :prop_gbl:`PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE` global
+ property can be set if the dependency provider also wants to be enabled
+ in whole-project calls to :command:`try_compile`.
+
.. note::
The choice of dependency provider should always be under the user's control.
As a convenience, a project may choose to provide a file that users can
diff --git a/Help/command/try_compile.rst b/Help/command/try_compile.rst
index 9ee1d01..30ab41a 100644
--- a/Help/command/try_compile.rst
+++ b/Help/command/try_compile.rst
@@ -47,6 +47,11 @@ below for the meaning of other options.
:ref:`configure-log try_compile event <try_compile configure-log event>`
if the ``NO_LOG`` option is not specified.
+.. versionadded:: 3.30
+ If the :prop_gbl:`PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE` global
+ property is set to true, :variable:`CMAKE_PROJECT_TOP_LEVEL_INCLUDES` is
+ propagated into the project's build configuration.
+
This command supports an alternate signature for CMake older than 3.25.
The signature above is recommended for clarity.
@@ -388,6 +393,12 @@ configuration:
:variable:`CMAKE_MSVC_DEBUG_INFORMATION_FORMAT` to specify the MSVC debug
information format.
+.. versionadded:: 3.30
+ If the :prop_gbl:`PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE` global
+ property is set to true, :variable:`CMAKE_PROJECT_TOP_LEVEL_INCLUDES` is
+ propagated into the test project's build configuration when using the
+ :ref:`whole-project signature <Try Compiling Whole Projects>`.
+
See Also
^^^^^^^^
diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst
index a7cf774..673bc7c 100644
--- a/Help/manual/cmake-properties.7.rst
+++ b/Help/manual/cmake-properties.7.rst
@@ -46,6 +46,7 @@ Properties of Global Scope
/prop_gbl/PACKAGES_FOUND
/prop_gbl/PACKAGES_NOT_FOUND
/prop_gbl/PREDEFINED_TARGETS_FOLDER
+ /prop_gbl/PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE
/prop_gbl/REPORT_UNDEFINED_PROPERTIES
/prop_gbl/RULE_LAUNCH_COMPILE
/prop_gbl/RULE_LAUNCH_CUSTOM
diff --git a/Help/prop_gbl/PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE.rst b/Help/prop_gbl/PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE.rst
new file mode 100644
index 0000000..edfee17
--- /dev/null
+++ b/Help/prop_gbl/PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE.rst
@@ -0,0 +1,19 @@
+PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE
+-------------------------------------------
+
+.. versionadded:: 3.30
+
+When this global property is set to true, the
+:variable:`CMAKE_PROJECT_TOP_LEVEL_INCLUDES` variable is propagated into
+:command:`try_compile` calls that use the
+:ref:`whole-project signature <Try Compiling Whole Projects>`.
+Calls to the :ref:`source file signature <Try Compiling Source Files>` are not
+affected by this property.
+``PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE`` is unset by default.
+
+For :ref:`dependency providers <dependency_providers_overview>` that want to
+be enabled in whole-project :command:`try_compile` calls, set this global
+property to true just before or after registering the provider.
+Note that all files listed in :variable:`CMAKE_PROJECT_TOP_LEVEL_INCLUDES`
+will need to be able to handle being included in such :command:`try_compile`
+calls, and it is the user's responsibility to ensure this.
diff --git a/Help/release/dev/dep-provider-try_compile.rst b/Help/release/dev/dep-provider-try_compile.rst
new file mode 100644
index 0000000..666c9b1
--- /dev/null
+++ b/Help/release/dev/dep-provider-try_compile.rst
@@ -0,0 +1,9 @@
+dep-provider-try_compile
+------------------------
+
+* The :prop_gbl:`PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE` global property
+ can be used to propagate :variable:`CMAKE_PROJECT_TOP_LEVEL_INCLUDES` into
+ :command:`try_compile` calls that use the
+ :ref:`whole-project signature <Try Compiling Whole Projects>`.
+ This is primarily intended as a way for dependency providers to be enabled
+ in such :command:`try_compile` calls.
diff --git a/Help/variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES.rst b/Help/variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES.rst
index 54f530e..805b7ea 100644
--- a/Help/variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES.rst
+++ b/Help/variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES.rst
@@ -25,7 +25,10 @@ details (use :variable:`CMAKE_TOOLCHAIN_FILE` for that).
By default, this variable is empty. It is intended to be set by the user.
-See also the :variable:`CMAKE_PROJECT_INCLUDE`,
-:variable:`CMAKE_PROJECT_INCLUDE_BEFORE`,
-:variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE`, and
-:variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE_BEFORE` variables.
+See also:
+
+* :variable:`CMAKE_PROJECT_INCLUDE`
+* :variable:`CMAKE_PROJECT_INCLUDE_BEFORE`
+* :variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE`
+* :variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE_BEFORE`
+* :prop_gbl:`PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE`
diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx
index 6d3e01c..4d739ff 100644
--- a/Source/cmCoreTryCompile.cxx
+++ b/Source/cmCoreTryCompile.cxx
@@ -1240,6 +1240,17 @@ cm::optional<cmTryCompileResult> cmCoreTryCompile::TryCompileCode(
}
}
+ if (!this->SrcFileSignature &&
+ this->Makefile->GetState()->GetGlobalPropertyAsBool(
+ "PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE")) {
+ const std::string var = "CMAKE_PROJECT_TOP_LEVEL_INCLUDES";
+ if (cmValue val = this->Makefile->GetDefinition(var)) {
+ std::string flag = cmStrCat("-D", var, "=\'", *val, '\'');
+ arguments.CMakeFlags.emplace_back(std::move(flag));
+ cmakeVariables.emplace(var, *val);
+ }
+ }
+
if (this->Makefile->GetState()->UseGhsMultiIDE()) {
// Forward the GHS variables to the inner project cache.
for (std::string const& var : ghs_platform_vars) {
diff --git a/Tests/RunCMake/try_compile/RunCMakeTest.cmake b/Tests/RunCMake/try_compile/RunCMakeTest.cmake
index 229c102..124034a 100644
--- a/Tests/RunCMake/try_compile/RunCMakeTest.cmake
+++ b/Tests/RunCMake/try_compile/RunCMakeTest.cmake
@@ -16,6 +16,7 @@ run_cmake_with_options(Inspect
include("${RunCMake_BINARY_DIR}/Inspect-build/info.cmake")
run_cmake(ConfigureLog)
+run_cmake(TopIncludes)
run_cmake(NoArgs)
run_cmake(OneArg)
run_cmake(TwoArgs)
diff --git a/Tests/RunCMake/try_compile/TopIncludes-config.txt b/Tests/RunCMake/try_compile/TopIncludes-config.txt
new file mode 100644
index 0000000..6bd9c90
--- /dev/null
+++ b/Tests/RunCMake/try_compile/TopIncludes-config.txt
@@ -0,0 +1,85 @@
+^
+---
+events:(
+ -
+ kind: "message-v1"
+ backtrace:(
+ - "[^"]+")+
+ message: \|(
++ [^
+]*)*)+
+ -
+ kind: "try_compile-v1"
+ backtrace:
+ - "[^"]*/Modules/CMakeDetermineCompilerABI.cmake:[0-9]+ \(try_compile\)"
+ - "[^"]*/Modules/CMakeTestCCompiler.cmake:[0-9]+ \(CMAKE_DETERMINE_COMPILER_ABI\)"
+ - "TopIncludes.cmake:[0-9]+ \(enable_language\)"
+ - "CMakeLists.txt:[0-9]+ \(include\)"
+ checks:
+ - "Detecting C compiler ABI info"
+ directories:
+ source: "[^"]*/Tests/RunCMake/try_compile/TopIncludes-build/CMakeFiles/CMakeScratch/TryCompile-[^/"]+"
+ binary: "[^"]*/Tests/RunCMake/try_compile/TopIncludes-build/CMakeFiles/CMakeScratch/TryCompile-[^/"]+"
+ cmakeVariables:(
+ CMAKE_[^
+]*)+
+ buildResult:
+ variable: "CMAKE_C_ABI_COMPILED"
+ cached: true
+ stdout: \|.*
+ exitCode: 0(
+ -
+ kind: "message-v1"
+ backtrace:(
+ - "[^"]+")+
+ message: \|(
++ [^
+]*)*)*
+ -
+ kind: "try_compile-v1"
+ backtrace:
+ - "TopIncludes.cmake:[0-9]+ \(try_compile\)"
+ - "CMakeLists.txt:[0-9]+ \(include\)"
+ description: "Project without property set\."
+ directories:
+ source: "[^"]*/Tests/RunCMake/try_compile/proj"
+ binary: "[^"]*/Tests/RunCMake/try_compile/TopIncludes-build/CMakeFiles/CMakeScratch/TryCompile-[^/"]+"
+ buildResult:
+ variable: "result"
+ cached: true
+ stdout: \|.*
+ exitCode: 0
+ -
+ kind: "try_compile-v1"
+ backtrace:
+ - "TopIncludes.cmake:[0-9]+ \(try_compile\)"
+ - "CMakeLists.txt:[0-9]+ \(include\)"
+ description: "Project with property set\."
+ directories:
+ source: "[^"]*/Tests/RunCMake/try_compile/proj"
+ binary: "[^"]*/Tests/RunCMake/try_compile/TopIncludes-build/CMakeFiles/CMakeScratch/TryCompile-[^/"]+"
+ cmakeVariables:
+ CMAKE_PROJECT_TOP_LEVEL_INCLUDES: "[^"]*/Tests/RunCMake/try_compile/include_pass1.cmake;[^"]*/Tests/RunCMake/try_compile/include_pass2.cmake"
+ buildResult:
+ variable: "result"
+ cached: true
+ stdout: \|.*
+ exitCode: 0
+ -
+ kind: "try_compile-v1"
+ backtrace:
+ - "TopIncludes.cmake:[0-9]+ \(try_compile\)"
+ - "CMakeLists.txt:[0-9]+ \(include\)"
+ description: "Source file with property set\."
+ directories:
+ source: "[^"]*/Tests/RunCMake/try_compile/TopIncludes-build/CMakeFiles/CMakeScratch/TryCompile-[^/"]+"
+ binary: "[^"]*/Tests/RunCMake/try_compile/TopIncludes-build/CMakeFiles/CMakeScratch/TryCompile-[^/"]+"
+ cmakeVariables:(
+ CMAKE_[^
+]*)+
+ buildResult:
+ variable: "result"
+ cached: true
+ stdout: \|.*
+ exitCode: 0
+\.\.\.$
diff --git a/Tests/RunCMake/try_compile/TopIncludes.cmake b/Tests/RunCMake/try_compile/TopIncludes.cmake
new file mode 100644
index 0000000..2a70cc7
--- /dev/null
+++ b/Tests/RunCMake/try_compile/TopIncludes.cmake
@@ -0,0 +1,34 @@
+enable_language(C)
+
+# Normally CMAKE_PROJECT_TOP_LEVEL_INCLUDES must be set before the first
+# project() call. We don't care about the variable's usual effects here, we
+# only care whether the variable is propagated to try_compile() project calls.
+set(CMAKE_PROJECT_TOP_LEVEL_INCLUDES
+ ${CMAKE_CURRENT_LIST_DIR}/include_error.cmake
+)
+
+try_compile(result
+ PROJECT TestProject
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/proj
+ LOG_DESCRIPTION "Project without property set."
+)
+
+set_property(GLOBAL PROPERTY PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE YES)
+set(CMAKE_PROJECT_TOP_LEVEL_INCLUDES
+ ${CMAKE_CURRENT_LIST_DIR}/include_pass1.cmake
+ ${CMAKE_CURRENT_LIST_DIR}/include_pass2.cmake
+)
+try_compile(result
+ PROJECT TestProject
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/proj
+ LOG_DESCRIPTION "Project with property set."
+)
+
+# Confirm the property only affects whole project signature
+set(CMAKE_PROJECT_TOP_LEVEL_INCLUDES
+ ${CMAKE_CURRENT_LIST_DIR}/include_error.cmake
+)
+try_compile(result
+ SOURCES ${CMAKE_CURRENT_LIST_DIR}/src.c
+ LOG_DESCRIPTION "Source file with property set."
+)
diff --git a/Tests/RunCMake/try_compile/include_error.cmake b/Tests/RunCMake/try_compile/include_error.cmake
new file mode 100644
index 0000000..7c73ab6
--- /dev/null
+++ b/Tests/RunCMake/try_compile/include_error.cmake
@@ -0,0 +1 @@
+message(FATAL_ERROR "Unexpectedly read top level include file")
diff --git a/Tests/RunCMake/try_compile/include_pass1.cmake b/Tests/RunCMake/try_compile/include_pass1.cmake
new file mode 100644
index 0000000..e831ca3
--- /dev/null
+++ b/Tests/RunCMake/try_compile/include_pass1.cmake
@@ -0,0 +1 @@
+message(STATUS "Top level include file was read - pass 1")
diff --git a/Tests/RunCMake/try_compile/include_pass2.cmake b/Tests/RunCMake/try_compile/include_pass2.cmake
new file mode 100644
index 0000000..31336aa
--- /dev/null
+++ b/Tests/RunCMake/try_compile/include_pass2.cmake
@@ -0,0 +1 @@
+message(STATUS "Top level include file was read - pass 2")
diff --git a/Tests/RunCMake/try_compile/proj/CMakeLists.txt b/Tests/RunCMake/try_compile/proj/CMakeLists.txt
index 652f5b6..09feca4 100644
--- a/Tests/RunCMake/try_compile/proj/CMakeLists.txt
+++ b/Tests/RunCMake/try_compile/proj/CMakeLists.txt
@@ -1,2 +1,2 @@
-cmake_minimum_required(VERSION 3.3)
+cmake_minimum_required(VERSION 3.5)
project(TestProject NONE)