Jelajahi Sumber

Merge topic 'ninja-intel-ipo'

b6e2e0d1 Ninja: Fix Intel interprocedural optimization with static libraries
5d12b87b cmGeneratorTarget: Improve GetCreateRuleVariable API
c2eeb08b cmTarget: Add GetFeatureAsBool method
Brad King 11 tahun lalu
induk
melakukan
3ea9bde845

+ 19 - 5
Source/cmGeneratorTarget.cxx

@@ -943,18 +943,32 @@ void cmGeneratorTarget::GetAppleArchs(const std::string& config,
 }
 
 //----------------------------------------------------------------------------
-const char* cmGeneratorTarget::GetCreateRuleVariable() const
+std::string
+cmGeneratorTarget::GetCreateRuleVariable(std::string const& lang,
+                                         std::string const& config) const
 {
   switch(this->GetType())
     {
     case cmTarget::STATIC_LIBRARY:
-      return "_CREATE_STATIC_LIBRARY";
+      {
+      std::string var = "CMAKE_" + lang + "_CREATE_STATIC_LIBRARY";
+      if(this->Target->GetFeatureAsBool(
+           "INTERPROCEDURAL_OPTIMIZATION", config))
+        {
+        std::string varIPO = var + "_IPO";
+        if(this->Makefile->GetDefinition(varIPO))
+          {
+          return varIPO;
+          }
+        }
+      return var;
+      }
     case cmTarget::SHARED_LIBRARY:
-      return "_CREATE_SHARED_LIBRARY";
+      return "CMAKE_" + lang + "_CREATE_SHARED_LIBRARY";
     case cmTarget::MODULE_LIBRARY:
-      return "_CREATE_SHARED_MODULE";
+      return "CMAKE_" + lang + "_CREATE_SHARED_MODULE";
     case cmTarget::EXECUTABLE:
-      return "_LINK_EXECUTABLE";
+      return "CMAKE_" + lang + "_LINK_EXECUTABLE";
     default:
       break;
     }

+ 3 - 3
Source/cmGeneratorTarget.h

@@ -75,9 +75,9 @@ public:
   void GetAppleArchs(const std::string& config,
                      std::vector<std::string>& archVec) const;
 
-  ///! Return the rule variable used to create this type of target,
-  //  need to add CMAKE_(LANG) for full name.
-  const char* GetCreateRuleVariable() const;
+  /** Return the rule variable used to create this type of target.  */
+  std::string GetCreateRuleVariable(std::string const& lang,
+                                    std::string const& config) const;
 
   /** Get the include directories for this target.  */
   std::vector<std::string> GetIncludeDirectories(

+ 3 - 5
Source/cmLocalGenerator.cxx

@@ -657,10 +657,10 @@ void cmLocalGenerator::AddBuildTargetRule(const std::string& llang,
 {
   std::string objs;
   std::vector<std::string> objVector;
+  std::string config = this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
   // Add all the sources outputs to the depends of the target
   std::vector<cmSourceFile*> classes;
-  target.GetSourceFiles(classes,
-                      this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE"));
+  target.GetSourceFiles(classes, config);
   for(std::vector<cmSourceFile*>::const_iterator i = classes.begin();
       i != classes.end(); ++i)
     {
@@ -686,9 +686,7 @@ void cmLocalGenerator::AddBuildTargetRule(const std::string& llang,
         }
       }
     }
-  std::string createRule = "CMAKE_";
-  createRule += llang;
-  createRule += target.GetCreateRuleVariable();
+  std::string createRule = target.GetCreateRuleVariable(llang, config);
   bool useWatcomQuote = this->Makefile->IsOn(createRule+"_USE_WATCOM_QUOTE");
   std::string targetName = target.Target->GetFullName();
   // Executable :

+ 1 - 1
Source/cmMakefileTargetGenerator.cxx

@@ -2105,7 +2105,7 @@ const char* cmMakefileTargetGenerator::GetFeature(const std::string& feature)
 //----------------------------------------------------------------------------
 bool cmMakefileTargetGenerator::GetFeatureAsBool(const std::string& feature)
 {
-  return cmSystemTools::IsOn(this->GetFeature(feature));
+  return this->Target->GetFeatureAsBool(feature, this->ConfigName);
 }
 
 //----------------------------------------------------------------------------

+ 5 - 5
Source/cmNinjaNormalTargetGenerator.cxx

@@ -314,9 +314,8 @@ cmNinjaNormalTargetGenerator
   std::vector<std::string> linkCmds;
   cmMakefile* mf = this->GetMakefile();
   {
-  std::string linkCmdVar = "CMAKE_";
-  linkCmdVar += this->TargetLinkLanguage;
-  linkCmdVar += this->GetGeneratorTarget()->GetCreateRuleVariable();
+  std::string linkCmdVar = this->GetGeneratorTarget()
+    ->GetCreateRuleVariable(this->TargetLinkLanguage, this->GetConfigName());
   const char *linkCmd = mf->GetDefinition(linkCmdVar);
   if (linkCmd)
     {
@@ -451,8 +450,9 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
   std::string linkPath;
   cmGeneratorTarget& genTarget = *this->GetGeneratorTarget();
 
-  std::string createRule = "CMAKE_";
-  createRule += this->TargetLinkLanguage + genTarget.GetCreateRuleVariable();
+  std::string createRule =
+    genTarget.GetCreateRuleVariable(this->TargetLinkLanguage,
+                                    this->GetConfigName());
   bool useWatcomQuote = mf->IsOn(createRule+"_USE_WATCOM_QUOTE");
   cmLocalNinjaGenerator& localGen = *this->GetLocalGenerator();
   localGen.GetTargetFlags(vars["LINK_LIBRARIES"],

+ 1 - 1
Source/cmNinjaTargetGenerator.cxx

@@ -105,7 +105,7 @@ const char* cmNinjaTargetGenerator::GetFeature(const std::string& feature)
 // TODO: Picked up from cmMakefileTargetGenerator.  Refactor it.
 bool cmNinjaTargetGenerator::GetFeatureAsBool(const std::string& feature)
 {
-  return cmSystemTools::IsOn(this->GetFeature(feature));
+  return this->Target->GetFeatureAsBool(feature, this->GetConfigName());
 }
 
 // TODO: Picked up from cmMakefileTargetGenerator.  Refactor it.

+ 7 - 0
Source/cmTarget.cxx

@@ -3181,6 +3181,13 @@ const char* cmTarget::GetFeature(const std::string& feature,
   return this->Makefile->GetFeature(feature, config);
 }
 
+//----------------------------------------------------------------------------
+bool cmTarget::GetFeatureAsBool(const std::string& feature,
+                                const std::string& config) const
+{
+  return cmSystemTools::IsOn(this->GetFeature(feature, config));
+}
+
 //----------------------------------------------------------------------------
 bool cmTarget::HandleLocationPropertyPolicy(cmMakefile* context) const
 {

+ 2 - 0
Source/cmTarget.h

@@ -237,6 +237,8 @@ public:
 
   const char* GetFeature(const std::string& feature,
                          const std::string& config) const;
+  bool GetFeatureAsBool(const std::string& feature,
+                        const std::string& config) const;
 
   bool IsImported() const {return this->IsImportedTarget;}