Browse Source

Merge topic 'lang-linker-launcher-genex'

33e27f6ca6 <LANG>_LINKER_LAUNCHER: Allow generator expressions
84ada0b0c9 <LANG>_COMPILER_LAUNCHER: Expand subset of genexes that can be evaluated

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !8152
Brad King 2 years ago
parent
commit
c3210aab46
37 changed files with 68 additions and 34 deletions
  1. 5 0
      Help/prop_tgt/LANG_LINKER_LAUNCHER.rst
  2. 5 0
      Help/release/dev/lang-linker-launcher-genex.rst
  3. 11 3
      Source/cmCommonTargetGenerator.cxx
  4. 9 0
      Source/cmGeneratorExpressionDAGChecker.cxx
  5. 1 0
      Source/cmGeneratorExpressionDAGChecker.h
  6. 6 3
      Source/cmGeneratorExpressionNode.cxx
  7. 2 1
      Source/cmMakefileTargetGenerator.cxx
  8. 2 1
      Source/cmNinjaTargetGenerator.cxx
  9. 1 1
      Tests/RunCMake/CompilerLauncher/C-env-Build-stdout.txt
  10. 1 1
      Tests/RunCMake/CompilerLauncher/C-launch-env-Build-stdout.txt
  11. 1 1
      Tests/RunCMake/CompilerLauncher/CUDA-env-Build-stdout.txt
  12. 1 1
      Tests/RunCMake/CompilerLauncher/CUDA-launch-env-Build-stdout.txt
  13. 1 1
      Tests/RunCMake/CompilerLauncher/CXX-env-Build-stdout.txt
  14. 1 1
      Tests/RunCMake/CompilerLauncher/CXX-launch-env-Build-stdout.txt
  15. 1 1
      Tests/RunCMake/CompilerLauncher/Fortran-env-Build-stdout.txt
  16. 1 1
      Tests/RunCMake/CompilerLauncher/Fortran-launch-env-Build-stdout.txt
  17. 1 1
      Tests/RunCMake/CompilerLauncher/HIP-env-Build-stdout.txt
  18. 0 1
      Tests/RunCMake/CompilerLauncher/HIP-env-launch-Build-stdout.txt
  19. 1 0
      Tests/RunCMake/CompilerLauncher/HIP-launch-env-Build-stdout.txt
  20. 1 1
      Tests/RunCMake/CompilerLauncher/ISPC-env-Build-stdout.txt
  21. 1 1
      Tests/RunCMake/CompilerLauncher/ISPC-launch-env-Build-stdout.txt
  22. 1 1
      Tests/RunCMake/CompilerLauncher/OBJC-env-Build-stdout.txt
  23. 0 1
      Tests/RunCMake/CompilerLauncher/OBJC-env-launch-Build-stdout.txt
  24. 1 0
      Tests/RunCMake/CompilerLauncher/OBJC-launch-env-Build-stdout.txt
  25. 1 1
      Tests/RunCMake/CompilerLauncher/OBJCXX-env-Build-stdout.txt
  26. 0 1
      Tests/RunCMake/CompilerLauncher/OBJCXX-env-launch-Build-stdout.txt
  27. 1 0
      Tests/RunCMake/CompilerLauncher/OBJCXX-launch-env-Build-stdout.txt
  28. 1 1
      Tests/RunCMake/CompilerLauncher/RunCMakeTest.cmake
  29. 1 1
      Tests/RunCMake/LinkerLauncher/C-env-Build-stdout.txt
  30. 1 1
      Tests/RunCMake/LinkerLauncher/C-launch-env-Build-stdout.txt
  31. 1 1
      Tests/RunCMake/LinkerLauncher/CXX-env-Build-stdout.txt
  32. 1 1
      Tests/RunCMake/LinkerLauncher/CXX-launch-env-Build-stdout.txt
  33. 1 1
      Tests/RunCMake/LinkerLauncher/OBJC-env-Build-stdout.txt
  34. 1 1
      Tests/RunCMake/LinkerLauncher/OBJC-launch-env-Build-stdout.txt
  35. 1 1
      Tests/RunCMake/LinkerLauncher/OBJCXX-env-Build-stdout.txt
  36. 1 1
      Tests/RunCMake/LinkerLauncher/OBJCXX-launch-env-Build-stdout.txt
  37. 2 1
      Tests/RunCMake/LinkerLauncher/RunCMakeTest.cmake

+ 5 - 0
Help/prop_tgt/LANG_LINKER_LAUNCHER.rst

@@ -14,3 +14,8 @@ arguments to the tool. This is useful for tools such as static analyzers.
 This property is initialized by the value of the
 :variable:`CMAKE_<LANG>_LINKER_LAUNCHER` variable if it is set when a target is
 created.
+
+.. versionadded:: 3.27
+
+  The property value may use
+  :manual:`generator expressions <cmake-generator-expressions(7)>`.

+ 5 - 0
Help/release/dev/lang-linker-launcher-genex.rst

@@ -0,0 +1,5 @@
+lang-linker-launcher-genex
+--------------------------
+
+* The :prop_tgt:`<LANG>_LINKER_LAUNCHER` target property now supports
+  :manual:`generator expressions <cmake-generator-expressions(7)>`.

+ 11 - 3
Source/cmCommonTargetGenerator.cxx

@@ -10,6 +10,8 @@
 #include <cmext/string_view>
 
 #include "cmComputeLinkInformation.h"
+#include "cmGeneratorExpression.h"
+#include "cmGeneratorExpressionDAGChecker.h"
 #include "cmGeneratorTarget.h"
 #include "cmGlobalCommonGenerator.h"
 #include "cmGlobalGenerator.h"
@@ -288,11 +290,17 @@ std::string cmCommonTargetGenerator::GetLinkerLauncher(
   const std::string& config)
 {
   std::string lang = this->GeneratorTarget->GetLinkerLanguage(config);
-  cmValue launcherProp =
-    this->GeneratorTarget->GetProperty(lang + "_LINKER_LAUNCHER");
+  std::string propName = lang + "_LINKER_LAUNCHER";
+  cmValue launcherProp = this->GeneratorTarget->GetProperty(propName);
   if (cmNonempty(launcherProp)) {
+    cmGeneratorExpressionDAGChecker dagChecker(this->GeneratorTarget, propName,
+                                               nullptr, nullptr);
+    std::string evaluatedLinklauncher = cmGeneratorExpression::Evaluate(
+      *launcherProp, this->LocalCommonGenerator, config, this->GeneratorTarget,
+      &dagChecker, this->GeneratorTarget, lang);
     // Convert ;-delimited list to single string
-    std::vector<std::string> args = cmExpandedList(*launcherProp, true);
+    std::vector<std::string> args =
+      cmExpandedList(evaluatedLinklauncher, true);
     if (!args.empty()) {
       args[0] = this->LocalCommonGenerator->ConvertToOutputFormat(
         args[0], cmOutputConverter::SHELL);

+ 9 - 0
Source/cmGeneratorExpressionDAGChecker.cxx

@@ -177,6 +177,15 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingLinkOptionsExpression() const
   return property == "LINK_OPTIONS"_s;
 }
 
+bool cmGeneratorExpressionDAGChecker::EvaluatingLinkerLauncher() const
+{
+  cm::string_view property(this->Top()->Property);
+
+  return property.length() > cmStrLen("_LINKER_LAUNCHER") &&
+    property.substr(property.length() - cmStrLen("_LINKER_LAUNCHER")) ==
+    "_LINKER_LAUNCHER"_s;
+}
+
 bool cmGeneratorExpressionDAGChecker::EvaluatingLinkLibraries(
   cmGeneratorTarget const* tgt, ForGenex genex) const
 {

+ 1 - 0
Source/cmGeneratorExpressionDAGChecker.h

@@ -70,6 +70,7 @@ struct cmGeneratorExpressionDAGChecker
   bool EvaluatingCompileExpression() const;
   bool EvaluatingLinkExpression() const;
   bool EvaluatingLinkOptionsExpression() const;
+  bool EvaluatingLinkerLauncher() const;
 
   enum class ForGenex
   {

+ 6 - 3
Source/cmGeneratorExpressionNode.cxx

@@ -1548,7 +1548,8 @@ static const struct LinkLanguageNode : public cmGeneratorExpressionNode
   {
     if (!context->HeadTarget || !dagChecker ||
         !(dagChecker->EvaluatingLinkExpression() ||
-          dagChecker->EvaluatingLinkLibraries())) {
+          dagChecker->EvaluatingLinkLibraries() ||
+          dagChecker->EvaluatingLinkerLauncher())) {
       reportError(context, content->GetOriginalExpression(),
                   "$<LINK_LANGUAGE:...> may only be used with binary targets "
                   "to specify link libraries, link directories, link options "
@@ -1641,7 +1642,8 @@ static const struct LinkLanguageAndIdNode : public cmGeneratorExpressionNode
   {
     if (!context->HeadTarget || !dagChecker ||
         !(dagChecker->EvaluatingLinkExpression() ||
-          dagChecker->EvaluatingLinkLibraries())) {
+          dagChecker->EvaluatingLinkLibraries() ||
+          dagChecker->EvaluatingLinkerLauncher())) {
       reportError(
         context, content->GetOriginalExpression(),
         "$<LINK_LANG_AND_ID:lang,id> may only be used with binary targets "
@@ -2098,7 +2100,8 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
 
     if (dagCheckerParent) {
       if (dagCheckerParent->EvaluatingGenexExpression() ||
-          dagCheckerParent->EvaluatingPICExpression()) {
+          dagCheckerParent->EvaluatingPICExpression() ||
+          dagCheckerParent->EvaluatingLinkerLauncher()) {
         // No check required.
       } else if (dagCheckerParent->EvaluatingLinkLibraries()) {
         evaluatingLinkLibraries = true;

+ 2 - 1
Source/cmMakefileTargetGenerator.cxx

@@ -1044,7 +1044,8 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
       std::string const clauncher_prop = lang + "_COMPILER_LAUNCHER";
       cmValue clauncher = this->GeneratorTarget->GetProperty(clauncher_prop);
       std::string evaluatedClauncher = cmGeneratorExpression::Evaluate(
-        *clauncher, this->LocalGenerator, config);
+        *clauncher, this->LocalGenerator, config, this->GeneratorTarget,
+        nullptr, this->GeneratorTarget, lang);
       if (!evaluatedClauncher.empty()) {
         compilerLauncher = evaluatedClauncher;
       }

+ 2 - 1
Source/cmNinjaTargetGenerator.cxx

@@ -886,7 +886,8 @@ void cmNinjaTargetGenerator::WriteCompileRule(const std::string& lang,
     std::string const clauncher_prop = cmStrCat(lang, "_COMPILER_LAUNCHER");
     cmValue clauncher = this->GeneratorTarget->GetProperty(clauncher_prop);
     std::string evaluatedClauncher = cmGeneratorExpression::Evaluate(
-      *clauncher, this->LocalGenerator, config);
+      *clauncher, this->LocalGenerator, config, this->GeneratorTarget, nullptr,
+      this->GeneratorTarget, lang);
     if (!evaluatedClauncher.empty()) {
       compilerLauncher = evaluatedClauncher;
     }

+ 1 - 1
Tests/RunCMake/CompilerLauncher/C-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=C.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/C-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=C.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/CUDA-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=CUDA.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/CUDA-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=CUDA.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/CXX-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=CXX.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/CXX-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=CXX.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/Fortran-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=Fortran.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/Fortran-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=Fortran.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/HIP-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=HIP.*

+ 0 - 1
Tests/RunCMake/CompilerLauncher/HIP-env-launch-Build-stdout.txt

@@ -1 +0,0 @@
-.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/HIP-launch-env-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=HIP.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/ISPC-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=ISPC.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/ISPC-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=ISPC.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/OBJC-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=OBJC.*

+ 0 - 1
Tests/RunCMake/CompilerLauncher/OBJC-env-launch-Build-stdout.txt

@@ -1 +0,0 @@
-.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/OBJC-launch-env-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=OBJC.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/OBJCXX-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=OBJCXX.*

+ 0 - 1
Tests/RunCMake/CompilerLauncher/OBJCXX-env-launch-Build-stdout.txt

@@ -1 +0,0 @@
-.*-E env USED_LAUNCHER=1.*

+ 1 - 0
Tests/RunCMake/CompilerLauncher/OBJCXX-launch-env-Build-stdout.txt

@@ -0,0 +1 @@
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=OBJCXX.*

+ 1 - 1
Tests/RunCMake/CompilerLauncher/RunCMakeTest.cmake

@@ -18,7 +18,7 @@ endfunction()
 function(run_compiler_launcher_env lang)
   string(REGEX REPLACE "-.*" "" core_lang "${lang}")
   # Use the noop genexp $<PATH:...> genexp to validate genexp support.
-  set(ENV{CMAKE_${core_lang}_COMPILER_LAUNCHER} "$<PATH:CMAKE_PATH,${CMAKE_COMMAND}>;-E;env;USED_LAUNCHER=1")
+  set(ENV{CMAKE_${core_lang}_COMPILER_LAUNCHER} "$<PATH:CMAKE_PATH,${CMAKE_COMMAND}>;-E;env;USED_LAUNCHER=1;TARGET_NAME=$<TARGET_PROPERTY:NAME>;LANGUAGE=$<COMPILE_LANGUAGE>")
   run_compiler_launcher(${lang})
   unset(ENV{CMAKE_${core_lang}_COMPILER_LAUNCHER})
 endfunction()

+ 1 - 1
Tests/RunCMake/LinkerLauncher/C-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=C.*

+ 1 - 1
Tests/RunCMake/LinkerLauncher/C-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=C.*

+ 1 - 1
Tests/RunCMake/LinkerLauncher/CXX-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=CXX.*

+ 1 - 1
Tests/RunCMake/LinkerLauncher/CXX-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=CXX.*

+ 1 - 1
Tests/RunCMake/LinkerLauncher/OBJC-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=OBJC.*

+ 1 - 1
Tests/RunCMake/LinkerLauncher/OBJC-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=OBJC.*

+ 1 - 1
Tests/RunCMake/LinkerLauncher/OBJCXX-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=OBJCXX.*

+ 1 - 1
Tests/RunCMake/LinkerLauncher/OBJCXX-launch-env-Build-stdout.txt

@@ -1 +1 @@
-.*-E env USED_LAUNCHER=1.*
+.*-E env USED_LAUNCHER=1 TARGET_NAME=main LANGUAGE=OBJCXX.*

+ 2 - 1
Tests/RunCMake/LinkerLauncher/RunCMakeTest.cmake

@@ -17,7 +17,8 @@ endfunction()
 
 function(run_linker_launcher_env lang)
   string(REGEX REPLACE "-.*" "" core_lang "${lang}")
-  set(ENV{CMAKE_${core_lang}_LINKER_LAUNCHER} "${CMAKE_COMMAND};-E;env;USED_LAUNCHER=1")
+  # Use the noop genexp $<PATH:...> genexp to validate genexp support.
+  set(ENV{CMAKE_${core_lang}_LINKER_LAUNCHER} "$<PATH:CMAKE_PATH,${CMAKE_COMMAND}>;-E;env;USED_LAUNCHER=1;TARGET_NAME=$<TARGET_PROPERTY:NAME>;LANGUAGE=$<LINK_LANGUAGE>")
   run_linker_launcher(${lang})
   unset(ENV{CMAKE_${core_lang}_LINKER_LAUNCHER})
 endfunction()