From fd81024e804b9b874cfe86e3781680db22f8c552 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 10 Oct 2023 11:14:50 -0400 Subject: cxxmodules: Honor CMAKE_CXX_SCAN_FOR_MODULES in try_compile Under CMP0155's NEW behavior, projects that explicitly enable C++20 support with `set(CMAKE_CXX_STANDARD 20)` may also explicitly disable scanning with `set(CMAKE_CXX_SCAN_FOR_MODULES OFF)`. We already propagate `CMAKE_CXX_STANDARD` into `try_compile` test projects, so propagate `CMAKE_CXX_SCAN_FOR_MODULES` too. Fixes: #25313 --- Source/cmCoreTryCompile.cxx | 2 ++ Tests/RunCMake/CXXModules/NoScanningVariable.cmake | 21 +++++++++++++++++++++ Tests/RunCMake/CXXModules/RunCMakeTest.cmake | 1 + Tests/RunCMake/CXXModules/main-no-use.cxx | 4 ++++ 4 files changed, 28 insertions(+) create mode 100644 Tests/RunCMake/CXXModules/NoScanningVariable.cmake create mode 100644 Tests/RunCMake/CXXModules/main-no-use.cxx diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index 67462f5..7e19812 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -72,6 +72,7 @@ SETUP_LANGUAGE(swift_properties, Swift); std::string const kCMAKE_CUDA_ARCHITECTURES = "CMAKE_CUDA_ARCHITECTURES"; std::string const kCMAKE_CUDA_RUNTIME_LIBRARY = "CMAKE_CUDA_RUNTIME_LIBRARY"; +std::string const kCMAKE_CXX_SCAN_FOR_MODULES = "CMAKE_CXX_SCAN_FOR_MODULES"; std::string const kCMAKE_ENABLE_EXPORTS = "CMAKE_ENABLE_EXPORTS"; std::string const kCMAKE_EXECUTABLE_ENABLE_EXPORTS = "CMAKE_EXECUTABLE_ENABLE_EXPORTS"; @@ -1082,6 +1083,7 @@ cm::optional cmCoreTryCompile::TryCompileCode( &swift_properties[lang_property_start + lang_property_size]); vars.insert(kCMAKE_CUDA_ARCHITECTURES); vars.insert(kCMAKE_CUDA_RUNTIME_LIBRARY); + vars.insert(kCMAKE_CXX_SCAN_FOR_MODULES); vars.insert(kCMAKE_ENABLE_EXPORTS); vars.insert(kCMAKE_EXECUTABLE_ENABLE_EXPORTS); vars.insert(kCMAKE_SHARED_LIBRARY_ENABLE_EXPORTS); diff --git a/Tests/RunCMake/CXXModules/NoScanningVariable.cmake b/Tests/RunCMake/CXXModules/NoScanningVariable.cmake new file mode 100644 index 0000000..4bb6a70 --- /dev/null +++ b/Tests/RunCMake/CXXModules/NoScanningVariable.cmake @@ -0,0 +1,21 @@ +# Enable scanning by default for targets that explicitly use C++ 20. +cmake_policy(SET CMP0155 NEW) + +enable_language(CXX) + +# Hide any real scanning rule that may be available. +unset(CMAKE_CXX_SCANDEP_SOURCE) + +# Explicitly enable C++20 for all targets. +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Explicitly suppress scanning so that support is not required. +set(CMAKE_CXX_SCAN_FOR_MODULES OFF) + +add_executable(noscanning-variable main-no-use.cxx) + +# Verify that CMAKE_CXX_SCAN_FOR_MODULES is propagated into the check. +# FIXME: Unset CMAKE_CXX_SCANDEP_SOURCE inside try_compile so this +# test can verify behavior on newer compilers too. +try_compile(result SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/main-no-use.cxx) diff --git a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake index 05d2655..e13b2d4 100644 --- a/Tests/RunCMake/CXXModules/RunCMakeTest.cmake +++ b/Tests/RunCMake/CXXModules/RunCMakeTest.cmake @@ -20,6 +20,7 @@ if ("cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES) run_cmake(NoScanningSourceFileProperty) run_cmake(NoScanningTargetProperty) + run_cmake(NoScanningVariable) run_cmake(CMP0155-OLD) run_cmake(CMP0155-NEW) endif () diff --git a/Tests/RunCMake/CXXModules/main-no-use.cxx b/Tests/RunCMake/CXXModules/main-no-use.cxx new file mode 100644 index 0000000..f8b643a --- /dev/null +++ b/Tests/RunCMake/CXXModules/main-no-use.cxx @@ -0,0 +1,4 @@ +int main() +{ + return 0; +} -- cgit v0.12