diff options
author | Deniz Bahadir <deniz@code.bahadir.email> | 2024-05-22 14:43:33 (GMT) |
---|---|---|
committer | Deniz Bahadir <deniz@code.bahadir.email> | 2024-05-22 14:43:33 (GMT) |
commit | af81b8667e627457550cc26ab5696d1e46293162 (patch) | |
tree | 5638c59f13436ab7450f2b3a2a8c3cca469c1caf | |
parent | 8a11a39c51c44c21fe6fb3cedd4df0c41450b7f6 (diff) | |
download | CMake-af81b8667e627457550cc26ab5696d1e46293162.zip CMake-af81b8667e627457550cc26ab5696d1e46293162.tar.gz CMake-af81b8667e627457550cc26ab5696d1e46293162.tar.bz2 |
GenEx: Add generator expr. for CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT
15 files changed, 264 insertions, 7 deletions
diff --git a/Help/manual/cmake-generator-expressions.7.rst b/Help/manual/cmake-generator-expressions.7.rst index c3bb044..26a4a60 100644 --- a/Help/manual/cmake-generator-expressions.7.rst +++ b/Help/manual/cmake-generator-expressions.7.rst @@ -1037,10 +1037,11 @@ closely related to the expressions in this sub-section. ``1`` if the version of the ISPC compiler matches ``version``, otherwise ``0``. -Compiler Language And ID -^^^^^^^^^^^^^^^^^^^^^^^^ +Compiler Language, ID, and Frontend-Variant +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable, which is closely +See also the :variable:`CMAKE_<LANG>_COMPILER_ID` and +:variable:`CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT` variables, which are closely related to most of the expressions in this sub-section. .. genex:: $<C_COMPILER_ID> @@ -1155,6 +1156,118 @@ related to most of the expressions in this sub-section. ``1`` if CMake's compiler id of the ISPC compiler matches any one of the entries in ``compiler_ids``, otherwise ``0``. +.. genex:: $<C_COMPILER_FRONTEND_VARIANT> + + .. versionadded:: 3.30 + + CMake's compiler frontend variant of the C compiler used. + +.. genex:: $<C_COMPILER_FRONTEND_VARIANT:compiler_ids> + + .. versionadded:: 3.30 + + where ``compiler_ids`` is a comma-separated list. + ``1`` if CMake's compiler frontend variant of the C compiler matches any one + of the entries in ``compiler_ids``, otherwise ``0``. + +.. genex:: $<CXX_COMPILER_FRONTEND_VARIANT> + + .. versionadded:: 3.30 + + CMake's compiler frontend variant of the C++ compiler used. + +.. genex:: $<CXX_COMPILER_FRONTEND_VARIANT:compiler_ids> + + .. versionadded:: 3.30 + + where ``compiler_ids`` is a comma-separated list. + ``1`` if CMake's compiler frontend variant of the C++ compiler matches any one + of the entries in ``compiler_ids``, otherwise ``0``. + +.. genex:: $<CUDA_COMPILER_FRONTEND_VARIANT> + + .. versionadded:: 3.30 + + CMake's compiler id of the CUDA compiler used. + +.. genex:: $<CUDA_COMPILER_FRONTEND_VARIANT:compiler_ids> + + .. versionadded:: 3.30 + + where ``compiler_ids`` is a comma-separated list. + ``1`` if CMake's compiler frontend variant of the CUDA compiler matches any one + of the entries in ``compiler_ids``, otherwise ``0``. + +.. genex:: $<OBJC_COMPILER_FRONTEND_VARIANT> + + .. versionadded:: 3.30 + + CMake's compiler frontend variant of the Objective-C compiler used. + +.. genex:: $<OBJC_COMPILER_FRONTEND_VARIANT:compiler_ids> + + .. versionadded:: 3.30 + + where ``compiler_ids`` is a comma-separated list. + ``1`` if CMake's compiler frontend variant of the Objective-C compiler matches any one + of the entries in ``compiler_ids``, otherwise ``0``. + +.. genex:: $<OBJCXX_COMPILER_FRONTEND_VARIANT> + + .. versionadded:: 3.30 + + CMake's compiler frontend variant of the Objective-C++ compiler used. + +.. genex:: $<OBJCXX_COMPILER_FRONTEND_VARIANT:compiler_ids> + + .. versionadded:: 3.30 + + where ``compiler_ids`` is a comma-separated list. + ``1`` if CMake's compiler frontend variant of the Objective-C++ compiler matches any one + of the entries in ``compiler_ids``, otherwise ``0``. + +.. genex:: $<Fortran_COMPILER_FRONTEND_VARIANT> + + .. versionadded:: 3.30 + + CMake's compiler id of the Fortran compiler used. + +.. genex:: $<Fortran_COMPILER_FRONTEND_VARIANT:compiler_ids> + + .. versionadded:: 3.30 + + where ``compiler_ids`` is a comma-separated list. + ``1`` if CMake's compiler frontend variant of the Fortran compiler matches any one + of the entries in ``compiler_ids``, otherwise ``0``. + +.. genex:: $<HIP_COMPILER_FRONTEND_VARIANT> + + .. versionadded:: 3.30 + + CMake's compiler id of the HIP compiler used. + +.. genex:: $<HIP_COMPILER_FRONTEND_VARIANT:compiler_ids> + + .. versionadded:: 3.30 + + where ``compiler_ids`` is a comma-separated list. + ``1`` if CMake's compiler frontend variant of the HIP compiler matches any one + of the entries in ``compiler_ids``, otherwise ``0``. + +.. genex:: $<ISPC_COMPILER_FRONTEND_VARIANT> + + .. versionadded:: 3.30 + + CMake's compiler id of the ISPC compiler used. + +.. genex:: $<ISPC_COMPILER_FRONTEND_VARIANT:compiler_ids> + + .. versionadded:: 3.30 + + where ``compiler_ids`` is a comma-separated list. + ``1`` if CMake's compiler frontend variant of the ISPC compiler matches any one + of the entries in ``compiler_ids``, otherwise ``0``. + .. genex:: $<COMPILE_LANGUAGE> .. versionadded:: 3.3 diff --git a/Help/release/dev/genex-compiler-frontend-variant.rst b/Help/release/dev/genex-compiler-frontend-variant.rst new file mode 100644 index 0000000..221f278 --- /dev/null +++ b/Help/release/dev/genex-compiler-frontend-variant.rst @@ -0,0 +1,6 @@ +genex-compiler-frontent-variant +------------------------------- + +* Generator expressions ``$<<LANG>_COMPILER_FRONTEND_VARIANT:...>`` were added that allow + access to the value of the associated :variable:`CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT` + variables. diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index 01cd18d..84521ca 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -2013,6 +2013,76 @@ static const CompilerVersionNode cCompilerVersionNode("C"), fortranCompilerVersionNode("Fortran"), ispcCompilerVersionNode("ISPC"), hipCompilerVersionNode("HIP"); +struct CompilerFrontendVariantNode : public cmGeneratorExpressionNode +{ + CompilerFrontendVariantNode(const char* compilerLang) + : CompilerLanguage(compilerLang) + { + } + + int NumExpectedParameters() const override { return ZeroOrMoreParameters; } + + std::string Evaluate( + const std::vector<std::string>& parameters, + cmGeneratorExpressionContext* context, + const GeneratorExpressionContent* content, + cmGeneratorExpressionDAGChecker* dagChecker) const override + { + if (!context->HeadTarget) { + std::ostringstream e; + e << "$<" << this->CompilerLanguage + << "_COMPILER_FRONTEND_VARIANT> may only be used with binary targets. " + " It may not be used with add_custom_command or add_custom_target."; + reportError(context, content->GetOriginalExpression(), e.str()); + return {}; + } + return this->EvaluateWithLanguage(parameters, context, content, dagChecker, + this->CompilerLanguage); + } + + std::string EvaluateWithLanguage(const std::vector<std::string>& parameters, + cmGeneratorExpressionContext* context, + const GeneratorExpressionContent* content, + cmGeneratorExpressionDAGChecker* /*unused*/, + const std::string& lang) const + { + std::string const& compilerFrontendVariant = + context->LG->GetMakefile()->GetSafeDefinition( + "CMAKE_" + lang + "_COMPILER_FRONTEND_VARIANT"); + if (parameters.empty()) { + return compilerFrontendVariant; + } + if (compilerFrontendVariant.empty()) { + return parameters.front().empty() ? "1" : "0"; + } + static cmsys::RegularExpression compilerFrontendVariantValidator( + "^[A-Za-z0-9_]*$"); + + for (auto const& param : parameters) { + if (!compilerFrontendVariantValidator.find(param)) { + reportError(context, content->GetOriginalExpression(), + "Expression syntax not recognized."); + return {}; + } + if (strcmp(param.c_str(), compilerFrontendVariant.c_str()) == 0) { + return "1"; + } + } + return "0"; + } + + const char* const CompilerLanguage; +}; + +static const CompilerFrontendVariantNode cCompilerFrontendVariantNode("C"), + cxxCompilerFrontendVariantNode("CXX"), + cudaCompilerFrontendVariantNode("CUDA"), + objcCompilerFrontendVariantNode("OBJC"), + objcxxCompilerFrontendVariantNode("OBJCXX"), + fortranCompilerFrontendVariantNode("Fortran"), + hipCompilerFrontendVariantNode("HIP"), + ispcCompilerFrontendVariantNode("ISPC"); + struct PlatformIdNode : public cmGeneratorExpressionNode { PlatformIdNode() {} // NOLINT(modernize-use-equals-default) @@ -4449,6 +4519,14 @@ const cmGeneratorExpressionNode* cmGeneratorExpressionNode::GetNode( { "OBJCXX_COMPILER_VERSION", &objcxxCompilerVersionNode }, { "Fortran_COMPILER_VERSION", &fortranCompilerVersionNode }, { "HIP_COMPILER_VERSION", &hipCompilerVersionNode }, + { "C_COMPILER_FRONTEND_VARIANT", &cCompilerFrontendVariantNode }, + { "CXX_COMPILER_FRONTEND_VARIANT", &cxxCompilerFrontendVariantNode }, + { "CUDA_COMPILER_FRONTEND_VARIANT", &cudaCompilerFrontendVariantNode }, + { "OBJC_COMPILER_FRONTEND_VARIANT", &objcCompilerFrontendVariantNode }, + { "OBJCXX_COMPILER_FRONTEND_VARIANT", &objcxxCompilerFrontendVariantNode }, + { "Fortran_COMPILER_FRONTEND_VARIANT", + &fortranCompilerFrontendVariantNode }, + { "HIP_COMPILER_FRONTEND_VARIANT", &hipCompilerFrontendVariantNode }, { "PLATFORM_ID", &platformIdNode }, { "COMPILE_FEATURES", &compileFeaturesNode }, { "CONFIGURATION", &configurationNode }, diff --git a/Tests/CompileOptions/CMakeLists.txt b/Tests/CompileOptions/CMakeLists.txt index ad2075e..e3d3ee7 100644 --- a/Tests/CompileOptions/CMakeLists.txt +++ b/Tests/CompileOptions/CMakeLists.txt @@ -22,6 +22,8 @@ add_executable(CompileOptions main.cpp) macro(get_compiler_test_genex lst lang) list(APPEND ${lst} -DTEST_${lang}_COMPILER_VERSION="$<${lang}_COMPILER_VERSION>") list(APPEND ${lst} -DTEST_${lang}_COMPILER_VERSION_EQUALITY=$<${lang}_COMPILER_VERSION:${CMAKE_${lang}_COMPILER_VERSION}>) + list(APPEND ${lst} -DTEST_${lang}_COMPILER_FRONTEND_VARIANT="$<${lang}_COMPILER_FRONTEND_VARIANT>") + list(APPEND ${lst} -DTEST_${lang}_COMPILER_FRONTEND_VARIANT_EQUALITY=$<${lang}_COMPILER_FRONTEND_VARIANT:${CMAKE_${lang}_COMPILER_FRONTEND_VARIANT}>) endmacro() get_compiler_test_genex(c_tests C) @@ -91,6 +93,8 @@ target_compile_definitions(CompileOptions PRIVATE "EXPECTED_C_COMPILER_VERSION=\"${CMAKE_C_COMPILER_VERSION}\"" "EXPECTED_CXX_COMPILER_VERSION=\"${CMAKE_CXX_COMPILER_VERSION}\"" + "EXPECTED_C_COMPILER_FRONTEND_VARIANT=\"${CMAKE_C_COMPILER_FRONTEND_VARIANT}\"" + "EXPECTED_CXX_COMPILER_FRONTEND_VARIANT=\"${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}\"" ) if(TEST_FORTRAN) @@ -99,5 +103,6 @@ if(TEST_FORTRAN) PRIVATE "TEST_FORTRAN" "EXPECTED_Fortran_COMPILER_VERSION=\"${CMAKE_Fortran_COMPILER_VERSION}\"" + "EXPECTED_Fortran_COMPILER_FRONTEND_VARIANT=\"${CMAKE_Fortran_COMPILER_FRONTEND_VARIANT}\"" ) endif() diff --git a/Tests/CompileOptions/main.cpp b/Tests/CompileOptions/main.cpp index 23ce197..a7ce783 100644 --- a/Tests/CompileOptions/main.cpp +++ b/Tests/CompileOptions/main.cpp @@ -68,15 +68,25 @@ int main() #endif && strcmp(EXPECTED_C_COMPILER_VERSION, TEST_C_COMPILER_VERSION) == 0 && - strcmp(EXPECTED_CXX_COMPILER_VERSION, TEST_CXX_COMPILER_VERSION) == 0 + strcmp(EXPECTED_CXX_COMPILER_VERSION, TEST_CXX_COMPILER_VERSION) == + 0 && + strcmp(EXPECTED_C_COMPILER_FRONTEND_VARIANT, + TEST_C_COMPILER_FRONTEND_VARIANT) == 0 && + strcmp(EXPECTED_CXX_COMPILER_FRONTEND_VARIANT, + TEST_CXX_COMPILER_FRONTEND_VARIANT) == 0 #ifdef TEST_FORTRAN && strcmp(EXPECTED_Fortran_COMPILER_VERSION, - TEST_Fortran_COMPILER_VERSION) == 0 + TEST_Fortran_COMPILER_VERSION) == 0 && + strcmp(EXPECTED_Fortran_COMPILER_FRONTEND_VARIANT, + TEST_Fortran_COMPILER_FRONTEND_VARIANT) == 0 #endif && TEST_C_COMPILER_VERSION_EQUALITY == 1 && - TEST_CXX_COMPILER_VERSION_EQUALITY == 1 + TEST_CXX_COMPILER_VERSION_EQUALITY == 1 && + TEST_C_COMPILER_FRONTEND_VARIANT_EQUALITY == 1 && + TEST_CXX_COMPILER_FRONTEND_VARIANT_EQUALITY == 1 #ifdef TEST_FORTRAN - && TEST_Fortran_COMPILER_VERSION_EQUALITY == 1 + && TEST_Fortran_COMPILER_VERSION_EQUALITY == 1 && + TEST_Fortran_COMPILER_FRONTEND_VARIANT_EQUALITY == 1 #endif ) ? 0 diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT-result.txt b/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT-stderr.txt b/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT-stderr.txt new file mode 100644 index 0000000..4cf5945 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT-stderr.txt @@ -0,0 +1,9 @@ +CMake Error at NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT.cmake:1 \(add_custom_command\): + Error evaluating generator expression: + + \$<CXX_COMPILER_FRONTEND_VARIANT> + + \$<CXX_COMPILER_FRONTEND_VARIANT> may only be used with binary targets. It + may not be used with add_custom_command or add_custom_target. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT.cmake b/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT.cmake new file mode 100644 index 0000000..08ce956 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT.cmake @@ -0,0 +1,4 @@ +add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/copied_file.cpp" + COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/empty.cpp" "${CMAKE_CURRENT_BINARY_DIR}/copied_file$<CXX_COMPILER_FRONTEND_VARIANT>.cpp" +) +add_custom_target(drive DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/copied_file.cpp") diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT-result.txt b/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT-stderr.txt b/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT-stderr.txt new file mode 100644 index 0000000..c7e43a3 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT-stderr.txt @@ -0,0 +1,9 @@ +CMake Error at NonValidTarget-C_COMPILER_FRONTEND_VARIANT.cmake:1 \(add_custom_command\): + Error evaluating generator expression: + + \$<C_COMPILER_FRONTEND_VARIANT> + + \$<C_COMPILER_FRONTEND_VARIANT> may only be used with binary targets. It + may not be used with add_custom_command or add_custom_target. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT.cmake b/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT.cmake new file mode 100644 index 0000000..c90f960 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-C_COMPILER_FRONTEND_VARIANT.cmake @@ -0,0 +1,4 @@ +add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/copied_file.cpp" + COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/empty.cpp" "${CMAKE_CURRENT_BINARY_DIR}/copied_file$<C_COMPILER_FRONTEND_VARIANT>.cpp" +) +add_custom_target(drive DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/copied_file.cpp") diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT-result.txt b/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT-stderr.txt b/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT-stderr.txt new file mode 100644 index 0000000..8641de9 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT-stderr.txt @@ -0,0 +1,9 @@ +CMake Error at NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT.cmake:1 \(add_custom_command\): + Error evaluating generator expression: + + \$<Fortran_COMPILER_FRONTEND_VARIANT> + + \$<Fortran_COMPILER_FRONTEND_VARIANT> may only be used with binary targets. + It may not be used with add_custom_command or add_custom_target. +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT.cmake b/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT.cmake new file mode 100644 index 0000000..4312af4 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT.cmake @@ -0,0 +1,4 @@ +add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/copied_file.cpp" + COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/empty.cpp" "${CMAKE_CURRENT_BINARY_DIR}/copied_file$<Fortran_COMPILER_FRONTEND_VARIANT>.cpp" +) +add_custom_target(drive DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/copied_file.cpp") diff --git a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake index 2a0c893..8ba70aa 100644 --- a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake +++ b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake @@ -20,6 +20,9 @@ run_cmake(NonValidTarget-Fortran_COMPILER_ID) run_cmake(NonValidTarget-C_COMPILER_VERSION) run_cmake(NonValidTarget-CXX_COMPILER_VERSION) run_cmake(NonValidTarget-Fortran_COMPILER_VERSION) +run_cmake(NonValidTarget-C_COMPILER_FRONTEND_VARIANT) +run_cmake(NonValidTarget-CXX_COMPILER_FRONTEND_VARIANT) +run_cmake(NonValidTarget-Fortran_COMPILER_FRONTEND_VARIANT) run_cmake(NonValidTarget-TARGET_PROPERTY) run_cmake(NonValidTarget-TARGET_POLICY) run_cmake(COMPILE_ONLY-not-compiling) |