1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-16 22:37:30 +08:00

try_compile: consistently add language properties

It was very easy to forgot to add all the possible language
properties that try_compile might need. Refactored the code
to make it harder to skip flags.

This changes adds the missing language properties for
the CUDA, Fortran, OBJC, OBJCXX, and Swift languages:

- CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN
- CMAKE_<LANG>_COMPILER_TARGET
- CMAKE_<LANG>_LINK_NO_PIE_SUPPORTED
- CMAKE_<LANG>_PIE_SUPPORTED
This commit is contained in:
Robert Maynard
2020-06-15 11:20:59 -04:00
parent 0e16da8233
commit c4e890946a

View File

@@ -166,21 +166,35 @@ private:
std::string ExtensionValue; std::string ExtensionValue;
}; };
std::string const kCMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN = constexpr size_t lang_property_start = 0;
"CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN"; constexpr size_t lang_property_size = 4;
std::string const kCMAKE_C_COMPILER_TARGET = "CMAKE_C_COMPILER_TARGET"; constexpr size_t pie_property_start = 4;
std::string const kCMAKE_C_LINK_NO_PIE_SUPPORTED = constexpr size_t pie_property_size = 2;
"CMAKE_C_LINK_NO_PIE_SUPPORTED"; #define SETUP_LANGUAGE(name, lang) \
std::string const kCMAKE_C_LINK_PIE_SUPPORTED = "CMAKE_C_LINK_PIE_SUPPORTED"; static const std::string name[lang_property_size + pie_property_size + 1] = \
std::string const kCMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN = { "CMAKE_" #lang "_COMPILER_EXTERNAL_TOOLCHAIN", \
"CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN"; "CMAKE_" #lang "_COMPILER_TARGET", \
std::string const kCMAKE_CXX_COMPILER_TARGET = "CMAKE_CXX_COMPILER_TARGET"; "CMAKE_" #lang "_LINK_NO_PIE_SUPPORTED", \
std::string const kCMAKE_CXX_LINK_NO_PIE_SUPPORTED = "CMAKE_" #lang "_PIE_SUPPORTED", "" }
"CMAKE_CXX_LINK_NO_PIE_SUPPORTED";
std::string const kCMAKE_CXX_LINK_PIE_SUPPORTED = // NOLINTNEXTLINE(bugprone-suspicious-missing-comma)
"CMAKE_CXX_LINK_PIE_SUPPORTED"; SETUP_LANGUAGE(c_properties, C);
// NOLINTNEXTLINE(bugprone-suspicious-missing-comma)
SETUP_LANGUAGE(cxx_properties, CXX);
// NOLINTNEXTLINE(bugprone-suspicious-missing-comma)
SETUP_LANGUAGE(cuda_properties, CUDA);
// NOLINTNEXTLINE(bugprone-suspicious-missing-comma)
SETUP_LANGUAGE(fortran_properties, Fortran);
// NOLINTNEXTLINE(bugprone-suspicious-missing-comma)
SETUP_LANGUAGE(objc_properties, OBJC);
// NOLINTNEXTLINE(bugprone-suspicious-missing-comma)
SETUP_LANGUAGE(objcxx_properties, OBJCXX);
// NOLINTNEXTLINE(bugprone-suspicious-missing-comma)
SETUP_LANGUAGE(swift_properties, Swift);
#undef SETUP_LANGUAGE
std::string const kCMAKE_CUDA_ARCHITECTURES = "CMAKE_CUDA_ARCHITECTURES"; std::string const kCMAKE_CUDA_ARCHITECTURES = "CMAKE_CUDA_ARCHITECTURES";
std::string const kCMAKE_CUDA_COMPILER_TARGET = "CMAKE_CUDA_COMPILER_TARGET";
std::string const kCMAKE_CUDA_RUNTIME_LIBRARY = "CMAKE_CUDA_RUNTIME_LIBRARY"; std::string const kCMAKE_CUDA_RUNTIME_LIBRARY = "CMAKE_CUDA_RUNTIME_LIBRARY";
std::string const kCMAKE_ENABLE_EXPORTS = "CMAKE_ENABLE_EXPORTS"; std::string const kCMAKE_ENABLE_EXPORTS = "CMAKE_ENABLE_EXPORTS";
std::string const kCMAKE_LINK_SEARCH_END_STATIC = std::string const kCMAKE_LINK_SEARCH_END_STATIC =
@@ -198,7 +212,6 @@ std::string const kCMAKE_POSITION_INDEPENDENT_CODE =
std::string const kCMAKE_SYSROOT = "CMAKE_SYSROOT"; std::string const kCMAKE_SYSROOT = "CMAKE_SYSROOT";
std::string const kCMAKE_SYSROOT_COMPILE = "CMAKE_SYSROOT_COMPILE"; std::string const kCMAKE_SYSROOT_COMPILE = "CMAKE_SYSROOT_COMPILE";
std::string const kCMAKE_SYSROOT_LINK = "CMAKE_SYSROOT_LINK"; std::string const kCMAKE_SYSROOT_LINK = "CMAKE_SYSROOT_LINK";
std::string const kCMAKE_Swift_COMPILER_TARGET = "CMAKE_Swift_COMPILER_TARGET";
std::string const kCMAKE_TRY_COMPILE_OSX_ARCHITECTURES = std::string const kCMAKE_TRY_COMPILE_OSX_ARCHITECTURES =
"CMAKE_TRY_COMPILE_OSX_ARCHITECTURES"; "CMAKE_TRY_COMPILE_OSX_ARCHITECTURES";
std::string const kCMAKE_TRY_COMPILE_PLATFORM_VARIABLES = std::string const kCMAKE_TRY_COMPILE_PLATFORM_VARIABLES =
@@ -675,12 +688,23 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
// Forward a set of variables to the inner project cache. // Forward a set of variables to the inner project cache.
{ {
std::set<std::string> vars; std::set<std::string> vars;
vars.insert(kCMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN); vars.insert(&c_properties[lang_property_start],
vars.insert(kCMAKE_C_COMPILER_TARGET); &c_properties[lang_property_start + lang_property_size]);
vars.insert(kCMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN); vars.insert(&cxx_properties[lang_property_start],
vars.insert(kCMAKE_CXX_COMPILER_TARGET); &cxx_properties[lang_property_start + lang_property_size]);
vars.insert(&cuda_properties[lang_property_start],
&cuda_properties[lang_property_start + lang_property_size]);
vars.insert(
&fortran_properties[lang_property_start],
&fortran_properties[lang_property_start + lang_property_size]);
vars.insert(&objc_properties[lang_property_start],
&objc_properties[lang_property_start + lang_property_size]);
vars.insert(
&objcxx_properties[lang_property_start],
&objcxx_properties[lang_property_start + lang_property_size]);
vars.insert(&swift_properties[lang_property_start],
&swift_properties[lang_property_start + lang_property_size]);
vars.insert(kCMAKE_CUDA_ARCHITECTURES); vars.insert(kCMAKE_CUDA_ARCHITECTURES);
vars.insert(kCMAKE_CUDA_COMPILER_TARGET);
vars.insert(kCMAKE_CUDA_RUNTIME_LIBRARY); vars.insert(kCMAKE_CUDA_RUNTIME_LIBRARY);
vars.insert(kCMAKE_ENABLE_EXPORTS); vars.insert(kCMAKE_ENABLE_EXPORTS);
vars.insert(kCMAKE_LINK_SEARCH_END_STATIC); vars.insert(kCMAKE_LINK_SEARCH_END_STATIC);
@@ -693,7 +717,6 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
vars.insert(kCMAKE_SYSROOT); vars.insert(kCMAKE_SYSROOT);
vars.insert(kCMAKE_SYSROOT_COMPILE); vars.insert(kCMAKE_SYSROOT_COMPILE);
vars.insert(kCMAKE_SYSROOT_LINK); vars.insert(kCMAKE_SYSROOT_LINK);
vars.insert(kCMAKE_Swift_COMPILER_TARGET);
vars.insert(kCMAKE_WARN_DEPRECATED); vars.insert(kCMAKE_WARN_DEPRECATED);
vars.emplace("CMAKE_MSVC_RUNTIME_LIBRARY"_s); vars.emplace("CMAKE_MSVC_RUNTIME_LIBRARY"_s);
@@ -707,10 +730,22 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
cmPolicies::NEW) { cmPolicies::NEW) {
// To ensure full support of PIE, propagate cache variables // To ensure full support of PIE, propagate cache variables
// driving the link options // driving the link options
vars.insert(kCMAKE_C_LINK_PIE_SUPPORTED); vars.insert(&c_properties[pie_property_start],
vars.insert(kCMAKE_C_LINK_NO_PIE_SUPPORTED); &c_properties[pie_property_start + pie_property_size]);
vars.insert(kCMAKE_CXX_LINK_PIE_SUPPORTED); vars.insert(&cxx_properties[pie_property_start],
vars.insert(kCMAKE_CXX_LINK_NO_PIE_SUPPORTED); &cxx_properties[pie_property_start + pie_property_size]);
vars.insert(&cuda_properties[pie_property_start],
&cuda_properties[pie_property_start + pie_property_size]);
vars.insert(
&fortran_properties[pie_property_start],
&fortran_properties[pie_property_start + pie_property_size]);
vars.insert(&objc_properties[pie_property_start],
&objc_properties[pie_property_start + pie_property_size]);
vars.insert(
&objcxx_properties[pie_property_start],
&objcxx_properties[pie_property_start + pie_property_size]);
vars.insert(&swift_properties[pie_property_start],
&swift_properties[pie_property_start + pie_property_size]);
} }
/* for the TRY_COMPILEs we want to be able to specify the architecture. /* for the TRY_COMPILEs we want to be able to specify the architecture.