Bladeren bron

Ninja: add .def file support

Peter Kuemmel 13 jaren geleden
bovenliggende
commit
dbe3dce546

+ 2 - 0
Source/cmGlobalNinjaGenerator.h

@@ -325,6 +325,8 @@ private:
 
   typedef std::map<std::string, cmTarget*> TargetAliasMap;
   TargetAliasMap TargetAliases;
+
+  static cmLocalGenerator* LocalGenerator;
 };
 
 #endif // ! cmGlobalNinjaGenerator_h

+ 1 - 1
Source/cmLocalGenerator.cxx

@@ -1503,7 +1503,7 @@ void cmLocalGenerator::GetTargetFlags(std::string& linkLibs,
             linkFlags +=
               this->Makefile->GetSafeDefinition("CMAKE_LINK_DEF_FILE_FLAG");
             linkFlags += this->Convert(sf->GetFullPath().c_str(),
-                                       START_OUTPUT, SHELL);
+                                       FULL, SHELL);
             linkFlags += " ";
             }
           }

+ 1 - 0
Source/cmNinjaNormalTargetGenerator.cxx

@@ -285,6 +285,7 @@ cmNinjaNormalTargetGenerator
       default:
         assert(0 && "Unexpected target type");
       }
+
       const char *linkCmd =
         this->GetMakefile()->GetRequiredDefinition(linkCmdVar.c_str());
       cmSystemTools::ExpandListArgument(linkCmd, linkCmds);

+ 36 - 0
Source/cmNinjaTargetGenerator.cxx

@@ -229,6 +229,13 @@ cmNinjaDeps cmNinjaTargetGenerator::ComputeLinkDeps() const
   const std::vector<std::string> &deps = cli->GetDepends();
   cmNinjaDeps result(deps.size());
   std::transform(deps.begin(), deps.end(), result.begin(), MapToNinjaPath());
+
+  // Add a dependency on the link definitions file, if any.
+  if(!this->ModuleDefinitionFile.empty())
+    {
+    result.push_back(this->ModuleDefinitionFile);
+    }
+
   return result;
 }
 
@@ -328,6 +335,7 @@ cmNinjaTargetGenerator
   }
   vars.Flags = flags.c_str();
 
+
   // Rule for compiling object file.
   std::string compileCmdVar = "CMAKE_";
   compileCmdVar += language;
@@ -395,6 +403,8 @@ cmNinjaTargetGenerator
   if (!language) {
     if (source->GetPropertyAsBool("EXTERNAL_OBJECT"))
       this->Objects.push_back(this->GetSourceFilePath(source));
+    if(cmSystemTools::UpperCase(source->GetExtension()) == "DEF")
+      this->ModuleDefinitionFile = GetSourceFilePath(source);
     return;
   }
 
@@ -465,3 +475,29 @@ cmNinjaTargetGenerator
                                      orderOnlyDeps,
                                      vars);
 }
+
+//----------------------------------------------------------------------------
+void
+cmNinjaTargetGenerator
+::AddModuleDefinitionFlag(std::string& flags)
+{
+  if(this->ModuleDefinitionFile.empty())
+    {
+    return;
+    }
+
+  // TODO: Create a per-language flag variable.
+  const char* defFileFlag =
+    this->Makefile->GetDefinition("CMAKE_LINK_DEF_FILE_FLAG");
+  if(!defFileFlag)
+    {
+    return;
+    }
+
+  // Append the flag and value.  Use ConvertToLinkReference to help
+  // vs6's "cl -link" pass it to the linker.
+  std::string flag = defFileFlag;
+  flag += (this->LocalGenerator->ConvertToLinkReference(
+             this->ModuleDefinitionFile.c_str()));
+  this->LocalGenerator->AppendFlags(flags, flag.c_str());
+}

+ 6 - 0
Source/cmNinjaTargetGenerator.h

@@ -107,12 +107,18 @@ protected:
   cmNinjaDeps GetObjects() const
   { return this->Objects; }
 
+  // Helper to add flag for windows .def file.
+  void AddModuleDefinitionFlag(std::string& flags);
+
 private:
   cmTarget* Target;
   cmMakefile* Makefile;
   cmLocalNinjaGenerator* LocalGenerator;
   /// List of object files for this target.
   cmNinjaDeps Objects;
+
+  // The windows module definition source file (.def), if any.
+  std::string ModuleDefinitionFile;
 };
 
 #endif // ! cmNinjaTargetGenerator_h