summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Auxiliary/vim/syntax/cmake.vim3
-rw-r--r--CompileFlags.cmake15
-rw-r--r--Help/dev/documentation.rst4
-rw-r--r--Help/envvar/CMAKE_MAXIMUM_RECURSION_DEPTH.rst10
-rw-r--r--Help/manual/cmake-env-variables.7.rst1
-rw-r--r--Help/manual/cmake-generator-expressions.7.rst1
-rw-r--r--Help/manual/cmake-policies.7.rst1
-rw-r--r--Help/manual/cmake-properties.7.rst3
-rw-r--r--Help/policy/CMP0147.rst24
-rw-r--r--Help/prop_tgt/CUDA_CUBIN_COMPILATION.rst14
-rw-r--r--Help/prop_tgt/CUDA_FATBIN_COMPILATION.rst14
-rw-r--r--Help/prop_tgt/CUDA_OPTIX_COMPILATION.rst14
-rw-r--r--Help/release/dev/FindOpenGL-gles.rst5
-rw-r--r--Help/release/dev/cuda-support-new-compile-modes.rst14
-rw-r--r--Help/release/dev/vs-BuildInParallel.rst5
-rw-r--r--Help/variable/CMAKE_MAXIMUM_RECURSION_DEPTH.rst2
-rw-r--r--Modules/CMakeCUDAInformation.cmake1
-rw-r--r--Modules/CMakeCheckCompilerFlagCommonPatterns.cmake1
-rw-r--r--Modules/CheckCCompilerFlag.cmake1
-rw-r--r--Modules/CheckCXXCompilerFlag.cmake1
-rw-r--r--Modules/CheckFortranCompilerFlag.cmake1
-rw-r--r--Modules/CheckOBJCCompilerFlag.cmake1
-rw-r--r--Modules/CheckOBJCXXCompilerFlag.cmake1
-rw-r--r--Modules/CheckStructHasMember.cmake7
-rw-r--r--Modules/Compiler/NVIDIA-CUDA.cmake5
-rw-r--r--Modules/FindCUDA.cmake7
-rw-r--r--Modules/FindOpenGL.cmake189
-rw-r--r--Modules/FortranCInterface/CMakeLists.txt10
-rw-r--r--Modules/GenerateExportHeader.cmake18
-rw-r--r--Modules/Internal/CMakeTryCompilerOrLinkerFlag.cmake1
-rw-r--r--Modules/Internal/CheckFlagCommonConfig.cmake10
-rw-r--r--Source/CMakeLists.txt14
-rw-r--r--Source/CMakeVersion.cmake2
-rw-r--r--Source/cmConfigure.cmake.h.in2
-rw-r--r--Source/cmFindPackageCommand.cxx15
-rw-r--r--Source/cmGeneratorTarget.cxx28
-rw-r--r--Source/cmGlobalGenerator.cxx2
-rw-r--r--Source/cmGlobalGenerator.h2
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx116
-rw-r--r--Source/cmGlobalNinjaGenerator.h8
-rw-r--r--Source/cmMakefile.cxx56
-rw-r--r--Source/cmMakefile.h8
-rw-r--r--Source/cmMakefileTargetGenerator.cxx23
-rw-r--r--Source/cmNinjaTargetGenerator.cxx43
-rw-r--r--Source/cmPolicies.h9
-rw-r--r--Source/cmTarget.cxx43
-rw-r--r--Source/cmVisualStudio10TargetGenerator.cxx34
-rw-r--r--Tests/CudaOnly/CMakeLists.txt3
-rw-r--r--Tests/CudaOnly/CUBIN/CMakeLists.txt21
-rw-r--r--Tests/CudaOnly/CUBIN/kernelA.cu7
-rw-r--r--Tests/CudaOnly/CUBIN/kernelB.cu7
-rw-r--r--Tests/CudaOnly/CUBIN/kernelC.cu7
-rw-r--r--Tests/CudaOnly/CUBIN/main.cu56
-rw-r--r--Tests/CudaOnly/Fatbin/CMakeLists.txt25
-rw-r--r--Tests/CudaOnly/Fatbin/main.cu56
-rw-r--r--Tests/CudaOnly/OptixIR/CMakeLists.txt33
-rw-r--r--Tests/CudaOnly/OptixIR/main.cu53
-rw-r--r--Tests/EnforceConfig.cmake.in3
-rw-r--r--Tests/FindOpenGL/Test/CMakeLists.txt129
-rw-r--r--Tests/FindOpenGL/Test/main_gles2.c17
-rw-r--r--Tests/FindOpenGL/Test/main_gles3.c17
-rw-r--r--Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagC.cmake9
-rw-r--r--Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagCXX.cmake9
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/RunCMakeTest.cmake44
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env-stderr.txt34
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-invalid-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-invalid-env-stderr.txt5
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-default-script-stderr.txt8
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-default-stderr.txt6
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-env-script-stderr.txt21
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-env-stderr.txt21
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-script-stderr.txt7
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-stderr.txt5
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-script-stderr.txt8
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-stderr.txt6
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/function-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/function-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/function-env-script-stderr.txt21
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/function-env-stderr.txt21
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/function-invalid-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/function-invalid-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/function-invalid-env-script-stderr.txt5
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/function-invalid-env-stderr.txt5
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/include-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/include-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/include-env-script-stderr.txt21
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/include-env-stderr.txt21
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/include-invalid-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/include-invalid-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/include-invalid-env-script-stderr.txt5
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/include-invalid-env-stderr.txt5
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/macro-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/macro-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/macro-env-script-stderr.txt21
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/macro-env-stderr.txt21
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-script-stderr.txt5
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-stderr.txt5
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/variable_watch-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/variable_watch-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/variable_watch-env-script-stderr.txt22
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/variable_watch-env-stderr.txt22
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-script-result.txt1
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-script-stderr.txt6
-rw-r--r--Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-stderr.txt6
-rw-r--r--Tests/RunCMake/VS10Project/CustomCommandParallel-check.cmake40
-rw-r--r--Tests/RunCMake/VS10Project/CustomCommandParallel.cmake5
-rw-r--r--Tests/RunCMake/VS10Project/RunCMakeTest.cmake3
-rw-r--r--Tests/RunCMake/find_package/CMP0147-NEW-result.txt1
-rw-r--r--Tests/RunCMake/find_package/CMP0147-NEW-stderr.txt7
-rw-r--r--Tests/RunCMake/find_package/CMP0147-NEW.cmake2
-rw-r--r--Tests/RunCMake/find_package/CMP0147-OLD.cmake2
-rw-r--r--Tests/RunCMake/find_package/CMP0147-WARN.cmake2
-rw-r--r--Tests/RunCMake/find_package/CMP0147-common.cmake3
-rw-r--r--Tests/RunCMake/find_package/RunCMakeTest.cmake5
-rw-r--r--Utilities/Sphinx/cmake.py34
123 files changed, 1503 insertions, 241 deletions
diff --git a/Auxiliary/vim/syntax/cmake.vim b/Auxiliary/vim/syntax/cmake.vim
index f303bd421e..1a47f678ef 100644
--- a/Auxiliary/vim/syntax/cmake.vim
+++ b/Auxiliary/vim/syntax/cmake.vim
@@ -128,7 +128,10 @@ syn keyword cmakeProperty contained
\ CPACK_WIX_ACL
\ CROSSCOMPILING_EMULATOR
\ CUDA_ARCHITECTURES
+ \ CUDA_CUBIN_COMPILATION
\ CUDA_EXTENSIONS
+ \ CUDA_FATBIN_COMPILATION
+ \ CUDA_OPTIX_COMPILATION
\ CUDA_PTX_COMPILATION
\ CUDA_RESOLVE_DEVICE_SYMBOLS
\ CUDA_RUNTIME_LIBRARY
diff --git a/CompileFlags.cmake b/CompileFlags.cmake
index 6331af11cb..f94e079ad7 100644
--- a/CompileFlags.cmake
+++ b/CompileFlags.cmake
@@ -8,7 +8,7 @@ if(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "Intel")
set(_INTEL_WINDOWS 1)
endif()
-if(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "Clang"
+if(WIN32 AND CMAKE_C_COMPILER_ID MATCHES "^(Clang|IntelLLVM)$"
AND "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
set(_CLANG_MSVC_WINDOWS 1)
endif()
@@ -22,18 +22,19 @@ if(MSVC OR _INTEL_WINDOWS OR _CLANG_MSVC_WINDOWS)
else()
endif()
-if(MSVC)
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_CXX_LINKER_WRAPPER_FLAG}-stack:10000000")
-endif()
-
# MSVC 14.28 enables C5105, but the Windows SDK 10.0.18362.0 triggers it.
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 19.28)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -wd5105")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd5105")
endif()
-if(_CLANG_MSVC_WINDOWS AND "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Xlinker -stack:20000000")
+# Use a stack size large enough for CMake_DEFAULT_RECURSION_LIMIT.
+if(MSVC)
+ string(APPEND CMAKE_EXE_LINKER_FLAGS " ${CMAKE_CXX_LINKER_WRAPPER_FLAG}-stack:10000000")
+elseif(MINGW OR MSYS OR CYGWIN)
+ string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,--stack,10000000")
+elseif(_CLANG_MSVC_WINDOWS AND "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
+ string(APPEND CMAKE_EXE_LINKER_FLAGS " -Xlinker -stack:20000000")
endif()
#silence duplicate symbol warnings on AIX
diff --git a/Help/dev/documentation.rst b/Help/dev/documentation.rst
index 52525df9c1..b7a77c9b21 100644
--- a/Help/dev/documentation.rst
+++ b/Help/dev/documentation.rst
@@ -241,6 +241,10 @@ Document a "genex" object:
The directive requires a single argument, the generator expression name.
+The optional ``:target:`` option allows a custom target name to be specified.
+Because this will affect the ability to reference the "genex" object using the
+``:genex:`` role, this option should be used very sparingly.
+
``signature`` directive
^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/Help/envvar/CMAKE_MAXIMUM_RECURSION_DEPTH.rst b/Help/envvar/CMAKE_MAXIMUM_RECURSION_DEPTH.rst
new file mode 100644
index 0000000000..2d65b60bc4
--- /dev/null
+++ b/Help/envvar/CMAKE_MAXIMUM_RECURSION_DEPTH.rst
@@ -0,0 +1,10 @@
+CMAKE_MAXIMUM_RECURSION_DEPTH
+-----------------------------
+
+.. versionadded:: 3.27
+
+.. include:: ENV_VAR.txt
+
+Maximum recursion depth for CMake scripts. This environment variable is
+used if the :variable:`CMAKE_MAXIMUM_RECURSION_DEPTH` variable is not set.
+See that variable's documentation for details.
diff --git a/Help/manual/cmake-env-variables.7.rst b/Help/manual/cmake-env-variables.7.rst
index 4c29b80f13..1f0c9111aa 100644
--- a/Help/manual/cmake-env-variables.7.rst
+++ b/Help/manual/cmake-env-variables.7.rst
@@ -20,6 +20,7 @@ Environment Variables that Change Behavior
.. toctree::
:maxdepth: 1
+ /envvar/CMAKE_MAXIMUM_RECURSION_DEPTH
/envvar/CMAKE_PREFIX_PATH
/envvar/SSL_CERT_DIR
/envvar/SSL_CERT_FILE
diff --git a/Help/manual/cmake-generator-expressions.7.rst b/Help/manual/cmake-generator-expressions.7.rst
index a640c13116..9da37999b1 100644
--- a/Help/manual/cmake-generator-expressions.7.rst
+++ b/Help/manual/cmake-generator-expressions.7.rst
@@ -1418,6 +1418,7 @@ In the following, the phrase "the ``tgt`` filename" means the name of the
expression is being evaluated.
.. genex:: $<TARGET_PROPERTY:prop>
+ :target: TARGET_PROPERTY:prop
Value of the property ``prop`` on the target for which the expression
is being evaluated. Note that for generator expressions in
diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst
index 811547baa1..a37a45c8c5 100644
--- a/Help/manual/cmake-policies.7.rst
+++ b/Help/manual/cmake-policies.7.rst
@@ -57,6 +57,7 @@ Policies Introduced by CMake 3.27
.. toctree::
:maxdepth: 1
+ CMP0147: Visual Studio generators build custom commands in parallel. </policy/CMP0147>
CMP0146: The FindCUDA module is removed. </policy/CMP0146>
CMP0145: The Dart and FindDart modules are removed. </policy/CMP0145>
CMP0144: find_package uses upper-case PACKAGENAME_ROOT variables. </policy/CMP0144>
diff --git a/Help/manual/cmake-properties.7.rst b/Help/manual/cmake-properties.7.rst
index 01c9ce8346..8559b0b2a1 100644
--- a/Help/manual/cmake-properties.7.rst
+++ b/Help/manual/cmake-properties.7.rst
@@ -175,7 +175,10 @@ Properties on Targets
/prop_tgt/CONFIG_POSTFIX
/prop_tgt/CROSSCOMPILING_EMULATOR
/prop_tgt/CUDA_ARCHITECTURES
+ /prop_tgt/CUDA_CUBIN_COMPILATION
/prop_tgt/CUDA_EXTENSIONS
+ /prop_tgt/CUDA_FATBIN_COMPILATION
+ /prop_tgt/CUDA_OPTIX_COMPILATION
/prop_tgt/CUDA_PTX_COMPILATION
/prop_tgt/CUDA_RESOLVE_DEVICE_SYMBOLS
/prop_tgt/CUDA_RUNTIME_LIBRARY
diff --git a/Help/policy/CMP0147.rst b/Help/policy/CMP0147.rst
new file mode 100644
index 0000000000..0f25096633
--- /dev/null
+++ b/Help/policy/CMP0147.rst
@@ -0,0 +1,24 @@
+CMP0147
+-------
+
+.. versionadded:: 3.27
+
+:ref:`Visual Studio Generators` build custom commands in parallel.
+
+Visual Studio 15.8 (2017) and newer support building custom commands in
+parallel. CMake 3.27 and above prefer to enable this behavior by adding
+a ``BuildInParallel`` setting to custom commands in ``.vcxproj`` files.
+This policy provides compatibility for projects that have not been updated
+to expect this, e.g., because their custom commands were accidentally
+relying on serial execution by MSBuild.
+
+The ``OLD`` behavior for this policy is to not add ``BuildInParallel``.
+The ``NEW`` behavior for this policy is to add ``BuildInParallel`` for
+VS 15.8 and newer.
+
+This policy was introduced in CMake version 3.27. Use the
+:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
+Unlike many policies, CMake version |release| does *not* warn
+when this policy is not set and simply uses ``OLD`` behavior.
+
+.. include:: DEPRECATED.txt
diff --git a/Help/prop_tgt/CUDA_CUBIN_COMPILATION.rst b/Help/prop_tgt/CUDA_CUBIN_COMPILATION.rst
new file mode 100644
index 0000000000..f8860aeda3
--- /dev/null
+++ b/Help/prop_tgt/CUDA_CUBIN_COMPILATION.rst
@@ -0,0 +1,14 @@
+CUDA_CUBIN_COMPILATION
+----------------------
+
+.. versionadded:: 3.27
+
+Compile CUDA sources to ``.cubin`` files instead of ``.obj`` files
+within :ref:`Object Libraries`.
+
+For example:
+
+.. code-block:: cmake
+
+ add_library(mycubin OBJECT a.cu b.cu)
+ set_property(TARGET mycubin PROPERTY CUDA_CUBIN_COMPILATION ON)
diff --git a/Help/prop_tgt/CUDA_FATBIN_COMPILATION.rst b/Help/prop_tgt/CUDA_FATBIN_COMPILATION.rst
new file mode 100644
index 0000000000..3d3c715339
--- /dev/null
+++ b/Help/prop_tgt/CUDA_FATBIN_COMPILATION.rst
@@ -0,0 +1,14 @@
+CUDA_FATBIN_COMPILATION
+-----------------------
+
+.. versionadded:: 3.27
+
+Compile CUDA sources to ``.fatbin`` files instead of ``.obj`` files
+within :ref:`Object Libraries`.
+
+For example:
+
+.. code-block:: cmake
+
+ add_library(myfbins OBJECT a.cu b.cu)
+ set_property(TARGET myfbins PROPERTY CUDA_FATBIN_COMPILATION ON)
diff --git a/Help/prop_tgt/CUDA_OPTIX_COMPILATION.rst b/Help/prop_tgt/CUDA_OPTIX_COMPILATION.rst
new file mode 100644
index 0000000000..c2a06a88b7
--- /dev/null
+++ b/Help/prop_tgt/CUDA_OPTIX_COMPILATION.rst
@@ -0,0 +1,14 @@
+CUDA_OPTIX_COMPILATION
+----------------------
+
+.. versionadded:: 3.27
+
+Compile CUDA sources to ``.optixir`` files instead of ``.obj`` files
+within :ref:`Object Libraries`.
+
+For example:
+
+.. code-block:: cmake
+
+ add_library(myoptix OBJECT a.cu b.cu)
+ set_property(TARGET myoptix PROPERTY CUDA_OPTIX_COMPILATION ON)
diff --git a/Help/release/dev/FindOpenGL-gles.rst b/Help/release/dev/FindOpenGL-gles.rst
new file mode 100644
index 0000000000..fcbc5167a1
--- /dev/null
+++ b/Help/release/dev/FindOpenGL-gles.rst
@@ -0,0 +1,5 @@
+FindOpenGL-gles
+---------------
+
+* The :module:`FindOpenGL` module gained support for components
+ ``GLES2`` and ``GLES3``.
diff --git a/Help/release/dev/cuda-support-new-compile-modes.rst b/Help/release/dev/cuda-support-new-compile-modes.rst
new file mode 100644
index 0000000000..2d24c167a4
--- /dev/null
+++ b/Help/release/dev/cuda-support-new-compile-modes.rst
@@ -0,0 +1,14 @@
+cuda-support-new-compile-modes
+------------------------------
+
+* A :prop_tgt:`CUDA_CUBIN_COMPILATION` target property was added to
+ :ref:`Object Libraries` to support compiling to ``.cubin`` files
+ instead of host object files. Currently only supported with NVIDIA.
+
+* A :prop_tgt:`CUDA_FATBIN_COMPILATION` target property was added to
+ :ref:`Object Libraries` to support compiling to ``.fatbin`` files
+ instead of host object files. Currently only supported with NVIDIA.
+
+* A :prop_tgt:`CUDA_OPTIX_COMPILATION` target property was added to
+ :ref:`Object Libraries` to support compiling to ``.optixir`` files
+ instead of host object files. Currently only supported with NVIDIA.
diff --git a/Help/release/dev/vs-BuildInParallel.rst b/Help/release/dev/vs-BuildInParallel.rst
new file mode 100644
index 0000000000..ef344c7135
--- /dev/null
+++ b/Help/release/dev/vs-BuildInParallel.rst
@@ -0,0 +1,5 @@
+vs-BuildInParallel
+------------------
+
+* :ref:`Visual Studio Generators`, for VS 15.8 (2017) and newer, now
+ build custom commands in parallel. See policy :policy:`CMP0147`.
diff --git a/Help/variable/CMAKE_MAXIMUM_RECURSION_DEPTH.rst b/Help/variable/CMAKE_MAXIMUM_RECURSION_DEPTH.rst
index 59c60d3acc..b611967c86 100644
--- a/Help/variable/CMAKE_MAXIMUM_RECURSION_DEPTH.rst
+++ b/Help/variable/CMAKE_MAXIMUM_RECURSION_DEPTH.rst
@@ -33,3 +33,5 @@ Calling any of the following commands increases the recursion depth:
depth)
* Reading or writing variables that are being watched by a
:command:`variable_watch`
+
+See also the :envvar:`CMAKE_MAXIMUM_RECURSION_DEPTH` environment variable.
diff --git a/Modules/CMakeCUDAInformation.cmake b/Modules/CMakeCUDAInformation.cmake
index dea721ebb9..e774088811 100644
--- a/Modules/CMakeCUDAInformation.cmake
+++ b/Modules/CMakeCUDAInformation.cmake
@@ -134,7 +134,6 @@ include(CMakeCommonLanguageInclude)
# CMAKE_CUDA_CREATE_SHARED_LIBRARY
# CMAKE_CUDA_CREATE_SHARED_MODULE
# CMAKE_CUDA_COMPILE_WHOLE_COMPILATION
-# CMAKE_CUDA_COMPILE_PTX_COMPILATION
# CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION
# CMAKE_CUDA_LINK_EXECUTABLE
diff --git a/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake b/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake
index cd978d59d0..bda1d71110 100644
--- a/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake
+++ b/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake
@@ -12,7 +12,6 @@ macro (CHECK_COMPILER_FLAG_COMMON_PATTERNS _VAR)
FAIL_REGEX "switch .* is no longer supported" # GNU
FAIL_REGEX "unknown .*option" # Clang
FAIL_REGEX "optimization flag .* not supported" # Clang
- FAIL_REGEX "argument unused during compilation: .*" # Clang
FAIL_REGEX "unknown argument ignored" # Clang (cl)
FAIL_REGEX "ignoring unknown option" # MSVC, Intel
FAIL_REGEX "warning D9002" # MSVC, any lang
diff --git a/Modules/CheckCCompilerFlag.cmake b/Modules/CheckCCompilerFlag.cmake
index 335b437133..696096d8bb 100644
--- a/Modules/CheckCCompilerFlag.cmake
+++ b/Modules/CheckCCompilerFlag.cmake
@@ -33,7 +33,6 @@ effect or even a specific one is beyond the scope of this module.
#]=======================================================================]
include_guard(GLOBAL)
-include(CheckCSourceCompiles)
include(Internal/CheckCompilerFlag)
macro (CHECK_C_COMPILER_FLAG _FLAG _RESULT)
diff --git a/Modules/CheckCXXCompilerFlag.cmake b/Modules/CheckCXXCompilerFlag.cmake
index 3bc346362d..f3f94c02a4 100644
--- a/Modules/CheckCXXCompilerFlag.cmake
+++ b/Modules/CheckCXXCompilerFlag.cmake
@@ -33,7 +33,6 @@ effect or even a specific one is beyond the scope of this module.
#]=======================================================================]
include_guard(GLOBAL)
-include(CheckCXXSourceCompiles)
include(Internal/CheckCompilerFlag)
macro (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT)
diff --git a/Modules/CheckFortranCompilerFlag.cmake b/Modules/CheckFortranCompilerFlag.cmake
index 5b1cd02779..b19654be8c 100644
--- a/Modules/CheckFortranCompilerFlag.cmake
+++ b/Modules/CheckFortranCompilerFlag.cmake
@@ -35,7 +35,6 @@ effect or even a specific one is beyond the scope of this module.
#]=======================================================================]
include_guard(GLOBAL)
-include(CheckFortranSourceCompiles)
include(Internal/CheckCompilerFlag)
macro (CHECK_FORTRAN_COMPILER_FLAG _FLAG _RESULT)
diff --git a/Modules/CheckOBJCCompilerFlag.cmake b/Modules/CheckOBJCCompilerFlag.cmake
index d8d874175f..2df30b7d90 100644
--- a/Modules/CheckOBJCCompilerFlag.cmake
+++ b/Modules/CheckOBJCCompilerFlag.cmake
@@ -35,7 +35,6 @@ effect or even a specific one is beyond the scope of this module.
#]=======================================================================]
include_guard(GLOBAL)
-include(CheckOBJCSourceCompiles)
include(Internal/CheckCompilerFlag)
macro (CHECK_OBJC_COMPILER_FLAG _FLAG _RESULT)
diff --git a/Modules/CheckOBJCXXCompilerFlag.cmake b/Modules/CheckOBJCXXCompilerFlag.cmake
index 3f3f8fe38b..e4f0c6c0e5 100644
--- a/Modules/CheckOBJCXXCompilerFlag.cmake
+++ b/Modules/CheckOBJCXXCompilerFlag.cmake
@@ -35,7 +35,6 @@ effect or even a specific one is beyond the scope of this module.
#]=======================================================================]
include_guard(GLOBAL)
-include(CheckOBJCXXSourceCompiles)
include(Internal/CheckCompilerFlag)
macro (CHECK_OBJCXX_COMPILER_FLAG _FLAG _RESULT)
diff --git a/Modules/CheckStructHasMember.cmake b/Modules/CheckStructHasMember.cmake
index 8217c84c2a..33409e9bd3 100644
--- a/Modules/CheckStructHasMember.cmake
+++ b/Modules/CheckStructHasMember.cmake
@@ -51,8 +51,7 @@ Example:
#]=======================================================================]
include_guard(GLOBAL)
-include(CheckCSourceCompiles)
-include(CheckCXXSourceCompiles)
+include(CheckSourceCompiles)
macro (CHECK_STRUCT_HAS_MEMBER _STRUCT _MEMBER _HEADER _RESULT)
set(_INCLUDE_FILES)
@@ -78,9 +77,9 @@ int main()
")
if("${_lang}" STREQUAL "C")
- CHECK_C_SOURCE_COMPILES("${_CHECK_STRUCT_MEMBER_SOURCE_CODE}" ${_RESULT})
+ CHECK_SOURCE_COMPILES(C "${_CHECK_STRUCT_MEMBER_SOURCE_CODE}" ${_RESULT})
elseif("${_lang}" STREQUAL "CXX")
- CHECK_CXX_SOURCE_COMPILES("${_CHECK_STRUCT_MEMBER_SOURCE_CODE}" ${_RESULT})
+ CHECK_SOURCE_COMPILES(CXX "${_CHECK_STRUCT_MEMBER_SOURCE_CODE}" ${_RESULT})
else()
message(FATAL_ERROR "Unknown language:\n ${_lang}\nSupported languages: C, CXX.\n")
endif()
diff --git a/Modules/Compiler/NVIDIA-CUDA.cmake b/Modules/Compiler/NVIDIA-CUDA.cmake
index 0823954302..c839d1cbbb 100644
--- a/Modules/Compiler/NVIDIA-CUDA.cmake
+++ b/Modules/Compiler/NVIDIA-CUDA.cmake
@@ -8,6 +8,11 @@ set(_CMAKE_COMPILE_AS_CUDA_FLAG "-x cu")
set(_CMAKE_CUDA_WHOLE_FLAG "-c")
set(_CMAKE_CUDA_RDC_FLAG "-rdc=true")
set(_CMAKE_CUDA_PTX_FLAG "-ptx")
+set(_CMAKE_CUDA_CUBIN_FLAG "-cubin")
+set(_CMAKE_CUDA_FATBIN_FLAG "-fatbin")
+if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL "11.7.0")
+ set(_CMAKE_CUDA_OPTIX_FLAG "-optix-ir")
+endif()
if (CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 10.2.89)
# The -forward-unknown-to-host-compiler flag was only
diff --git a/Modules/FindCUDA.cmake b/Modules/FindCUDA.cmake
index c2ec82eb5a..f65bb7321e 100644
--- a/Modules/FindCUDA.cmake
+++ b/Modules/FindCUDA.cmake
@@ -565,6 +565,13 @@ if(_FindCUDA_CMP0146 STREQUAL "NEW")
message(FATAL_ERROR "The FindCUDA module has been removed by policy CMP0146.")
endif()
+if(CMAKE_GENERATOR MATCHES "Visual Studio")
+ cmake_policy(GET CMP0147 _FindCUDA_CMP0147)
+ if(_FindCUDA_CMP0147 STREQUAL "NEW")
+ message(FATAL_ERROR "The FindCUDA module does not work in Visual Studio with policy CMP0147.")
+ endif()
+endif()
+
if(_FindCUDA_testing)
set(_FindCUDA_included TRUE)
return()
diff --git a/Modules/FindOpenGL.cmake b/Modules/FindOpenGL.cmake
index a9a1b2aec2..a7736015ad 100644
--- a/Modules/FindOpenGL.cmake
+++ b/Modules/FindOpenGL.cmake
@@ -18,8 +18,26 @@ Optional COMPONENTS
.. versionadded:: 3.10
-This module respects several optional COMPONENTS: ``EGL``, ``GLX``, and
-``OpenGL``. There are corresponding import targets for each of these flags.
+This module respects several optional COMPONENTS:
+
+``EGL``
+ The EGL interface between OpenGL, OpenGL ES and the underlying windowing system.
+
+``GLX``
+ An extension to X that interfaces OpenGL, OpenGL ES with X window system.
+
+``OpenGL``
+ The cross platform API for 3D graphics.
+
+``GLES2``
+ .. versionadded:: 3.27
+
+ A subset of OpenGL API for embedded systems with limited capabilities.
+
+``GLES3``
+ .. versionadded:: 3.27
+
+ A subset of OpenGL API for embedded systems with more capabilities.
IMPORTED Targets
^^^^^^^^^^^^^^^^
@@ -42,6 +60,14 @@ This module defines the :prop_tgt:`IMPORTED` targets:
Defined if the system has OpenGL Extension to the X Window System (GLX).
``OpenGL::EGL``
Defined if the system has EGL.
+``OpenGL::GLES2``
+ .. versionadded:: 3.27
+
+ Defined if the system has GLES2.
+``OpenGL::GLES3``
+ .. versionadded:: 3.27
+
+ Defined if the system has GLES3.
Result Variables
^^^^^^^^^^^^^^^^
@@ -60,6 +86,10 @@ This module sets the following variables:
True, if the system has GLX.
``OpenGL_EGL_FOUND``
True, if the system has EGL.
+``OpenGL::GLES2``
+ Defined if the system has GLES2.
+``OpenGL::GLES3``
+ Defined if the system has GLES3.
``OPENGL_INCLUDE_DIR``
Path to the OpenGL include directory.
``OPENGL_EGL_INCLUDE_DIRS``
@@ -88,6 +118,14 @@ The following cache variables may also be set:
``OPENGL_gl_LIBRARY``
Path to the OpenGL library. New code should prefer the ``OpenGL::*`` import
targets.
+``OPENGL_gles2_LIBRARY``
+ .. versionadded:: 3.27
+
+ Path to the OpenGL GLES2 library.
+``OPENGL_gles3_LIBRARY``
+ .. versionadded:: 3.27
+
+ Path to the OpenGL GLES3 library.
.. versionadded:: 3.10
Variables for GLVND-specific libraries ``OpenGL``, ``EGL`` and ``GLX``.
@@ -182,7 +220,10 @@ elseif (APPLE)
OPENGL_glu_LIBRARY
)
else()
- if (CMAKE_SYSTEM_NAME MATCHES "HP-UX")
+ if (CMAKE_ANDROID_NDK)
+ set(_OPENGL_INCLUDE_PATH ${CMAKE_ANDROID_NDK}/sysroot/usr/include)
+ set(_OPENGL_LIB_PATH ${CMAKE_ANDROID_NDK}/platforms/android-${CMAKE_SYSTEM_VERSION}/arch-${CMAKE_ANDROID_ARCH}/usr/lib)
+ elseif (CMAKE_SYSTEM_NAME MATCHES "HP-UX")
# Handle HP-UX cases where we only want to find OpenGL in either hpux64
# or hpux32 depending on if we're doing a 64 bit build.
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
@@ -198,6 +239,13 @@ else()
/boot/develop/lib/x86)
set(_OPENGL_INCLUDE_PATH
/boot/develop/headers/os/opengl)
+ elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ # CMake doesn't support arbitrary globs in search paths.
+ file(GLOB _OPENGL_LIB_PATH
+ # The NVidia driver installation tool on Linux installs libraries to a
+ # `nvidia-<version>` subdirectory.
+ "/usr/lib/nvidia-*"
+ "/usr/lib32/nvidia-*")
endif()
# The first line below is to make sure that the proper headers
@@ -215,15 +263,20 @@ else()
)
find_path(OPENGL_GLX_INCLUDE_DIR GL/glx.h ${_OPENGL_INCLUDE_PATH})
find_path(OPENGL_EGL_INCLUDE_DIR EGL/egl.h ${_OPENGL_INCLUDE_PATH})
+ find_path(OPENGL_GLES2_INCLUDE_DIR GLES2/gl2.h ${_OPENGL_INCLUDE_PATH})
+ find_path(OPENGL_GLES3_INCLUDE_DIR GLES3/gl3.h ${_OPENGL_INCLUDE_PATH})
find_path(OPENGL_xmesa_INCLUDE_DIR GL/xmesa.h
/usr/share/doc/NVIDIA_GLX-1.0/include
/usr/openwin/share/include
/opt/graphics/OpenGL/include
)
+
list(APPEND _OpenGL_CACHE_VARS
OPENGL_INCLUDE_DIR
OPENGL_GLX_INCLUDE_DIR
OPENGL_EGL_INCLUDE_DIR
+ OPENGL_GLES2_INCLUDE_DIR
+ OPENGL_GLES3_INCLUDE_DIR
OPENGL_xmesa_INCLUDE_DIR
)
@@ -246,6 +299,17 @@ else()
PATH_SUFFIXES libglvnd
)
+ find_library(OPENGL_gles2_LIBRARY
+ NAMES GLESv2
+ PATHS ${_OPENGL_LIB_PATH}
+ )
+
+ find_library(OPENGL_gles3_LIBRARY
+ NAMES GLESv3
+ GLESv2 # mesa provides only libGLESv2
+ PATHS ${_OPENGL_LIB_PATH}
+ )
+
find_library(OPENGL_glu_LIBRARY
NAMES GLU MesaGLU
PATHS ${OPENGL_gl_LIBRARY}
@@ -258,6 +322,8 @@ else()
OPENGL_opengl_LIBRARY
OPENGL_glx_LIBRARY
OPENGL_egl_LIBRARY
+ OPENGL_gles2_LIBRARY
+ OPENGL_gles3_LIBRARY
OPENGL_glu_LIBRARY
)
@@ -338,12 +404,16 @@ else()
OPENGL_glx_LIBRARY AND
NOT OPENGL_gl_LIBRARY) OR
(NOT OPENGL_USE_EGL AND
+ NOT OPENGL_USE_GLES3 AND
+ NOT OPENGL_USE_GLES2 AND
NOT OPENGL_glx_LIBRARY AND
NOT OPENGL_gl_LIBRARY) OR
(NOT OPENGL_USE_EGL AND
OPENGL_opengl_LIBRARY AND
OPENGL_glx_LIBRARY) OR
- ( OPENGL_USE_EGL))
+ (NOT OPENGL_USE_GLES3 AND
+ NOT OPENGL_USE_GLES2 AND
+ OPENGL_USE_EGL))
list(APPEND _OpenGL_REQUIRED_VARS OPENGL_opengl_LIBRARY)
endif()
@@ -351,13 +421,19 @@ else()
if((NOT OPENGL_USE_OPENGL AND
NOT OPENGL_USE_GLX AND
NOT OPENGL_USE_EGL AND
+ NOT OPENGL_USE_GLES3 AND
+ NOT OPENGL_USE_GLES2 AND
NOT OPENGL_glx_LIBRARY AND
NOT OPENGL_gl_LIBRARY) OR
( OPENGL_USE_GLX AND
NOT OPENGL_USE_EGL AND
+ NOT OPENGL_USE_GLES3 AND
+ NOT OPENGL_USE_GLES2 AND
NOT OPENGL_glx_LIBRARY AND
NOT OPENGL_gl_LIBRARY) OR
(NOT OPENGL_USE_EGL AND
+ NOT OPENGL_USE_GLES3 AND
+ NOT OPENGL_USE_GLES2 AND
OPENGL_opengl_LIBRARY AND
OPENGL_glx_LIBRARY) OR
(OPENGL_USE_GLX AND OPENGL_USE_EGL))
@@ -369,6 +445,16 @@ else()
list(APPEND _OpenGL_REQUIRED_VARS OPENGL_egl_LIBRARY)
endif()
+ # GLVND GLES2 library.
+ if(OPENGL_USE_GLES2)
+ list(APPEND _OpenGL_REQUIRED_VARS OPENGL_gles2_LIBRARY)
+ endif()
+
+ # GLVND GLES3 library.
+ if(OPENGL_USE_GLES3)
+ list(APPEND _OpenGL_REQUIRED_VARS OPENGL_gles3_LIBRARY)
+ endif()
+
# Old-style "libGL" library: used as a fallback when GLVND isn't available.
if((NOT OPENGL_USE_EGL AND
NOT OPENGL_opengl_LIBRARY AND
@@ -381,7 +467,11 @@ else()
endif()
# We always need the 'gl.h' include dir.
- list(APPEND _OpenGL_REQUIRED_VARS OPENGL_INCLUDE_DIR)
+ if(OPENGL_USE_EGL)
+ list(APPEND _OpenGL_REQUIRED_VARS OPENGL_EGL_INCLUDE_DIR)
+ else()
+ list(APPEND _OpenGL_REQUIRED_VARS OPENGL_INCLUDE_DIR)
+ endif()
unset(_OPENGL_INCLUDE_PATH)
unset(_OPENGL_LIB_PATH)
@@ -428,6 +518,18 @@ else()
set(OpenGL_EGL_FOUND FALSE)
endif()
+if(OPENGL_gles2_LIBRARY AND OPENGL_GLES2_INCLUDE_DIR)
+ set(OpenGL_GLES2_FOUND TRUE)
+else()
+ set(OpenGL_GLES2_FOUND FALSE)
+endif()
+
+if(OPENGL_gles3_LIBRARY AND OPENGL_GLES3_INCLUDE_DIR)
+ set(OpenGL_GLES3_FOUND TRUE)
+else()
+ set(OpenGL_GLES3_FOUND FALSE)
+endif()
+
# User-visible names should be plural.
if(OPENGL_EGL_INCLUDE_DIR)
set(OPENGL_EGL_INCLUDE_DIRS ${OPENGL_EGL_INCLUDE_DIR})
@@ -461,6 +563,7 @@ if(OPENGL_FOUND)
endif()
set_target_properties(OpenGL::OpenGL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${OPENGL_INCLUDE_DIR}")
+ set(_OpenGL_EGL_IMPL OpenGL::OpenGL)
endif()
# ::GLX is a GLVND library, and thus Linux-only: we don't bother checking
@@ -481,6 +584,73 @@ if(OPENGL_FOUND)
"${OPENGL_GLX_INCLUDE_DIR}")
endif()
+ # ::GLES2 is a GLVND library, and thus Linux-only: we don't bother checking
+ # for a framework version of this library.
+ if(OpenGL_GLES2_FOUND AND NOT TARGET OpenGL::GLES2)
+
+ # Initialize target
+ if(NOT OPENGL_gles2_LIBRARY)
+ add_library(OpenGL::GLES2 INTERFACE IMPORTED)
+ else()
+ if(IS_ABSOLUTE "${OPENGL_gles2_LIBRARY}")
+ add_library(OpenGL::GLES2 UNKNOWN IMPORTED)
+ set_target_properties(OpenGL::GLES2 PROPERTIES
+ IMPORTED_LOCATION "${OPENGL_gles2_LIBRARY}"
+ )
+ else()
+ add_library(OpenGL::GLES2 INTERFACE IMPORTED)
+ set_target_properties(OpenGL::GLES2 PROPERTIES
+ IMPORTED_LIBNAME "${OPENGL_gles2_LIBRARY}"
+ )
+ endif()
+ endif()
+
+ # Attach target properties
+ set_target_properties(OpenGL::GLES2
+ PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES
+ "${OPENGL_GLES2_INCLUDE_DIR}"
+ )
+
+ if (OPENGL_USE_GLES2)
+ set(_OpenGL_EGL_IMPL OpenGL::GLES2)
+ endif ()
+
+ endif()
+
+ # ::GLES3 is a GLVND library, and thus Linux-only: we don't bother checking
+ # for a framework version of this library.
+ if(OpenGL_GLES3_FOUND AND NOT TARGET OpenGL::GLES3)
+
+ # Initialize target
+ if(NOT OPENGL_gles3_LIBRARY)
+ add_library(OpenGL::GLES3 INTERFACE IMPORTED)
+ else()
+ if(IS_ABSOLUTE "${OPENGL_gles3_LIBRARY}")
+ add_library(OpenGL::GLES3 UNKNOWN IMPORTED)
+ set_target_properties(OpenGL::GLES3 PROPERTIES
+ IMPORTED_LOCATION "${OPENGL_gles3_LIBRARY}"
+ )
+ else()
+ add_library(OpenGL::GLES3 INTERFACE IMPORTED)
+ set_target_properties(OpenGL::GLES3 PROPERTIES
+ IMPORTED_LIBNAME "${OPENGL_gles3_LIBRARY}"
+ )
+ endif()
+ endif()
+
+ # Attach target properties
+ set_target_properties(OpenGL::GLES3 PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES
+ "${OPENGL_GLES3_INCLUDE_DIR}"
+ )
+
+ if (OPENGL_USE_GLES3)
+ set(_OpenGL_EGL_IMPL OpenGL::GLES3)
+ endif ()
+
+ endif()
+
if(OPENGL_gl_LIBRARY AND NOT TARGET OpenGL::GL)
# A legacy GL library is available, so use it for the legacy GL target.
if(IS_ABSOLUTE "${OPENGL_gl_LIBRARY}")
@@ -517,10 +687,9 @@ if(OPENGL_FOUND)
# ::EGL is a GLVND library, and thus Linux-only: we don't bother checking
# for a framework version of this library.
- # Note we test for OpenGL::OpenGL as a target. When this module is updated to
- # support GLES, we would additionally want to check for the hypothetical GLES
- # target and enable EGL if either ::GLES or ::OpenGL is created.
- if(TARGET OpenGL::OpenGL AND OpenGL_EGL_FOUND AND NOT TARGET OpenGL::EGL)
+ # Note we test whether _OpenGL_EGL_IMPL is set. Based on the OpenGL implementation,
+ # _OpenGL_EGL_IMPL will be one of OpenGL::OpenGL, OpenGL::GLES2, OpenGL::GLES3
+ if(_OpenGL_EGL_IMPL AND OpenGL_EGL_FOUND AND NOT TARGET OpenGL::EGL)
if(IS_ABSOLUTE "${OPENGL_egl_LIBRARY}")
add_library(OpenGL::EGL UNKNOWN IMPORTED)
set_target_properties(OpenGL::EGL PROPERTIES IMPORTED_LOCATION
@@ -531,7 +700,7 @@ if(OPENGL_FOUND)
"${OPENGL_egl_LIBRARY}")
endif()
set_target_properties(OpenGL::EGL PROPERTIES INTERFACE_LINK_LIBRARIES
- OpenGL::OpenGL)
+ "${_OpenGL_EGL_IMPL}")
# Note that EGL's include directory is different from OpenGL/GLX's!
set_target_properties(OpenGL::EGL PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
"${OPENGL_EGL_INCLUDE_DIR}")
diff --git a/Modules/FortranCInterface/CMakeLists.txt b/Modules/FortranCInterface/CMakeLists.txt
index 4bd7006efb..a0f186250b 100644
--- a/Modules/FortranCInterface/CMakeLists.txt
+++ b/Modules/FortranCInterface/CMakeLists.txt
@@ -6,11 +6,11 @@ project(FortranCInterface C Fortran)
include(${FortranCInterface_BINARY_DIR}/Input.cmake OPTIONAL)
# Check if the C compiler supports '$' in identifiers.
-include(CheckCSourceCompiles)
-check_c_source_compiles("
-extern int dollar$(void);
-int main() { return 0; }
-" C_SUPPORTS_DOLLAR)
+include(CheckSourceCompiles)
+check_source_compiles(C
+"extern int dollar$(void);
+int main() { return 0; }"
+C_SUPPORTS_DOLLAR)
# List manglings of global symbol names to try.
set(global_symbols
diff --git a/Modules/GenerateExportHeader.cmake b/Modules/GenerateExportHeader.cmake
index ea8616af12..01a6e4f5f0 100644
--- a/Modules/GenerateExportHeader.cmake
+++ b/Modules/GenerateExportHeader.cmake
@@ -198,19 +198,19 @@ that will be populated with the ``CXX_FLAGS`` required to enable visibility
support for the compiler/architecture in use.
#]=======================================================================]
-include(CheckCCompilerFlag)
-include(CheckCXXCompilerFlag)
+include(CheckCompilerFlag)
+include(CheckSourceCompiles)
# TODO: Install this macro separately?
macro(_check_cxx_compiler_attribute _ATTRIBUTE _RESULT)
- check_cxx_source_compiles("${_ATTRIBUTE} int somefunc() { return 0; }
+ check_source_compiles(CXX "${_ATTRIBUTE} int somefunc() { return 0; }
int main() { return somefunc();}" ${_RESULT}
)
endmacro()
# TODO: Install this macro separately?
macro(_check_c_compiler_attribute _ATTRIBUTE _RESULT)
- check_c_source_compiles("${_ATTRIBUTE} int somefunc() { return 0; }
+ check_source_compiles(C "${_ATTRIBUTE} int somefunc() { return 0; }
int main() { return somefunc();}" ${_RESULT}
)
endmacro()
@@ -226,7 +226,7 @@ macro(_test_compiler_hidden_visibility)
endif()
# Exclude XL here because it misinterprets -fvisibility=hidden even though
- # the check_cxx_compiler_flag passes
+ # the check_compiler_flag passes
if(NOT GCC_TOO_OLD
AND NOT _INTEL_TOO_OLD
AND NOT WIN32
@@ -235,12 +235,12 @@ macro(_test_compiler_hidden_visibility)
AND NOT CMAKE_CXX_COMPILER_ID MATCHES "^(PGI|NVHPC)$"
AND NOT CMAKE_CXX_COMPILER_ID MATCHES Watcom)
if (CMAKE_CXX_COMPILER_LOADED)
- check_cxx_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY)
- check_cxx_compiler_flag(-fvisibility-inlines-hidden
+ check_compiler_flag(CXX -fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY)
+ check_compiler_flag(CXX -fvisibility-inlines-hidden
COMPILER_HAS_HIDDEN_INLINE_VISIBILITY)
else()
- check_c_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY)
- check_c_compiler_flag(-fvisibility-inlines-hidden
+ check_compiler_flag(C -fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY)
+ check_compiler_flag(C -fvisibility-inlines-hidden
COMPILER_HAS_HIDDEN_INLINE_VISIBILITY)
endif()
endif()
diff --git a/Modules/Internal/CMakeTryCompilerOrLinkerFlag.cmake b/Modules/Internal/CMakeTryCompilerOrLinkerFlag.cmake
index ff8908be13..b671b4a01e 100644
--- a/Modules/Internal/CMakeTryCompilerOrLinkerFlag.cmake
+++ b/Modules/Internal/CMakeTryCompilerOrLinkerFlag.cmake
@@ -69,6 +69,7 @@ function(CMAKE_TRY_COMPILER_OR_LINKER_FLAG lang flag result)
set (CCCF_COMMAND_PATTERN "<FLAG> -o <OUTPUT> <SOURCE>")
endif()
+ list (APPEND CCCF_FAIL_REGEX "argument unused during compilation") # clang
if (check_lang STREQUAL "C")
list(APPEND CCCF_FAIL_REGEX
"command line option .* is valid for .* but not for C") # GNU
diff --git a/Modules/Internal/CheckFlagCommonConfig.cmake b/Modules/Internal/CheckFlagCommonConfig.cmake
index 744f1f1052..8c5703db19 100644
--- a/Modules/Internal/CheckFlagCommonConfig.cmake
+++ b/Modules/Internal/CheckFlagCommonConfig.cmake
@@ -23,26 +23,30 @@ macro(CMAKE_CHECK_FLAG_COMMON_INIT _FUNC _LANG _SRC _PATTERNS)
FAIL_REGEX "-Werror=.* argument .* is not valid for C\\+\\+")
elseif("${_LANG}" STREQUAL "CUDA")
set(${_SRC} "__host__ int main() { return 0; }")
- set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for C\\+\\+") # Host GNU
+ set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for C\\+\\+" # Host GNU
+ FAIL_REGEX "argument unused during compilation: .*") # Clang
elseif("${_LANG}" STREQUAL "Fortran")
set(${_SRC} " program test\n stop\n end program")
set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for Fortran")
elseif("${_LANG}" STREQUAL "HIP")
set(${_SRC} "__host__ int main() { return 0; }")
+ set(${_PATTERNS} FAIL_REGEX "argument unused during compilation: .*") # Clang
elseif("${_LANG}" STREQUAL "OBJC")
set(${_SRC} [=[
#ifndef __OBJC__
# error "Not an Objective-C compiler"
#endif
int main(void) { return 0; }]=])
- set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for Objective-C") # GNU
+ set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for Objective-C" # GNU
+ FAIL_REGEX "argument unused during compilation: .*") # Clang
elseif("${_LANG}" STREQUAL "OBJCXX")
set(${_SRC} [=[
#ifndef __OBJC__
# error "Not an Objective-C++ compiler"
#endif
int main(void) { return 0; }]=])
- set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for Objective-C\\+\\+") # GNU
+ set(${_PATTERNS} FAIL_REGEX "command[ -]line option .* is valid for .* but not for Objective-C\\+\\+" # GNU
+ FAIL_REGEX "argument unused during compilation: .*") # Clang
elseif("${_LANG}" STREQUAL "ISPC")
set(${_SRC} "float func(uniform int32, float a) { return a / 2.25; }")
elseif("${_LANG}" STREQUAL "Swift")
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 163dab3beb..33514ba1bf 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -11,20 +11,6 @@ endif()
include(CheckIncludeFile)
-if(NOT CMake_DEFAULT_RECURSION_LIMIT)
- if(DEFINED ENV{DASHBOARD_TEST_FROM_CTEST})
- set(CMake_DEFAULT_RECURSION_LIMIT 100)
- elseif(MINGW OR MSYS)
- set(CMake_DEFAULT_RECURSION_LIMIT 400)
- elseif(WIN32 AND CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64")
- set(CMake_DEFAULT_RECURSION_LIMIT 400)
- elseif(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "IntelLLVM")
- set(CMake_DEFAULT_RECURSION_LIMIT 600)
- else()
- set(CMake_DEFAULT_RECURSION_LIMIT 1000)
- endif()
-endif()
-
if(APPLE)
set(CMake_USE_MACH_PARSER 1)
endif()
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index d1d89a3789..73bda5fa00 100644
--- a/Source/CMakeVersion.cmake
+++ b/Source/CMakeVersion.cmake
@@ -1,7 +1,7 @@
# CMake version number components.
set(CMake_VERSION_MAJOR 3)
set(CMake_VERSION_MINOR 26)
-set(CMake_VERSION_PATCH 20230310)
+set(CMake_VERSION_PATCH 20230314)
#set(CMake_VERSION_RC 0)
set(CMake_VERSION_IS_DIRTY 0)
diff --git a/Source/cmConfigure.cmake.h.in b/Source/cmConfigure.cmake.h.in
index 90f3de0a1d..3f19a11aa2 100644
--- a/Source/cmConfigure.cmake.h.in
+++ b/Source/cmConfigure.cmake.h.in
@@ -23,7 +23,7 @@
#cmakedefine CMake_USE_MACH_PARSER
#cmakedefine CMake_USE_XCOFF_PARSER
#cmakedefine CMAKE_USE_WMAKE
-#define CMake_DEFAULT_RECURSION_LIMIT @CMake_DEFAULT_RECURSION_LIMIT@
+#cmakedefine CMake_DEFAULT_RECURSION_LIMIT @CMake_DEFAULT_RECURSION_LIMIT@
#define CMAKE_BIN_DIR "/@CMAKE_BIN_DIR@"
#define CMAKE_DATA_DIR "/@CMAKE_DATA_DIR@"
#define CMAKE_DOC_DIR "/@CMAKE_DOC_DIR@"
diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx
index 4024dff067..c228cde777 100644
--- a/Source/cmFindPackageCommand.cxx
+++ b/Source/cmFindPackageCommand.cxx
@@ -977,6 +977,21 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args)
}
}
+ // Limit package nesting depth well below the recursion depth limit because
+ // find_package nesting uses more stack space than normal recursion.
+ {
+ static std::size_t const findPackageDepthMinMax = 100;
+ std::size_t const findPackageDepthMax = std::max(
+ this->Makefile->GetRecursionDepthLimit() / 2, findPackageDepthMinMax);
+ std::size_t const findPackageDepth =
+ this->Makefile->FindPackageRootPathStack.size() + 1;
+ if (findPackageDepth > findPackageDepthMax) {
+ this->SetError(cmStrCat("maximum nesting depth of ", findPackageDepthMax,
+ " exceeded."));
+ return false;
+ }
+ }
+
this->PushFindPackageRootPathStack();
this->SetModuleVariables(components, componentVarDefs);
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 54cd8ba907..4cfa1d76e7 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -3,6 +3,7 @@
#include "cmGeneratorTarget.h"
#include <algorithm>
+#include <array>
#include <cassert>
#include <cerrno>
#include <cstddef>
@@ -1011,12 +1012,27 @@ const std::string& cmGeneratorTarget::GetObjectName(cmSourceFile const* file)
const char* cmGeneratorTarget::GetCustomObjectExtension() const
{
- static std::string extension;
- const bool has_ptx_extension =
- this->GetPropertyAsBool("CUDA_PTX_COMPILATION");
- if (has_ptx_extension) {
- extension = ".ptx";
- return extension.c_str();
+ struct compiler_mode
+ {
+ std::string variable;
+ std::string extension;
+ };
+ static std::array<compiler_mode, 4> const modes{
+ { { "CUDA_PTX_COMPILATION", ".ptx" },
+ { "CUDA_CUBIN_COMPILATION", ".cubin" },
+ { "CUDA_FATBIN_COMPILATION", ".fatbin" },
+ { "CUDA_OPTIX_COMPILATION", ".optixir" } }
+ };
+
+ std::string const& compiler =
+ this->Makefile->GetSafeDefinition("CMAKE_CUDA_COMPILER_ID");
+ if (!compiler.empty()) {
+ for (const auto& m : modes) {
+ const bool has_extension = this->GetPropertyAsBool(m.variable);
+ if (has_extension) {
+ return m.extension.c_str();
+ }
+ }
}
return nullptr;
}
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 72eed69511..7ed68d637a 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -110,8 +110,6 @@ cmGlobalGenerator::cmGlobalGenerator(cmake* cm)
this->ConfigureDoneCMP0026AndCMP0024 = false;
this->FirstTimeProgress = 0.0f;
- this->RecursionDepth = 0;
-
cm->GetState()->SetIsGeneratorMultiConfig(false);
cm->GetState()->SetMinGWMake(false);
cm->GetState()->SetMSYSShell(false);
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 66ab752dc1..7de8215f38 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -586,7 +586,7 @@ public:
std::string MakeSilentFlag;
- int RecursionDepth;
+ size_t RecursionDepth = 0;
virtual void GetQtAutoGenConfigs(std::vector<std::string>& configs) const
{
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index d29c086cbf..650d0aa8de 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -8,7 +8,6 @@
#include <cstdio>
#include <functional>
#include <sstream>
-#include <tuple>
#include <utility>
#include <cm/iterator>
@@ -580,7 +579,7 @@ void cmGlobalNinjaGenerator::Generate()
}
for (auto& it : this->Configs) {
- it.second.TargetDependsClosureLocalOutputs.clear();
+ it.second.TargetDependsClosures.clear();
}
this->TargetAll = this->NinjaOutputPath("all");
@@ -1363,85 +1362,70 @@ void cmGlobalNinjaGenerator::AppendTargetDependsClosure(
cmGeneratorTarget const* target, cmNinjaDeps& outputs,
const std::string& config, const std::string& fileConfig, bool genexOutput)
{
- struct Entry
- {
- Entry(cmGeneratorTarget const* target_, std::string config_,
- std::string fileConfig_)
- : target(target_)
- , config(std::move(config_))
- , fileConfig(std::move(fileConfig_))
- {
- }
+ cmNinjaOuts outs;
+ this->AppendTargetDependsClosure(target, outs, config, fileConfig,
+ genexOutput, true);
+ cm::append(outputs, outs);
+}
- bool operator<(Entry const& other) const
- {
- return std::tie(target, config, fileConfig) <
- std::tie(other.target, other.config, other.fileConfig);
- }
+void cmGlobalNinjaGenerator::AppendTargetDependsClosure(
+ cmGeneratorTarget const* target, cmNinjaOuts& outputs,
+ const std::string& config, const std::string& fileConfig, bool genexOutput,
+ bool omit_self)
+{
- cmGeneratorTarget const* target;
- std::string config;
- std::string fileConfig;
+ // try to locate the target in the cache
+ ByConfig::TargetDependsClosureKey key{
+ target,
+ config,
+ genexOutput,
};
-
- cmNinjaOuts outputSet;
- std::vector<Entry> stack;
- stack.emplace_back(target, config, fileConfig);
- std::set<Entry> seen = { stack.back() };
-
- do {
- Entry entry = std::move(stack.back());
- stack.pop_back();
-
- // generate the outputs of the target itself, if applicable
- if (entry.target != target) {
- // try to locate the target in the cache
- ByConfig::TargetDependsClosureKey localCacheKey{
- entry.target,
- entry.config,
- genexOutput,
- };
- auto& configs = this->Configs[entry.fileConfig];
- auto lb =
- configs.TargetDependsClosureLocalOutputs.lower_bound(localCacheKey);
-
- if (lb == configs.TargetDependsClosureLocalOutputs.end() ||
- lb->first != localCacheKey) {
- cmNinjaDeps outs;
- this->AppendTargetOutputs(entry.target, outs, entry.config,
- DependOnTargetArtifact);
- configs.TargetDependsClosureLocalOutputs.emplace_hint(
- lb, localCacheKey, outs);
- for (auto& value : outs) {
- outputSet.emplace(std::move(value));
- }
- } else {
- outputSet.insert(lb->second.begin(), lb->second.end());
- }
- }
-
- // push next dependencies
- for (const auto& dep_target : this->GetTargetDirectDepends(entry.target)) {
+ auto find = this->Configs[fileConfig].TargetDependsClosures.lower_bound(key);
+
+ if (find == this->Configs[fileConfig].TargetDependsClosures.end() ||
+ find->first != key) {
+ // We now calculate the closure outputs by inspecting the dependent
+ // targets recursively.
+ // For that we have to distinguish between a local result set that is only
+ // relevant for filling the cache entries properly isolated and a global
+ // result set that is relevant for the result of the top level call to
+ // AppendTargetDependsClosure.
+ cmNinjaOuts this_outs; // this will be the new cache entry
+
+ for (auto const& dep_target : this->GetTargetDirectDepends(target)) {
if (!dep_target->IsInBuildSystem()) {
continue;
}
- if (!this->IsSingleConfigUtility(entry.target) &&
+ if (!this->IsSingleConfigUtility(target) &&
!this->IsSingleConfigUtility(dep_target) &&
this->EnableCrossConfigBuild() && !dep_target.IsCross() &&
!genexOutput) {
continue;
}
- auto emplaceRes = seen.emplace(
- dep_target, dep_target.IsCross() ? entry.fileConfig : entry.config,
- entry.fileConfig);
- if (emplaceRes.second) {
- stack.emplace_back(*emplaceRes.first);
+ if (dep_target.IsCross()) {
+ this->AppendTargetDependsClosure(dep_target, this_outs, fileConfig,
+ fileConfig, genexOutput, false);
+ } else {
+ this->AppendTargetDependsClosure(dep_target, this_outs, config,
+ fileConfig, genexOutput, false);
}
}
- } while (!stack.empty());
- cm::append(outputs, outputSet);
+ find = this->Configs[fileConfig].TargetDependsClosures.emplace_hint(
+ find, key, std::move(this_outs));
+ }
+
+ // now fill the outputs of the final result from the newly generated cache
+ // entry
+ outputs.insert(find->second.begin(), find->second.end());
+
+ // finally generate the outputs of the target itself, if applicable
+ cmNinjaDeps outs;
+ if (!omit_self) {
+ this->AppendTargetOutputs(target, outs, config, DependOnTargetArtifact);
+ }
+ outputs.insert(outs.begin(), outs.end());
}
void cmGlobalNinjaGenerator::AddTargetAlias(const std::string& alias,
diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h
index 6d23e89e86..c08bb46e4b 100644
--- a/Source/cmGlobalNinjaGenerator.h
+++ b/Source/cmGlobalNinjaGenerator.h
@@ -354,6 +354,11 @@ public:
const std::string& config,
const std::string& fileConfig,
bool genexOutput);
+ void AppendTargetDependsClosure(cmGeneratorTarget const* target,
+ cmNinjaOuts& outputs,
+ const std::string& config,
+ const std::string& fileConfig,
+ bool genexOutput, bool omit_self);
void AppendDirectoryForConfig(const std::string& prefix,
const std::string& config,
@@ -611,8 +616,7 @@ private:
bool GenexOutput;
};
- std::map<TargetDependsClosureKey, cmNinjaDeps>
- TargetDependsClosureLocalOutputs;
+ std::map<TargetDependsClosureKey, cmNinjaOuts> TargetDependsClosures;
TargetAliasMap TargetAliases;
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 3fcc7f7c7e..fc82c14095 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -67,6 +67,24 @@
# include "cmVariableWatch.h"
#endif
+#ifndef __has_feature
+# define __has_feature(x) 0
+#endif
+
+// Select a recursion limit that fits within the stack size.
+// See stack size flags in '../CompileFlags.cmake'.
+#ifndef CMake_DEFAULT_RECURSION_LIMIT
+# if __has_feature(address_sanitizer)
+# define CMake_DEFAULT_RECURSION_LIMIT 400
+# elif defined(_MSC_VER) && defined(_DEBUG)
+# define CMake_DEFAULT_RECURSION_LIMIT 600
+# elif defined(__ibmxl__) && defined(__linux)
+# define CMake_DEFAULT_RECURSION_LIMIT 600
+# else
+# define CMake_DEFAULT_RECURSION_LIMIT 1000
+# endif
+#endif
+
class cmMessenger;
cmDirectoryId::cmDirectoryId(std::string s)
@@ -99,7 +117,6 @@ cmMakefile::cmMakefile(cmGlobalGenerator* globalGenerator,
this->StateSnapshot =
this->StateSnapshot.GetState()->CreatePolicyScopeSnapshot(
this->StateSnapshot);
- this->RecursionDepth = 0;
// Enter a policy level for this directory.
this->PushPolicy();
@@ -454,18 +471,10 @@ bool cmMakefile::ExecuteCommand(const cmListFileFunction& lff,
static_cast<void>(stack_manager);
// Check for maximum recursion depth.
- int depth = CMake_DEFAULT_RECURSION_LIMIT;
- cmValue depthStr = this->GetDefinition("CMAKE_MAXIMUM_RECURSION_DEPTH");
- if (depthStr) {
- std::istringstream s(*depthStr);
- int d;
- if (s >> d) {
- depth = d;
- }
- }
- if (this->RecursionDepth > depth) {
+ size_t depthLimit = this->GetRecursionDepthLimit();
+ if (this->RecursionDepth > depthLimit) {
std::ostringstream e;
- e << "Maximum recursion depth of " << depth << " exceeded";
+ e << "Maximum recursion depth of " << depthLimit << " exceeded";
this->IssueMessage(MessageType::FATAL_ERROR, e.str());
cmSystemTools::SetFatalErrorOccurred();
return false;
@@ -2865,12 +2874,31 @@ bool cmMakefile::IsProjectFile(const char* filename) const
!cmSystemTools::IsSubDirectory(filename, "/CMakeFiles"));
}
-int cmMakefile::GetRecursionDepth() const
+size_t cmMakefile::GetRecursionDepthLimit() const
+{
+ size_t depth = CMake_DEFAULT_RECURSION_LIMIT;
+ if (cmValue depthStr =
+ this->GetDefinition("CMAKE_MAXIMUM_RECURSION_DEPTH")) {
+ unsigned long depthUL;
+ if (cmStrToULong(depthStr.GetCStr(), &depthUL)) {
+ depth = depthUL;
+ }
+ } else if (cm::optional<std::string> depthEnv =
+ cmSystemTools::GetEnvVar("CMAKE_MAXIMUM_RECURSION_DEPTH")) {
+ unsigned long depthUL;
+ if (cmStrToULong(*depthEnv, &depthUL)) {
+ depth = depthUL;
+ }
+ }
+ return depth;
+}
+
+size_t cmMakefile::GetRecursionDepth() const
{
return this->RecursionDepth;
}
-void cmMakefile::SetRecursionDepth(int recursionDepth)
+void cmMakefile::SetRecursionDepth(size_t recursionDepth)
{
this->RecursionDepth = recursionDepth;
}
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 6f04937fa2..a43ff41f9c 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -1023,8 +1023,10 @@ public:
const char* sourceFilename) const;
bool IsProjectFile(const char* filename) const;
- int GetRecursionDepth() const;
- void SetRecursionDepth(int recursionDepth);
+ size_t GetRecursionDepthLimit() const;
+
+ size_t GetRecursionDepth() const;
+ void SetRecursionDepth(size_t recursionDepth);
std::string NewDeferId() const;
bool DeferCall(std::string id, std::string fileName, cmListFileFunction lff);
@@ -1090,7 +1092,7 @@ protected:
private:
cmStateSnapshot StateSnapshot;
cmListFileBacktrace Backtrace;
- int RecursionDepth;
+ size_t RecursionDepth = 0;
struct DeferCommand
{
diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index e217dd92fe..2ead7399a0 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -3,6 +3,7 @@
#include "cmMakefileTargetGenerator.h"
#include <algorithm>
+#include <array>
#include <cassert>
#include <cstdio>
#include <iterator>
@@ -977,11 +978,23 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_RDC_FLAG");
cudaCompileMode = cmStrCat(cudaCompileMode, rdcFlag, " ");
}
- if (this->GeneratorTarget->GetPropertyAsBool("CUDA_PTX_COMPILATION")) {
- const std::string& ptxFlag =
- this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_PTX_FLAG");
- cudaCompileMode = cmStrCat(cudaCompileMode, ptxFlag);
- } else {
+
+ static std::array<cm::string_view, 4> const compileModes{
+ { "PTX"_s, "CUBIN"_s, "FATBIN"_s, "OPTIX"_s }
+ };
+ bool useNormalCompileMode = true;
+ for (cm::string_view mode : compileModes) {
+ auto propName = cmStrCat("CUDA_", mode, "_COMPILATION");
+ auto defName = cmStrCat("_CMAKE_CUDA_", mode, "_FLAG");
+ if (this->GeneratorTarget->GetPropertyAsBool(propName)) {
+ const std::string& flag =
+ this->Makefile->GetRequiredDefinition(defName);
+ cudaCompileMode = cmStrCat(cudaCompileMode, flag);
+ useNormalCompileMode = false;
+ break;
+ }
+ }
+ if (useNormalCompileMode) {
const std::string& wholeFlag =
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_WHOLE_FLAG");
cudaCompileMode = cmStrCat(cudaCompileMode, wholeFlag);
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 8663f46b5d..dc56142dc7 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -3,6 +3,7 @@
#include "cmNinjaTargetGenerator.h"
#include <algorithm>
+#include <array>
#include <cassert>
#include <functional>
#include <iterator>
@@ -859,11 +860,22 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_RDC_FLAG");
cudaCompileMode = cmStrCat(cudaCompileMode, rdcFlag, " ");
}
- if (this->GeneratorTarget->GetPropertyAsBool("CUDA_PTX_COMPILATION")) {
- const std::string& ptxFlag =
- this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_PTX_FLAG");
- cudaCompileMode = cmStrCat(cudaCompileMode, ptxFlag);
- } else {
+ static std::array<cm::string_view, 4> const compileModes{
+ { "PTX"_s, "CUBIN"_s, "FATBIN"_s, "OPTIX"_s }
+ };
+ bool useNormalCompileMode = true;
+ for (cm::string_view mode : compileModes) {
+ auto propName = cmStrCat("CUDA_", mode, "_COMPILATION");
+ auto defName = cmStrCat("_CMAKE_CUDA_", mode, "_FLAG");
+ if (this->GeneratorTarget->GetPropertyAsBool(propName)) {
+ const std::string& flag =
+ this->Makefile->GetRequiredDefinition(defName);
+ cudaCompileMode = cmStrCat(cudaCompileMode, flag);
+ useNormalCompileMode = false;
+ break;
+ }
+ }
+ if (useNormalCompileMode) {
const std::string& wholeFlag =
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_WHOLE_FLAG");
cudaCompileMode = cmStrCat(cudaCompileMode, wholeFlag);
@@ -1789,11 +1801,22 @@ void cmNinjaTargetGenerator::ExportObjectCompileCommand(
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_RDC_FLAG");
cudaCompileMode = cmStrCat(cudaCompileMode, rdcFlag, " ");
}
- if (this->GeneratorTarget->GetPropertyAsBool("CUDA_PTX_COMPILATION")) {
- const std::string& ptxFlag =
- this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_PTX_FLAG");
- cudaCompileMode = cmStrCat(cudaCompileMode, ptxFlag);
- } else {
+ static std::array<cm::string_view, 4> const compileModes{
+ { "PTX"_s, "CUBIN"_s, "FATBIN"_s, "OPTIX"_s }
+ };
+ bool useNormalCompileMode = true;
+ for (cm::string_view mode : compileModes) {
+ auto propName = cmStrCat("CUDA_", mode, "_COMPILATION");
+ auto defName = cmStrCat("_CMAKE_CUDA_", mode, "_FLAG");
+ if (this->GeneratorTarget->GetPropertyAsBool(propName)) {
+ const std::string& flag =
+ this->Makefile->GetRequiredDefinition(defName);
+ cudaCompileMode = cmStrCat(cudaCompileMode, flag);
+ useNormalCompileMode = false;
+ break;
+ }
+ }
+ if (useNormalCompileMode) {
const std::string& wholeFlag =
this->Makefile->GetRequiredDefinition("_CMAKE_CUDA_WHOLE_FLAG");
cudaCompileMode = cmStrCat(cudaCompileMode, wholeFlag);
diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h
index 06ac21ea21..52993b8708 100644
--- a/Source/cmPolicies.h
+++ b/Source/cmPolicies.h
@@ -441,7 +441,10 @@ class cmMakefile;
SELECT(POLICY, CMP0145, "The Dart and FindDart modules are removed.", 3, \
27, 0, cmPolicies::WARN) \
SELECT(POLICY, CMP0146, "The FindCUDA module is removed.", 3, 27, 0, \
- cmPolicies::WARN)
+ cmPolicies::WARN) \
+ SELECT(POLICY, CMP0147, \
+ "Visual Studio generators build custom commands in parallel.", 3, \
+ 27, 0, cmPolicies::WARN)
#define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
#define CM_FOR_EACH_POLICY_ID(POLICY) \
@@ -481,7 +484,9 @@ class cmMakefile;
F(CMP0131) \
F(CMP0142)
-#define CM_FOR_EACH_CUSTOM_COMMAND_POLICY(F) F(CMP0116)
+#define CM_FOR_EACH_CUSTOM_COMMAND_POLICY(F) \
+ F(CMP0116) \
+ F(CMP0147)
/** \class cmPolicies
* \brief Handles changes in CMake behavior and policies
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index ec872718a6..f06e26b50f 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -1775,6 +1775,9 @@ MAKE_PROP(COMPILE_FEATURES);
MAKE_PROP(COMPILE_OPTIONS);
MAKE_PROP(PRECOMPILE_HEADERS);
MAKE_PROP(PRECOMPILE_HEADERS_REUSE_FROM);
+MAKE_PROP(CUDA_CUBIN_COMPILATION);
+MAKE_PROP(CUDA_FATBIN_COMPILATION);
+MAKE_PROP(CUDA_OPTIX_COMPILATION);
MAKE_PROP(CUDA_PTX_COMPILATION);
MAKE_PROP(EXPORT_NAME);
MAKE_PROP(IMPORTED);
@@ -1910,14 +1913,38 @@ void cmTarget::StoreProperty(const std::string& prop, ValueType value)
value ? value
: std::string{})) { // NOLINT(bugprone-branch-clone)
/* error was reported by check method */
- } else if (prop == propCUDA_PTX_COMPILATION &&
- this->GetType() != cmStateEnums::OBJECT_LIBRARY) {
- std::ostringstream e;
- e << "CUDA_PTX_COMPILATION property can only be applied to OBJECT "
- "targets (\""
- << this->impl->Name << "\")\n";
- this->impl->Makefile->IssueMessage(MessageType::FATAL_ERROR, e.str());
- return;
+ } else if (prop == propCUDA_CUBIN_COMPILATION ||
+ prop == propCUDA_FATBIN_COMPILATION ||
+ prop == propCUDA_OPTIX_COMPILATION ||
+ prop == propCUDA_PTX_COMPILATION) {
+ auto const& compiler =
+ this->impl->Makefile->GetSafeDefinition("CMAKE_CUDA_COMPILER_ID");
+ auto const& compilerVersion =
+ this->impl->Makefile->GetSafeDefinition("CMAKE_CUDA_COMPILER_VERSION");
+ if (this->GetType() != cmStateEnums::OBJECT_LIBRARY) {
+ auto e =
+ cmStrCat(prop, " property can only be applied to OBJECT targets(",
+ this->impl->Name, ")\n");
+ this->impl->Makefile->IssueMessage(MessageType::FATAL_ERROR, e);
+ return;
+ }
+ const bool flag_found =
+ (prop == propCUDA_PTX_COMPILATION &&
+ this->impl->Makefile->GetDefinition("_CMAKE_CUDA_PTX_FLAG")) ||
+ (prop == propCUDA_CUBIN_COMPILATION &&
+ this->impl->Makefile->GetDefinition("_CMAKE_CUDA_CUBIN_FLAG")) ||
+ (prop == propCUDA_FATBIN_COMPILATION &&
+ this->impl->Makefile->GetDefinition("_CMAKE_CUDA_FATBIN_FLAG")) ||
+ (prop == propCUDA_OPTIX_COMPILATION &&
+ this->impl->Makefile->GetDefinition("_CMAKE_CUDA_OPTIX_FLAG"));
+ if (flag_found) {
+ this->impl->Properties.SetProperty(prop, value);
+ } else {
+ auto e = cmStrCat(prop, " property is not supported by ", compiler,
+ " compiler version ", compilerVersion, ".");
+ this->impl->Makefile->IssueMessage(MessageType::FATAL_ERROR, e);
+ return;
+ }
} else if (prop == propPRECOMPILE_HEADERS_REUSE_FROM) {
if (this->GetProperty("PRECOMPILE_HEADERS")) {
std::ostringstream e;
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index a669152b24..8926f9ed15 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -1810,10 +1810,15 @@ void cmVisualStudio10TargetGenerator::WriteCustomRule(
this->WriteCustomRuleCSharp(e0, c, name, script, additional_inputs.str(),
outputs.str(), comment, ccg);
} else {
- // FIXME(#18405): Enable BuildInParallel::Yes via an option or policy.
+ BuildInParallel buildInParallel = BuildInParallel::No;
+ if (command.GetCMP0147Status() == cmPolicies::NEW &&
+ !command.GetUsesTerminal() &&
+ !(command.HasMainDependency() && source->GetIsGenerated())) {
+ buildInParallel = BuildInParallel::Yes;
+ }
this->WriteCustomRuleCpp(*spe2, c, script, additional_inputs.str(),
outputs.str(), comment, ccg, symbolic,
- BuildInParallel::No);
+ buildInParallel);
}
}
}
@@ -3592,13 +3597,13 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions(
if (this->GeneratorTarget->GetPropertyAsBool("CUDA_SEPARABLE_COMPILATION")) {
cudaOptions.AddFlag("GenerateRelocatableDeviceCode", "true");
}
- bool notPtx = true;
+ bool notPtxLike = true;
if (this->GeneratorTarget->GetPropertyAsBool("CUDA_PTX_COMPILATION")) {
cudaOptions.AddFlag("NvccCompilation", "ptx");
// We drop the %(Extension) component as CMake expects all PTX files
// to not have the source file extension at all
cudaOptions.AddFlag("CompileOut", "$(IntDir)%(Filename).ptx");
- notPtx = false;
+ notPtxLike = false;
if (cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER_EQUAL,
cudaVersion, "9.0") &&
@@ -3613,9 +3618,24 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaOptions(
"%(BaseCommandLineTemplate) [CompileOut] [FastMath] "
"[Defines] \"%(FullPath)\"");
}
- }
-
- if (notPtx &&
+ } else if (this->GeneratorTarget->GetPropertyAsBool(
+ "CUDA_CUBIN_COMPILATION")) {
+ cudaOptions.AddFlag("NvccCompilation", "cubin");
+ cudaOptions.AddFlag("CompileOut", "$(IntDir)%(Filename).cubin");
+ notPtxLike = false;
+ } else if (this->GeneratorTarget->GetPropertyAsBool(
+ "CUDA_FATBIN_COMPILATION")) {
+ cudaOptions.AddFlag("NvccCompilation", "fatbin");
+ cudaOptions.AddFlag("CompileOut", "$(IntDir)%(Filename).fatbin");
+ notPtxLike = false;
+ } else if (this->GeneratorTarget->GetPropertyAsBool(
+ "CUDA_OPTIX_COMPILATION")) {
+ cudaOptions.AddFlag("NvccCompilation", "optix-ir");
+ cudaOptions.AddFlag("CompileOut", "$(IntDir)%(Filename).optixir");
+ notPtxLike = false;
+ }
+
+ if (notPtxLike &&
cmSystemTools::VersionCompareGreaterEq(
"8.0", this->GlobalGenerator->GetPlatformToolsetCudaString())) {
// Explicitly state that we want this file to be treated as a
diff --git a/Tests/CudaOnly/CMakeLists.txt b/Tests/CudaOnly/CMakeLists.txt
index db08076d26..aa25c4cb09 100644
--- a/Tests/CudaOnly/CMakeLists.txt
+++ b/Tests/CudaOnly/CMakeLists.txt
@@ -27,6 +27,9 @@ if(CMake_TEST_CUDA AND NOT CMake_TEST_CUDA STREQUAL "Clang")
# Only NVCC defines __CUDACC_DEBUG__ when compiling in debug mode.
add_cuda_test_macro(CudaOnly.GPUDebugFlag CudaOnlyGPUDebugFlag)
+ add_cuda_test_macro(CudaOnly.CUBIN CudaOnlyCUBIN)
+ add_cuda_test_macro(CudaOnly.Fatbin CudaOnlyFatbin)
+ add_cuda_test_macro(CudaOnly.OptixIR CudaOnlyOptixIR)
endif()
add_cuda_test_macro(CudaOnly.DeviceLTO CudaOnlyDeviceLTO)
diff --git a/Tests/CudaOnly/CUBIN/CMakeLists.txt b/Tests/CudaOnly/CUBIN/CMakeLists.txt
new file mode 100644
index 0000000000..464714bbba
--- /dev/null
+++ b/Tests/CudaOnly/CUBIN/CMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required(VERSION 3.18)
+project(CudaCUBIN LANGUAGES CUDA)
+
+
+set(CMAKE_CUDA_ARCHITECTURES all-major)
+
+add_library(CudaCUBIN OBJECT kernelA.cu kernelB.cu kernelC.cu)
+set_property(TARGET CudaCUBIN PROPERTY CUDA_CUBIN_COMPILATION ON)
+set_property(TARGET CudaCUBIN PROPERTY CUDA_ARCHITECTURES native)
+
+add_executable(CudaOnlyCUBIN main.cu)
+target_compile_features(CudaOnlyCUBIN PRIVATE cuda_std_11)
+target_compile_definitions(CudaOnlyCUBIN PRIVATE "CUBIN_FILE_PATHS=\"$<JOIN:$<TARGET_OBJECTS:CudaCUBIN>,~_~>\"")
+
+find_package(CUDAToolkit REQUIRED)
+target_link_libraries(CudaOnlyCUBIN PRIVATE CUDA::cuda_driver)
+
+if(APPLE)
+ # Help the static cuda runtime find the driver (libcuda.dyllib) at runtime.
+ set_property(TARGET CudaOnlyCUBIN PROPERTY BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})
+endif()
diff --git a/Tests/CudaOnly/CUBIN/kernelA.cu b/Tests/CudaOnly/CUBIN/kernelA.cu
new file mode 100644
index 0000000000..fbe0d26d70
--- /dev/null
+++ b/Tests/CudaOnly/CUBIN/kernelA.cu
@@ -0,0 +1,7 @@
+
+__global__ void kernelA(float* r, float* x, float* y, float* z, int size)
+{
+ for (int i = threadIdx.x; i < size; i += blockDim.x) {
+ r[i] = x[i] * y[i] + z[i];
+ }
+}
diff --git a/Tests/CudaOnly/CUBIN/kernelB.cu b/Tests/CudaOnly/CUBIN/kernelB.cu
new file mode 100644
index 0000000000..74782532b9
--- /dev/null
+++ b/Tests/CudaOnly/CUBIN/kernelB.cu
@@ -0,0 +1,7 @@
+
+__global__ void kernelB(float* r, float* x, float* y, float* z, int size)
+{
+ for (int i = threadIdx.x; i < size; i += blockDim.x) {
+ r[i] = x[i] * y[i] + z[i];
+ }
+}
diff --git a/Tests/CudaOnly/CUBIN/kernelC.cu b/Tests/CudaOnly/CUBIN/kernelC.cu
new file mode 100644
index 0000000000..5f8a0ce93d
--- /dev/null
+++ b/Tests/CudaOnly/CUBIN/kernelC.cu
@@ -0,0 +1,7 @@
+
+__global__ void kernelC(float* r, float* x, float* y, float* z, int size)
+{
+ for (int i = threadIdx.x; i < size; i += blockDim.x) {
+ r[i] = x[i] * y[i] + z[i];
+ }
+}
diff --git a/Tests/CudaOnly/CUBIN/main.cu b/Tests/CudaOnly/CUBIN/main.cu
new file mode 100644
index 0000000000..da5249c8c5
--- /dev/null
+++ b/Tests/CudaOnly/CUBIN/main.cu
@@ -0,0 +1,56 @@
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include <cuda.h>
+
+#define GENERATED_HEADER(x) GENERATED_HEADER1(x)
+#define GENERATED_HEADER1(x) <x>
+
+static std::string input_paths = { CUBIN_FILE_PATHS };
+
+int main()
+{
+ const std::string delimiter = "~_~";
+ input_paths += delimiter;
+
+ size_t end = 0;
+ size_t previous_end = 0;
+ std::vector<std::string> actual_paths;
+ while ((end = input_paths.find(delimiter, previous_end)) !=
+ std::string::npos) {
+ actual_paths.emplace_back(
+ input_paths.substr(previous_end, end - previous_end));
+ previous_end = end + 3;
+ }
+
+ cuInit(0);
+ int count = 0;
+ cuDeviceGetCount(&count);
+ if (count == 0) {
+ std::cerr << "No CUDA devices found\n";
+ return 1;
+ }
+
+ CUdevice device;
+ cuDeviceGet(&device, 0);
+
+ CUcontext context;
+ cuCtxCreate(&context, 0, device);
+
+ CUmodule module;
+ for (auto p : actual_paths) {
+ if (p.find(".cubin") == std::string::npos) {
+ std::cout << p << " Doesn't have the .cubin suffix" << p << std::endl;
+ return 1;
+ }
+ std::cout << "trying to load cubin: " << p << std::endl;
+ CUresult result = cuModuleLoad(&module, p.c_str());
+ std::cout << "module pointer: " << module << '\n';
+ if (result != CUDA_SUCCESS || module == nullptr) {
+ std::cerr << "Failed to load the embedded cubin with error: "
+ << static_cast<unsigned int>(result) << '\n';
+ return 1;
+ }
+ }
+}
diff --git a/Tests/CudaOnly/Fatbin/CMakeLists.txt b/Tests/CudaOnly/Fatbin/CMakeLists.txt
new file mode 100644
index 0000000000..db0dc227e0
--- /dev/null
+++ b/Tests/CudaOnly/Fatbin/CMakeLists.txt
@@ -0,0 +1,25 @@
+cmake_minimum_required(VERSION 3.18)
+project(CudaFATBIN LANGUAGES CUDA)
+
+
+set(CMAKE_CUDA_ARCHITECTURES all-major)
+
+add_library(CudaFATBIN OBJECT
+${CMAKE_CURRENT_SOURCE_DIR}/../CUBIN/kernelA.cu
+${CMAKE_CURRENT_SOURCE_DIR}/../CUBIN/kernelB.cu
+${CMAKE_CURRENT_SOURCE_DIR}/../CUBIN/kernelC.cu)
+
+set_property(TARGET CudaFATBIN PROPERTY CUDA_FATBIN_COMPILATION ON)
+
+# Will use `cuModuleLoadFatBinary` to load the fatbinaries
+add_executable(CudaOnlyFatbin main.cu)
+target_compile_features(CudaOnlyFatbin PRIVATE cuda_std_11)
+target_compile_definitions(CudaOnlyFatbin PRIVATE "FATBIN_FILE_PATHS=\"$<JOIN:$<TARGET_OBJECTS:CudaFATBIN>,~_~>\"")
+
+find_package(CUDAToolkit REQUIRED)
+target_link_libraries(CudaOnlyFatbin PRIVATE CUDA::cuda_driver)
+
+if(APPLE)
+ # Help the static cuda runtime find the driver (libcuda.dyllib) at runtime.
+ set_property(TARGET CudaOnlyFatbin PROPERTY BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})
+endif()
diff --git a/Tests/CudaOnly/Fatbin/main.cu b/Tests/CudaOnly/Fatbin/main.cu
new file mode 100644
index 0000000000..903feee6be
--- /dev/null
+++ b/Tests/CudaOnly/Fatbin/main.cu
@@ -0,0 +1,56 @@
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include <cuda.h>
+
+#define GENERATED_HEADER(x) GENERATED_HEADER1(x)
+#define GENERATED_HEADER1(x) <x>
+
+static std::string input_paths = { FATBIN_FILE_PATHS };
+
+int main()
+{
+ const std::string delimiter = "~_~";
+ input_paths += delimiter;
+
+ size_t end = 0;
+ size_t previous_end = 0;
+ std::vector<std::string> actual_paths;
+ while ((end = input_paths.find(delimiter, previous_end)) !=
+ std::string::npos) {
+ actual_paths.emplace_back(
+ input_paths.substr(previous_end, end - previous_end));
+ previous_end = end + 3;
+ }
+
+ cuInit(0);
+ int count = 0;
+ cuDeviceGetCount(&count);
+ if (count == 0) {
+ std::cerr << "No CUDA devices found\n";
+ return 1;
+ }
+
+ CUdevice device;
+ cuDeviceGet(&device, 0);
+
+ CUcontext context;
+ cuCtxCreate(&context, 0, device);
+
+ CUmodule module;
+ for (auto p : actual_paths) {
+ if (p.find(".fatbin") == std::string::npos) {
+ std::cout << p << " Doesn't have the .fatbin suffix" << p << std::endl;
+ return 1;
+ }
+ std::cout << "trying to load fatbin: " << p << std::endl;
+ CUresult result = cuModuleLoad(&module, p.c_str());
+ std::cout << "module pointer: " << module << '\n';
+ if (result != CUDA_SUCCESS || module == nullptr) {
+ std::cerr << "Failed to load the embedded fatbin with error: "
+ << static_cast<unsigned int>(result) << '\n';
+ return 1;
+ }
+ }
+}
diff --git a/Tests/CudaOnly/OptixIR/CMakeLists.txt b/Tests/CudaOnly/OptixIR/CMakeLists.txt
new file mode 100644
index 0000000000..afeabdade7
--- /dev/null
+++ b/Tests/CudaOnly/OptixIR/CMakeLists.txt
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 3.18)
+project(CudaOptix LANGUAGES CUDA)
+
+
+set(CMAKE_CUDA_ARCHITECTURES all-major)
+
+add_library(CudaOptix OBJECT
+ ${CMAKE_CURRENT_SOURCE_DIR}/../CUBIN/kernelA.cu
+ ${CMAKE_CURRENT_SOURCE_DIR}/../CUBIN/kernelB.cu
+ ${CMAKE_CURRENT_SOURCE_DIR}/../CUBIN/kernelC.cu)
+
+if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL "11.7.0")
+ set_property(TARGET CudaOptix PROPERTY CUDA_OPTIX_COMPILATION ON)
+endif()
+
+set_property(TARGET CudaOptix PROPERTY CUDA_ARCHITECTURES native)
+
+add_executable(CudaOnlyOptixIR main.cu)
+target_compile_features(CudaOnlyOptixIR PRIVATE cuda_std_11)
+
+if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL "11.7.0")
+ target_compile_definitions(CudaOnlyOptixIR PRIVATE "OPTIX_FILE_PATHS=\"$<JOIN:$<TARGET_OBJECTS:CudaOptix>,~_~>\"")
+else()
+ target_compile_definitions(CudaOnlyOptixIR PRIVATE "OPTIX_FILE_PATHS=\"NO_OPTIX_SUPPORT\"")
+endif()
+
+find_package(CUDAToolkit REQUIRED)
+target_link_libraries(CudaOnlyOptixIR PRIVATE CUDA::cuda_driver)
+
+if(APPLE)
+ # Help the static cuda runtime find the driver (libcuda.dyllib) at runtime.
+ set_property(TARGET CudaOnlyOptixIR PROPERTY BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})
+endif()
diff --git a/Tests/CudaOnly/OptixIR/main.cu b/Tests/CudaOnly/OptixIR/main.cu
new file mode 100644
index 0000000000..c79829b297
--- /dev/null
+++ b/Tests/CudaOnly/OptixIR/main.cu
@@ -0,0 +1,53 @@
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include <cuda.h>
+
+#define GENERATED_HEADER(x) GENERATED_HEADER1(x)
+#define GENERATED_HEADER1(x) <x>
+
+static std::string input_paths = { OPTIX_FILE_PATHS };
+
+int main()
+{
+ if (input_paths == "NO_OPTIX_SUPPORT") {
+ return 0;
+ }
+
+ const std::string delimiter = "~_~";
+ input_paths += delimiter;
+
+ size_t end = 0;
+ size_t previous_end = 0;
+ std::vector<std::string> actual_paths;
+ while ((end = input_paths.find(delimiter, previous_end)) !=
+ std::string::npos) {
+ actual_paths.emplace_back(
+ input_paths.substr(previous_end, end - previous_end));
+ previous_end = end + 3;
+ }
+
+ if (actual_paths.empty()) {
+ std::cerr << "Failed to parse OPTIX_FILE_PATHS" << std::endl;
+ return 1;
+ }
+
+ const std::uint32_t optix_magic_value = 0x7f4e43ed;
+ for (auto p : actual_paths) {
+ if (p.find(".optixir") == std::string::npos) {
+ std::cout << p << " Doesn't have the .optixir suffix" << p << std::endl;
+ return 1;
+ }
+ std::ifstream input(p, std::ios::binary);
+ std::uint32_t value;
+ input.read(reinterpret_cast<char*>(&value), sizeof(value));
+ if (value != optix_magic_value) {
+ std::cerr << p << " Doesn't look like an optix-ir file" << std::endl;
+ return 1;
+ }
+ }
+
+ return 0;
+}
diff --git a/Tests/EnforceConfig.cmake.in b/Tests/EnforceConfig.cmake.in
index 61be40b6a6..a652efcd0a 100644
--- a/Tests/EnforceConfig.cmake.in
+++ b/Tests/EnforceConfig.cmake.in
@@ -35,5 +35,8 @@ unset(ENV{CMAKE_GENERATOR_PLATFORM})
unset(ENV{CMAKE_GENERATOR_TOOLSET})
unset(ENV{CMAKE_EXPORT_COMPILE_COMMANDS})
+# Verify that our module implementations do not recurse too much.
+set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} 100)
+
@TEST_HOME_ENV_CODE@
@TEST_WARN_VS_CODE@
diff --git a/Tests/FindOpenGL/Test/CMakeLists.txt b/Tests/FindOpenGL/Test/CMakeLists.txt
index 9004a9860b..7c805c0c5f 100644
--- a/Tests/FindOpenGL/Test/CMakeLists.txt
+++ b/Tests/FindOpenGL/Test/CMakeLists.txt
@@ -44,28 +44,115 @@ else()
add_test(NAME test_comp_glx_novnd COMMAND test_comp_glx_novnd)
endif()
-# EGL is only available on Linux+GLVND at present.
-if(OpenGL_TEST_VND)
- find_package(OpenGL COMPONENTS OpenGL EGL)
- if(OpenGL_EGL_FOUND)
- add_executable(test_comp_egl main.c)
- target_link_libraries(test_comp_egl PRIVATE OpenGL::OpenGL OpenGL::EGL)
- add_test(NAME test_comp_egl COMMAND test_comp_egl)
- # EGL-only code should not link to GLX.
- execute_process(COMMAND ldd test_comp_egl
- OUTPUT_VARIABLE LDD_OUT
- ERROR_VARIABLE LDD_ERR)
- if("${LDD_OUT}" MATCHES "GLX")
- message(FATAL_ERROR "EGL-only code links to GLX!")
- endif()
+find_package(OpenGL COMPONENTS OpenGL EGL)
+if(OpenGL_EGL_FOUND)
+ add_executable(test_comp_egl main.c)
+ target_link_libraries(test_comp_egl PRIVATE OpenGL::OpenGL OpenGL::EGL)
+ add_test(NAME test_comp_egl COMMAND test_comp_egl)
+ # EGL-only code should not link to GLX.
+ get_target_property(iface_libs OpenGL::EGL INTERFACE_LINK_LIBRARIES)
+ if(iface_libs MATCHES "GLX")
+ message(FATAL_ERROR "EGL-only code links to GLX!")
+ endif()
+endif()
+
+# all three COMPONENTS together.
+find_package(OpenGL COMPONENTS OpenGL EGL GLX)
+if(OpenGL_EGL_FOUND AND OpenGL_GLX_FOUND)
+ add_executable(test_comp_both main.c)
+ target_link_libraries(test_comp_both PRIVATE OpenGL::OpenGL OpenGL::EGL
+ OpenGL::GLX)
+ add_test(NAME test_comp_both COMMAND test_comp_both)
+endif()
+
+find_package(OpenGL COMPONENTS GLES2)
+if(OpenGL_GLES2_FOUND)
+ add_executable(test_comp_gles2 main_gles2.c)
+ target_link_libraries(test_comp_gles2 PRIVATE OpenGL::GLES2)
+ add_test(NAME test_comp_gles2 COMMAND test_comp_gles2)
+ # GLES2-only code should not link to OpenGL
+ get_target_property(iface_libs test_comp_gles2 LINK_LIBRARIES)
+ if(iface_libs MATCHES "OpenGL::OpenGL")
+ message(FATAL_ERROR "GLES2-only code links to OpenGL!")
endif()
+endif()
+
+# GLES2 and EGL together.
+find_package(OpenGL COMPONENTS GLES2 EGL)
+if(OpenGL_GLES2_FOUND AND OpenGL_EGL_FOUND)
+ add_executable(test_comp_gles2_egl main_gles2.c)
+ target_link_libraries(test_comp_gles2_egl PRIVATE OpenGL::GLES2
+ OpenGL::EGL)
+ add_test(NAME test_comp_gles2_egl COMMAND test_comp_gles2_egl)
+ # GLES2-EGL-only code should not link to OpenGL or GLX
+ get_target_property(iface_libs test_comp_gles2_egl LINK_LIBRARIES)
+ if(iface_libs MATCHES "OpenGL::OpenGL")
+ message(FATAL_ERROR "GLES2-only code links to OpenGL!")
+ endif()
+ if(iface_libs MATCHES "GLX")
+ message(FATAL_ERROR "GLES2-EGL-only code links to GLX!")
+ endif()
+endif()
- # all three COMPONENTS together.
- find_package(OpenGL COMPONENTS OpenGL EGL GLX)
- if(OpenGL_EGL_FOUND AND OpenGL_GLX_FOUND)
- add_executable(test_comp_both main.c)
- target_link_libraries(test_comp_both PRIVATE OpenGL::OpenGL OpenGL::EGL
- OpenGL::GLX)
- add_test(NAME test_comp_both COMMAND test_comp_both)
+# GLES2 and GLX together.
+find_package(OpenGL COMPONENTS GLES2 GLX)
+if(OpenGL_GLES2_FOUND AND OpenGL_GLX_FOUND)
+ add_executable(test_comp_gles2_glx main_gles2.c)
+ target_link_libraries(test_comp_gles2_glx PRIVATE OpenGL::GLES2
+ OpenGL::GLX)
+ add_test(NAME test_comp_gles2_glx COMMAND test_comp_gles2_glx)
+ # GLES2-GLX-only code should not link to OpenGL or EGL
+ get_target_property(iface_libs test_comp_gles2_glx LINK_LIBRARIES)
+ if(iface_libs MATCHES "OpenGL::OpenGL")
+ message(FATAL_ERROR "GLES2-only code links to OpenGL!")
+ endif()
+ if(iface_libs MATCHES "EGL")
+ message(FATAL_ERROR "GLES2-GLX-only code links to EGL!")
+ endif()
+endif()
+
+find_package(OpenGL COMPONENTS GLES3)
+if(OpenGL_GLES3_FOUND)
+ add_executable(test_comp_gles3 main_gles3.c)
+ target_link_libraries(test_comp_gles3 PRIVATE OpenGL::GLES3)
+ add_test(NAME test_comp_gles3 COMMAND test_comp_gles3)
+ # GLES3-only code should not link to OpenGL.
+ get_target_property(iface_libs test_comp_gles3 LINK_LIBRARIES)
+ if(iface_libs MATCHES "OpenGL::OpenGL")
+ message(FATAL_ERROR "GLES3-only code links to OpenGL!")
+ endif()
+endif()
+
+# GLES3 and EGL together.
+find_package(OpenGL COMPONENTS GLES3 EGL)
+if(OpenGL_GLES3_FOUND AND OpenGL_EGL_FOUND)
+ add_executable(test_comp_gles3_egl main_gles3.c)
+ target_link_libraries(test_comp_gles3_egl PRIVATE OpenGL::GLES3
+ OpenGL::EGL)
+ add_test(NAME test_comp_gles3_egl COMMAND test_comp_gles3_egl)
+ # GLES3-EGL-only code should not link to OpenGL or GLX
+ get_target_property(iface_libs test_comp_gles3_egl LINK_LIBRARIES)
+ if(iface_libs MATCHES "OpenGL::OpenGL")
+ message(FATAL_ERROR "GLES3-only code links to OpenGL!")
+ endif()
+ if(iface_libs MATCHES "GLX")
+ message(FATAL_ERROR "GLES3-EGL-only code links to GLX!")
+ endif()
+endif()
+
+# GLES3 and GLX together.
+find_package(OpenGL COMPONENTS GLES3 GLX)
+if(OpenGL_GLES3_FOUND AND OpenGL_GLX_FOUND)
+ add_executable(test_comp_gles3_glx main_gles3.c)
+ target_link_libraries(test_comp_gles3_glx PRIVATE OpenGL::GLES3
+ OpenGL::GLX)
+ add_test(NAME test_comp_gles3_glx COMMAND test_comp_gles3_glx)
+ # GLESr-GLX-only code should not link to OpenGL or EGL
+ get_target_property(iface_libs test_comp_gles3_glx LINK_LIBRARIES)
+ if(iface_libs MATCHES "OpenGL::OpenGL")
+ message(FATAL_ERROR "GLES3-only code links to OpenGL!")
+ endif()
+ if(iface_libs MATCHES "EGL")
+ message(FATAL_ERROR "GLES3-GLX-only code links to EGL!")
endif()
endif()
diff --git a/Tests/FindOpenGL/Test/main_gles2.c b/Tests/FindOpenGL/Test/main_gles2.c
new file mode 100644
index 0000000000..52f5936089
--- /dev/null
+++ b/Tests/FindOpenGL/Test/main_gles2.c
@@ -0,0 +1,17 @@
+#ifdef _WIN32
+# error "GLES2 cannot be tested on WIN32 platforms."
+#endif
+#ifdef __APPLE__
+# error "GLES2 cannot be tested on macOS platform."
+#else
+# include <GLES2/gl2.h>
+#endif
+
+#include <stdio.h>
+
+int main()
+{
+ /* Reference a GL symbol without requiring a context at runtime. */
+ printf("&glGetString = %p\n", &glGetString);
+ return 0;
+}
diff --git a/Tests/FindOpenGL/Test/main_gles3.c b/Tests/FindOpenGL/Test/main_gles3.c
new file mode 100644
index 0000000000..875f73c992
--- /dev/null
+++ b/Tests/FindOpenGL/Test/main_gles3.c
@@ -0,0 +1,17 @@
+#ifdef _WIN32
+# error "GLES3 cannot be tested on WIN32 platforms."
+#endif
+#ifdef __APPLE__
+# error "GLES3 cannot be tested on macOS platform."
+#else
+# include <GLES3/gl3.h>
+#endif
+
+#include <stdio.h>
+
+int main()
+{
+ /* Reference a GL symbol without requiring a context at runtime. */
+ printf("&glGetString = %p\n", &glGetString);
+ return 0;
+}
diff --git a/Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagC.cmake b/Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagC.cmake
index 276158ce07..64a961ef77 100644
--- a/Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagC.cmake
+++ b/Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagC.cmake
@@ -18,6 +18,15 @@ if(CMAKE_C_COMPILER_ID MATCHES "GNU|LCC|Clang" AND NOT "x${CMAKE_C_SIMULATE_ID}"
if(NOT SHOULD_WORK)
message(SEND_ERROR "${CMAKE_C_COMPILER_ID} compiler flag '-x c' check failed")
endif()
+
+ block()
+ # Test tolerating a flag that is not used when driving the linker.
+ string(APPEND CMAKE_C_FLAGS " -nostdinc")
+ check_compiler_flag(C "-x c" SHOULD_WORK_NOSTDINC)
+ if(NOT SHOULD_WORK_NOSTDINC)
+ message(SEND_ERROR "${CMAKE_C_COMPILER_ID} compiler flag '-x c -nostdinc' check failed")
+ endif()
+ endblock()
endif()
if(CMAKE_C_COMPILER_ID STREQUAL "GNU") # LCC C compiler silently ignore -frtti instead of failing, so skip it here.
diff --git a/Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagCXX.cmake b/Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagCXX.cmake
index dec31ec3ae..0026a2a10e 100644
--- a/Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagCXX.cmake
+++ b/Tests/RunCMake/CheckCompilerFlag/CheckCompilerFlagCXX.cmake
@@ -18,6 +18,15 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|LCC|Clang" AND NOT "x${CMAKE_CXX_SIMULATE_
if(NOT SHOULD_WORK)
message(SEND_ERROR "${CMAKE_CXX_COMPILER_ID} compiler flag '-x c++' check failed")
endif()
+
+ block()
+ # Test tolerating a flag that is not used when driving the linker.
+ string(APPEND CMAKE_CXX_FLAGS " -nostdinc++")
+ check_compiler_flag(CXX "-x c++" SHOULD_WORK_NOSTDINCXX)
+ if(NOT SHOULD_WORK_NOSTDINCXX)
+ message(SEND_ERROR "${CMAKE_CXX_COMPILER_ID} compiler flag '-x c++ -nostdinc++' check failed")
+ endif()
+ endblock()
endif()
if(NOT "$ENV{LC_ALL}" STREQUAL "BAD")
diff --git a/Tests/RunCMake/MaxRecursionDepth/RunCMakeTest.cmake b/Tests/RunCMake/MaxRecursionDepth/RunCMakeTest.cmake
index c5a859d877..fdf418f955 100644
--- a/Tests/RunCMake/MaxRecursionDepth/RunCMakeTest.cmake
+++ b/Tests/RunCMake/MaxRecursionDepth/RunCMakeTest.cmake
@@ -1,26 +1,42 @@
include(RunCMake)
include(RunCTest)
-function(run_cmake_recursive name)
- set(RunCMake_TEST_OPTIONS "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name})
- run_cmake(${name}-default)
- unset(RunCMake_TEST_OPTIONS)
- set(RunCMake_TEST_OPTIONS "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -DCMAKE_MAXIMUM_RECURSION_DEPTH=10)
- run_cmake(${name}-var)
- unset(RunCMake_TEST_OPTIONS)
- set(RunCMake_TEST_OPTIONS "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -DCMAKE_MAXIMUM_RECURSION_DEPTH=a)
- run_cmake(${name}-invalid-var)
- unset(RunCMake_TEST_OPTIONS)
+# Isolate this test from the caller's environment.
+unset(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH})
+function(run_cmake_recursive name)
+ run_cmake_with_options(${name}-default "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name})
run_cmake_command(${name}-default-script ${CMAKE_COMMAND} "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -P "${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt")
+
+ set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} 5) # overridden, not used
+ run_cmake_with_options(${name}-var "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -DCMAKE_MAXIMUM_RECURSION_DEPTH=10)
+ run_cmake_with_options(${name}-invalid-var "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -DCMAKE_MAXIMUM_RECURSION_DEPTH=a)
run_cmake_command(${name}-var-script ${CMAKE_COMMAND} "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -DCMAKE_MAXIMUM_RECURSION_DEPTH=10 -P "${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt")
run_cmake_command(${name}-invalid-var-script ${CMAKE_COMMAND} "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -DCMAKE_MAXIMUM_RECURSION_DEPTH=a -P "${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt")
+
+ set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} 10)
+ run_cmake_with_options(${name}-env "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name})
+ run_cmake_command(${name}-env-script ${CMAKE_COMMAND} "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -P "${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt")
+
+ set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} a)
+ run_cmake_with_options(${name}-invalid-env "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name})
+ run_cmake_command(${name}-invalid-env-script ${CMAKE_COMMAND} "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -P "${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt")
+
+ unset(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH})
endfunction()
function(run_ctest_recursive name)
run_ctest(${name}-default "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name})
run_ctest(${name}-var "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -DCMAKE_MAXIMUM_RECURSION_DEPTH=10)
run_ctest(${name}-invalid-var "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name} -DCMAKE_MAXIMUM_RECURSION_DEPTH=a)
+
+ set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} 10)
+ run_ctest(${name}-env "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name})
+
+ set(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH} a)
+ run_ctest(${name}-invalid-env "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=${name})
+
+ unset(ENV{CMAKE_MAXIMUM_RECURSION_DEPTH})
endfunction()
run_cmake_recursive(function)
@@ -32,12 +48,8 @@ run_cmake_recursive(variable_watch)
# We run these tests separately and only with a small limit because they are
# taxing and slow. The "implicit" and "invalid" cases are already thoroughly
# covered by the other tests above.
-set(RunCMake_TEST_OPTIONS "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=add_subdirectory -DCMAKE_MAXIMUM_RECURSION_DEPTH=10)
-run_cmake(add_subdirectory-var)
-unset(RunCMake_TEST_OPTIONS)
-set(RunCMake_TEST_OPTIONS "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=try_compile -DCMAKE_MAXIMUM_RECURSION_DEPTH=10)
-run_cmake(try_compile-var)
-unset(RunCMake_TEST_OPTIONS)
+run_cmake_with_options(add_subdirectory-var "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=add_subdirectory -DCMAKE_MAXIMUM_RECURSION_DEPTH=10)
+run_cmake_with_options(try_compile-var "-DCMAKE_MODULE_PATH=${CMAKE_CURRENT_LIST_DIR}" -DTEST_NAME=try_compile -DCMAKE_MAXIMUM_RECURSION_DEPTH=10)
run_ctest_recursive(ctest_read_custom_files)
diff --git a/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env-result.txt
new file mode 100644
index 0000000000..b57e2deb77
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env-stderr.txt
new file mode 100644
index 0000000000..b664fa04f9
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env-stderr.txt
@@ -0,0 +1,34 @@
+^2
+3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:1 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
+ .*/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-env/test\.cmake:10 \(ctest_read_custom_files\)
+
+
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake
+Problem reading custom configuration: .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake$
diff --git a/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-invalid-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-invalid-env-result.txt
new file mode 100644
index 0000000000..b57e2deb77
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-invalid-env-result.txt
@@ -0,0 +1 @@
+(-1|255)
diff --git a/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-invalid-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-invalid-env-stderr.txt
new file mode 100644
index 0000000000..7dbbb3e72d
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/ctest_read_custom_files-invalid-env-stderr.txt
@@ -0,0 +1,5 @@
+[0-9]+
+CMake Error at .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:1 \(message\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ .*/Tests/RunCMake/MaxRecursionDepth/CTestCustom\.cmake:3 \(ctest_read_custom_files\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-default-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-default-script-stderr.txt
index b8557ab645..4e965e8eb6 100644
--- a/Tests/RunCMake/MaxRecursionDepth/find_package-default-script-stderr.txt
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-default-script-stderr.txt
@@ -1,5 +1,7 @@
[0-9]+
-CMake Error at .*/FindRecursivePackage\.cmake:1 \(message\):
- Maximum recursion depth of [0-9]+ exceeded
+CMake Error at [^
+]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\):
+ find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
- .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ [^
+]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-default-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-default-stderr.txt
index 5d31e295b0..0119953adb 100644
--- a/Tests/RunCMake/MaxRecursionDepth/find_package-default-stderr.txt
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-default-stderr.txt
@@ -1,5 +1,5 @@
[0-9]+
-CMake Error at FindRecursivePackage\.cmake:1 \(message\):
- Maximum recursion depth of [0-9]+ exceeded
+CMake Error at FindRecursivePackage.cmake:[0-9]+ \(find_package\):
+ find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
- FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage.cmake:[0-9]+ \(find_package\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-env-script-stderr.txt
new file mode 100644
index 0000000000..53145515a5
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-env-script-stderr.txt
@@ -0,0 +1,21 @@
+^3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at .*/FindRecursivePackage\.cmake:1 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ .*/find_package\.cmake:2 \(find_package\)
+ .*/CMakeLists\.txt:5 \(include\)$
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-env-stderr.txt
new file mode 100644
index 0000000000..b47a13a175
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-env-stderr.txt
@@ -0,0 +1,21 @@
+^3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at FindRecursivePackage\.cmake:1 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage\.cmake:3 \(find_package\)
+ find_package\.cmake:2 \(find_package\)
+ CMakeLists\.txt:5 \(include\)$
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-script-stderr.txt
new file mode 100644
index 0000000000..4e965e8eb6
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-script-stderr.txt
@@ -0,0 +1,7 @@
+[0-9]+
+CMake Error at [^
+]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\):
+ find_package maximum nesting depth of [0-9]+ exceeded.
+Call Stack \(most recent call first\):
+ [^
+]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-stderr.txt
new file mode 100644
index 0000000000..0119953adb
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-env-stderr.txt
@@ -0,0 +1,5 @@
+[0-9]+
+CMake Error at FindRecursivePackage.cmake:[0-9]+ \(find_package\):
+ find_package maximum nesting depth of [0-9]+ exceeded.
+Call Stack \(most recent call first\):
+ FindRecursivePackage.cmake:[0-9]+ \(find_package\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-script-stderr.txt
index b8557ab645..4e965e8eb6 100644
--- a/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-script-stderr.txt
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-script-stderr.txt
@@ -1,5 +1,7 @@
[0-9]+
-CMake Error at .*/FindRecursivePackage\.cmake:1 \(message\):
- Maximum recursion depth of [0-9]+ exceeded
+CMake Error at [^
+]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\):
+ find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
- .*/FindRecursivePackage\.cmake:3 \(find_package\)
+ [^
+]*/Tests/RunCMake/MaxRecursionDepth/FindRecursivePackage.cmake:[0-9]+ \(find_package\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-stderr.txt
index 5d31e295b0..0119953adb 100644
--- a/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-stderr.txt
+++ b/Tests/RunCMake/MaxRecursionDepth/find_package-invalid-var-stderr.txt
@@ -1,5 +1,5 @@
[0-9]+
-CMake Error at FindRecursivePackage\.cmake:1 \(message\):
- Maximum recursion depth of [0-9]+ exceeded
+CMake Error at FindRecursivePackage.cmake:[0-9]+ \(find_package\):
+ find_package maximum nesting depth of [0-9]+ exceeded.
Call Stack \(most recent call first\):
- FindRecursivePackage\.cmake:3 \(find_package\)
+ FindRecursivePackage.cmake:[0-9]+ \(find_package\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/function-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/function-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/function-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/function-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/function-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/function-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/function-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/function-env-script-stderr.txt
new file mode 100644
index 0000000000..61304b13f7
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/function-env-script-stderr.txt
@@ -0,0 +1,21 @@
+^3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at .*/function\.cmake:2 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ .*/function\.cmake:4 \(recursive\)
+ .*/function\.cmake:4 \(recursive\)
+ .*/function\.cmake:4 \(recursive\)
+ .*/function\.cmake:4 \(recursive\)
+ .*/function\.cmake:4 \(recursive\)
+ .*/function\.cmake:4 \(recursive\)
+ .*/function\.cmake:4 \(recursive\)
+ .*/function\.cmake:4 \(recursive\)
+ .*/function\.cmake:7 \(recursive\)
+ .*/CMakeLists\.txt:5 \(include\)$
diff --git a/Tests/RunCMake/MaxRecursionDepth/function-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/function-env-stderr.txt
new file mode 100644
index 0000000000..54e72aff4b
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/function-env-stderr.txt
@@ -0,0 +1,21 @@
+^3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at function\.cmake:2 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ function\.cmake:4 \(recursive\)
+ function\.cmake:4 \(recursive\)
+ function\.cmake:4 \(recursive\)
+ function\.cmake:4 \(recursive\)
+ function\.cmake:4 \(recursive\)
+ function\.cmake:4 \(recursive\)
+ function\.cmake:4 \(recursive\)
+ function\.cmake:4 \(recursive\)
+ function\.cmake:7 \(recursive\)
+ CMakeLists\.txt:5 \(include\)$
diff --git a/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-script-stderr.txt
new file mode 100644
index 0000000000..92de1fb3c7
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-script-stderr.txt
@@ -0,0 +1,5 @@
+[0-9]+
+CMake Error at .*/function\.cmake:2 \(message\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ .*/function\.cmake:4 \(recursive\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-stderr.txt
new file mode 100644
index 0000000000..5c25c4b129
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/function-invalid-env-stderr.txt
@@ -0,0 +1,5 @@
+[0-9]+
+CMake Error at function\.cmake:2 \(message\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ function\.cmake:4 \(recursive\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/include-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/include-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/include-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/include-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/include-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/include-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/include-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/include-env-script-stderr.txt
new file mode 100644
index 0000000000..f55f50536f
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/include-env-script-stderr.txt
@@ -0,0 +1,21 @@
+^3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at .*/include_recursive\.cmake:1 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ .*/include_recursive\.cmake:3 \(include\)
+ .*/include_recursive\.cmake:3 \(include\)
+ .*/include_recursive\.cmake:3 \(include\)
+ .*/include_recursive\.cmake:3 \(include\)
+ .*/include_recursive\.cmake:3 \(include\)
+ .*/include_recursive\.cmake:3 \(include\)
+ .*/include_recursive\.cmake:3 \(include\)
+ .*/include_recursive\.cmake:3 \(include\)
+ .*/include\.cmake:2 \(include\)
+ .*/CMakeLists\.txt:5 \(include\)$
diff --git a/Tests/RunCMake/MaxRecursionDepth/include-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/include-env-stderr.txt
new file mode 100644
index 0000000000..ff33985045
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/include-env-stderr.txt
@@ -0,0 +1,21 @@
+^3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at include_recursive\.cmake:1 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ include_recursive\.cmake:3 \(include\)
+ include_recursive\.cmake:3 \(include\)
+ include_recursive\.cmake:3 \(include\)
+ include_recursive\.cmake:3 \(include\)
+ include_recursive\.cmake:3 \(include\)
+ include_recursive\.cmake:3 \(include\)
+ include_recursive\.cmake:3 \(include\)
+ include_recursive\.cmake:3 \(include\)
+ include\.cmake:2 \(include\)
+ CMakeLists\.txt:5 \(include\)$
diff --git a/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-script-stderr.txt
new file mode 100644
index 0000000000..0510e7c373
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-script-stderr.txt
@@ -0,0 +1,5 @@
+[0-9]+
+CMake Error at .*/include_recursive\.cmake:1 \(message\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ .*/include_recursive\.cmake:3 \(include\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-stderr.txt
new file mode 100644
index 0000000000..b1494a8e11
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/include-invalid-env-stderr.txt
@@ -0,0 +1,5 @@
+[0-9]+
+CMake Error at include_recursive\.cmake:1 \(message\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ include_recursive\.cmake:3 \(include\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/macro-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/macro-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/macro-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/macro-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/macro-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/macro-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/macro-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/macro-env-script-stderr.txt
new file mode 100644
index 0000000000..142e068a08
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/macro-env-script-stderr.txt
@@ -0,0 +1,21 @@
+^3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at .*/macro\.cmake:2 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ .*/macro\.cmake:4 \(recursive\)
+ .*/macro\.cmake:4 \(recursive\)
+ .*/macro\.cmake:4 \(recursive\)
+ .*/macro\.cmake:4 \(recursive\)
+ .*/macro\.cmake:4 \(recursive\)
+ .*/macro\.cmake:4 \(recursive\)
+ .*/macro\.cmake:4 \(recursive\)
+ .*/macro\.cmake:4 \(recursive\)
+ .*/macro\.cmake:7 \(recursive\)
+ .*/CMakeLists\.txt:5 \(include\)$
diff --git a/Tests/RunCMake/MaxRecursionDepth/macro-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/macro-env-stderr.txt
new file mode 100644
index 0000000000..71de55376f
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/macro-env-stderr.txt
@@ -0,0 +1,21 @@
+^3
+4
+5
+6
+7
+8
+9
+10
+CMake Error at macro\.cmake:2 \(message\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ macro\.cmake:4 \(recursive\)
+ macro\.cmake:4 \(recursive\)
+ macro\.cmake:4 \(recursive\)
+ macro\.cmake:4 \(recursive\)
+ macro\.cmake:4 \(recursive\)
+ macro\.cmake:4 \(recursive\)
+ macro\.cmake:4 \(recursive\)
+ macro\.cmake:4 \(recursive\)
+ macro\.cmake:7 \(recursive\)
+ CMakeLists\.txt:5 \(include\)$
diff --git a/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-script-stderr.txt
new file mode 100644
index 0000000000..c67be57d28
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-script-stderr.txt
@@ -0,0 +1,5 @@
+[0-9]+
+CMake Error at .*/macro\.cmake:2 \(message\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ .*/macro\.cmake:4 \(recursive\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-stderr.txt
new file mode 100644
index 0000000000..0b271627da
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/macro-invalid-env-stderr.txt
@@ -0,0 +1,5 @@
+[0-9]+
+CMake Error at macro\.cmake:2 \(message\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ macro\.cmake:4 \(recursive\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-script-stderr.txt
new file mode 100644
index 0000000000..52fedd314c
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-script-stderr.txt
@@ -0,0 +1,22 @@
+^4
+6
+8
+10
+CMake Error at .*/variable_watch\.cmake:[0-9]+ \(update_x\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ .*/variable_watch\.cmake:5 \(set\)
+ .*/variable_watch\.cmake:[0-9]+ \(update_x\)
+ .*/variable_watch\.cmake:5 \(set\)
+ .*/variable_watch\.cmake:[0-9]+ \(update_x\)
+ .*/variable_watch\.cmake:5 \(set\)
+ .*/variable_watch\.cmake:[0-9]+ \(update_x\)
+ .*/variable_watch\.cmake:5 \(set\)
+ .*/variable_watch\.cmake:[0-9]+ \(update_x\)
+ .*/variable_watch\.cmake:9 \(set\)
+ .*/CMakeLists\.txt:5 \(include\)
+
+
+CMake Error: Error in cmake code at
+Unknown:0:
+A command failed during the invocation of callback "update_x"\.$
diff --git a/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-stderr.txt
new file mode 100644
index 0000000000..1427f1df99
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/variable_watch-env-stderr.txt
@@ -0,0 +1,22 @@
+^4
+6
+8
+10
+CMake Error at variable_watch\.cmake:[0-9]+ \(update_x\):
+ Maximum recursion depth of 10 exceeded
+Call Stack \(most recent call first\):
+ variable_watch\.cmake:5 \(set\)
+ variable_watch\.cmake:[0-9]+ \(update_x\)
+ variable_watch\.cmake:5 \(set\)
+ variable_watch\.cmake:[0-9]+ \(update_x\)
+ variable_watch\.cmake:5 \(set\)
+ variable_watch\.cmake:[0-9]+ \(update_x\)
+ variable_watch\.cmake:5 \(set\)
+ variable_watch\.cmake:[0-9]+ \(update_x\)
+ variable_watch\.cmake:9 \(set\)
+ CMakeLists\.txt:5 \(include\)
+
+
+CMake Error: Error in cmake code at
+Unknown:0:
+A command failed during the invocation of callback "update_x"\.$
diff --git a/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-result.txt b/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-script-result.txt b/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-script-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-script-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-script-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-script-stderr.txt
new file mode 100644
index 0000000000..07deee2eaf
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-script-stderr.txt
@@ -0,0 +1,6 @@
+[0-9]+
+CMake Error at .*/variable_watch\.cmake:[0-9]+ \(update_x\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ .*/variable_watch\.cmake:5 \(set\)
+ .*/variable_watch\.cmake:[0-9]+ \(update_x\)
diff --git a/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-stderr.txt b/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-stderr.txt
new file mode 100644
index 0000000000..b2395b30f3
--- /dev/null
+++ b/Tests/RunCMake/MaxRecursionDepth/variable_watch-invalid-env-stderr.txt
@@ -0,0 +1,6 @@
+[0-9]+
+CMake Error at variable_watch\.cmake:[0-9]+ \(update_x\):
+ Maximum recursion depth of [0-9]+ exceeded
+Call Stack \(most recent call first\):
+ variable_watch\.cmake:5 \(set\)
+ variable_watch\.cmake:[0-9]+ \(update_x\)
diff --git a/Tests/RunCMake/VS10Project/CustomCommandParallel-check.cmake b/Tests/RunCMake/VS10Project/CustomCommandParallel-check.cmake
new file mode 100644
index 0000000000..87e2f704d2
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/CustomCommandParallel-check.cmake
@@ -0,0 +1,40 @@
+set(vcProjectFile "${RunCMake_TEST_BINARY_DIR}/foo.vcxproj")
+if(NOT EXISTS "${vcProjectFile}")
+ set(RunCMake_TEST_FAILED "Project file ${vcProjectFile} does not exist.")
+ return()
+endif()
+
+set(found_CustomBuild_cmp0147_new 0)
+set(found_CustomBuild_cmp0147_old 0)
+set(found_BuildInParallel_cmp0147_new 0)
+set(found_BuildInParallel_cmp0147_old 0)
+set(in_CustomBuild_cmp0147 "")
+file(STRINGS "${vcProjectFile}" lines)
+foreach(line IN LISTS lines)
+ if(line MATCHES [[<CustomBuild Include=".*\\cmp0147-old\.txt\.rule">]])
+ set(found_CustomBuild_cmp0147_old 1)
+ set(in_CustomBuild_cmp0147 "old")
+ endif()
+ if(line MATCHES [[<CustomBuild Include=".*\\cmp0147-new\.txt\.rule">]])
+ set(found_CustomBuild_cmp0147_new 1)
+ set(in_CustomBuild_cmp0147 "new")
+ endif()
+ if(line MATCHES [[</CustomBuild>]])
+ set(in_CustomBuild_cmp0147 "")
+ endif()
+ if(line MATCHES [[<BuildInParallel .*>true</BuildInParallel>]] AND in_CustomBuild_cmp0147)
+ set(found_BuildInParallel_cmp0147_${in_CustomBuild_cmp0147} 1)
+ endif()
+endforeach()
+if(NOT found_CustomBuild_cmp0147_new)
+ string(APPEND RunCMake_TEST_FAILED "CustomBuild for cmp0147-new.txt.rule not found in\n ${vcProjectFile}\n")
+endif()
+if(NOT found_CustomBuild_cmp0147_old)
+ string(APPEND RunCMake_TEST_FAILED "CustomBuild for cmp0147-old.txt.rule not found in\n ${vcProjectFile}\n")
+endif()
+if(NOT found_BuildInParallel_cmp0147_new)
+ string(APPEND RunCMake_TEST_FAILED "BuildInParallel for cmp0147-new.txt.rule not found in\n ${vcProjectFile}\n")
+endif()
+if(found_BuildInParallel_cmp0147_old)
+ string(APPEND RunCMake_TEST_FAILED "BuildInParallel for cmp0147-old.txt.rule incorrectly found in\n ${vcProjectFile}\n")
+endif()
diff --git a/Tests/RunCMake/VS10Project/CustomCommandParallel.cmake b/Tests/RunCMake/VS10Project/CustomCommandParallel.cmake
new file mode 100644
index 0000000000..784fc685b5
--- /dev/null
+++ b/Tests/RunCMake/VS10Project/CustomCommandParallel.cmake
@@ -0,0 +1,5 @@
+cmake_policy(VERSION 3.26) # CMP0147 left unset
+add_custom_command(OUTPUT "cmp0147-old.txt" COMMAND echo)
+cmake_policy(SET CMP0147 NEW)
+add_custom_command(OUTPUT "cmp0147-new.txt" COMMAND echo)
+add_custom_target(foo DEPENDS "cmp0147-old.txt" "cmp0147-new.txt")
diff --git a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake
index ed74896370..669049a737 100644
--- a/Tests/RunCMake/VS10Project/RunCMakeTest.cmake
+++ b/Tests/RunCMake/VS10Project/RunCMakeTest.cmake
@@ -8,6 +8,9 @@ if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND CMAKE_C_COMPILER_VERSION VERSION_GREA
endif()
run_cmake(CustomCommandGenex)
+if(NOT RunCMake_GENERATOR MATCHES "^Visual Studio 1[1-5] ")
+ run_cmake(CustomCommandParallel)
+endif()
run_cmake(VsCsharpSourceGroup)
run_cmake(VsCSharpCompilerOpts)
run_cmake(ExplicitCMakeLists)
diff --git a/Tests/RunCMake/find_package/CMP0147-NEW-result.txt b/Tests/RunCMake/find_package/CMP0147-NEW-result.txt
new file mode 100644
index 0000000000..d00491fd7e
--- /dev/null
+++ b/Tests/RunCMake/find_package/CMP0147-NEW-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/find_package/CMP0147-NEW-stderr.txt b/Tests/RunCMake/find_package/CMP0147-NEW-stderr.txt
new file mode 100644
index 0000000000..1caf6c592e
--- /dev/null
+++ b/Tests/RunCMake/find_package/CMP0147-NEW-stderr.txt
@@ -0,0 +1,7 @@
+^CMake Error at [^
+]*/Modules/FindCUDA.cmake:[0-9]+ \(message\):
+ The FindCUDA module does not work in Visual Studio with policy CMP0147\.
+Call Stack \(most recent call first\):
+ CMP0147-common\.cmake:[0-9]+ \(find_package\)
+ CMP0147-NEW\.cmake:[0-9]+ \(include\)
+ CMakeLists\.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/find_package/CMP0147-NEW.cmake b/Tests/RunCMake/find_package/CMP0147-NEW.cmake
new file mode 100644
index 0000000000..0ca5b6c999
--- /dev/null
+++ b/Tests/RunCMake/find_package/CMP0147-NEW.cmake
@@ -0,0 +1,2 @@
+cmake_policy(SET CMP0147 NEW)
+include(CMP0147-common.cmake)
diff --git a/Tests/RunCMake/find_package/CMP0147-OLD.cmake b/Tests/RunCMake/find_package/CMP0147-OLD.cmake
new file mode 100644
index 0000000000..61ecee5106
--- /dev/null
+++ b/Tests/RunCMake/find_package/CMP0147-OLD.cmake
@@ -0,0 +1,2 @@
+cmake_policy(SET CMP0147 OLD)
+include(CMP0147-common.cmake)
diff --git a/Tests/RunCMake/find_package/CMP0147-WARN.cmake b/Tests/RunCMake/find_package/CMP0147-WARN.cmake
new file mode 100644
index 0000000000..d5f3e91db1
--- /dev/null
+++ b/Tests/RunCMake/find_package/CMP0147-WARN.cmake
@@ -0,0 +1,2 @@
+# leave CMP0147 unset
+include(CMP0147-common.cmake)
diff --git a/Tests/RunCMake/find_package/CMP0147-common.cmake b/Tests/RunCMake/find_package/CMP0147-common.cmake
new file mode 100644
index 0000000000..68a86eedab
--- /dev/null
+++ b/Tests/RunCMake/find_package/CMP0147-common.cmake
@@ -0,0 +1,3 @@
+cmake_policy(SET CMP0146 OLD)
+set(_FindCUDA_testing TRUE)
+find_package(CUDA MODULE)
diff --git a/Tests/RunCMake/find_package/RunCMakeTest.cmake b/Tests/RunCMake/find_package/RunCMakeTest.cmake
index 924aa66578..26eb908f0d 100644
--- a/Tests/RunCMake/find_package/RunCMakeTest.cmake
+++ b/Tests/RunCMake/find_package/RunCMakeTest.cmake
@@ -42,6 +42,11 @@ run_cmake(CMP0145-NEW)
run_cmake(CMP0146-OLD)
run_cmake(CMP0146-WARN)
run_cmake(CMP0146-NEW)
+if(RunCMake_GENERATOR MATCHES "Visual Studio")
+ run_cmake(CMP0147-OLD)
+ run_cmake(CMP0147-WARN)
+ run_cmake(CMP0147-NEW)
+endif()
run_cmake(WrongVersionRange)
run_cmake(EmptyVersionRange)
run_cmake(VersionRangeWithEXACT)
diff --git a/Utilities/Sphinx/cmake.py b/Utilities/Sphinx/cmake.py
index 1428e1d476..38fd98a73b 100644
--- a/Utilities/Sphinx/cmake.py
+++ b/Utilities/Sphinx/cmake.py
@@ -286,19 +286,20 @@ class CMakeTransform(Transform):
domain.note_object(objtype, targetname, targetid, targetid)
class CMakeObject(ObjectDescription):
+ def __init__(self, *args, **kwargs):
+ self.targetname = None
+ super().__init__(*args, **kwargs)
def handle_signature(self, sig, signode):
# called from sphinx.directives.ObjectDescription.run()
signode += addnodes.desc_name(sig, sig)
- if self.objtype == 'genex':
- m = CMakeXRefRole._re_genex.match(sig)
- if m:
- sig = m.group(1)
return sig
def add_target_and_index(self, name, sig, signode):
if self.objtype == 'command':
targetname = name.lower()
+ elif self.targetname:
+ targetname = self.targetname
else:
targetname = name
targetid = '%s:%s' % (self.objtype, targetname)
@@ -316,6 +317,29 @@ class CMakeObject(ObjectDescription):
if make_index_entry:
self.indexnode['entries'].append(make_index_entry(name, targetid))
+
+class CMakeGenexObject(CMakeObject):
+ option_spec = {
+ 'target': directives.unchanged,
+ }
+
+ def handle_signature(self, sig, signode):
+ name = super().handle_signature(sig, signode)
+
+ m = CMakeXRefRole._re_genex.match(sig)
+ if m:
+ name = m.group(1)
+
+ return name
+
+ def run(self):
+ target = self.options.get('target')
+ if target is not None:
+ self.targetname = target
+
+ return super().run()
+
+
class CMakeSignatureObject(CMakeObject):
object_type = 'signature'
@@ -566,7 +590,7 @@ class CMakeDomain(Domain):
directives = {
'command': CMakeObject,
'envvar': CMakeObject,
- 'genex': CMakeObject,
+ 'genex': CMakeGenexObject,
'signature': CMakeSignatureObject,
'variable': CMakeObject,
# Other `object_types` cannot be created except by the `CMakeTransform`