Explorar o código

Set Intel .vfproj RuntimeLibrary attribute

Look for the "/threads", "/libs:dll", and "/dbglibs" flags and convert
them to the proper RuntimeLibrary attribute value in the IDE.  This is
a 3-to-1 flag mapping and such needs special handling in the parser.
Brad King %!s(int64=15) %!d(string=hai) anos
pai
achega
22aec406e6

+ 1 - 0
Source/cmLocalVisualStudio7Generator.cxx

@@ -669,6 +669,7 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(std::ostream& fout,
   targetOptions.FixExceptionHandlingDefault();
   targetOptions.Parse(flags.c_str());
   targetOptions.Parse(defineFlags.c_str());
+  targetOptions.ParseFinish();
   targetOptions.AddDefines
     (this->Makefile->GetProperty("COMPILE_DEFINITIONS"));
   targetOptions.AddDefines(target.GetProperty("COMPILE_DEFINITIONS"));

+ 51 - 0
Source/cmVisualStudioGeneratorOptions.cxx

@@ -45,6 +45,10 @@ cmVisualStudioGeneratorOptions
 
   // Slash options are allowed for VS.
   this->AllowSlash = true;
+
+  this->FortranRuntimeDebug = false;
+  this->FortranRuntimeDLL = false;
+  this->FortranRuntimeMT = false;
 }
 
 //----------------------------------------------------------------------------
@@ -132,9 +136,56 @@ void cmVisualStudioGeneratorOptions::Parse(const char* flags)
     }
 }
 
+//----------------------------------------------------------------------------
+void cmVisualStudioGeneratorOptions::ParseFinish()
+{
+  if(this->CurrentTool == FortranCompiler)
+    {
+    // "RuntimeLibrary" attribute values:
+    //  "rtMultiThreaded", "0", /threads /libs:static
+    //  "rtMultiThreadedDLL", "2", /threads /libs:dll
+    //  "rtMultiThreadedDebug", "1", /threads /dbglibs /libs:static
+    //  "rtMultiThreadedDebugDLL", "3", /threads /dbglibs /libs:dll
+    // These seem unimplemented by the IDE:
+    //  "rtSingleThreaded", "4", /libs:static
+    //  "rtSingleThreadedDLL", "10", /libs:dll
+    //  "rtSingleThreadedDebug", "5", /dbglibs /libs:static
+    //  "rtSingleThreadedDebugDLL", "11", /dbglibs /libs:dll
+    std::string rl = "rtMultiThreaded";
+    rl += this->FortranRuntimeDebug? "Debug" : "";
+    rl += this->FortranRuntimeDLL? "DLL" : "";
+    this->FlagMap["RuntimeLibrary"] = rl;
+    }
+}
+
 //----------------------------------------------------------------------------
 void cmVisualStudioGeneratorOptions::StoreUnknownFlag(const char* flag)
 {
+  // Look for Intel Fortran flags that do not map well in the flag table.
+  if(this->CurrentTool == FortranCompiler)
+    {
+    if(strcmp(flag, "/dbglibs") == 0)
+      {
+      this->FortranRuntimeDebug = true;
+      return;
+      }
+    if(strcmp(flag, "/threads") == 0)
+      {
+      this->FortranRuntimeMT = true;
+      return;
+      }
+    if(strcmp(flag, "/libs:dll") == 0)
+      {
+      this->FortranRuntimeDLL = true;
+      return;
+      }
+    if(strcmp(flag, "/libs:static") == 0)
+      {
+      this->FortranRuntimeDLL = false;
+      return;
+      }
+    }
+
   // This option is not known.  Store it in the output flags.
   this->FlagString += " ";
   this->FlagString +=

+ 5 - 0
Source/cmVisualStudioGeneratorOptions.h

@@ -39,6 +39,7 @@ public:
 
   // Store options from command line flags.
   void Parse(const char* flags);
+  void ParseFinish();
 
   // Fix the ExceptionHandling option to default to off.
   void FixExceptionHandlingDefault();
@@ -67,6 +68,10 @@ private:
   Tool CurrentTool;
   cmVisualStudio10TargetGenerator* TargetGenerator;
 
+  bool FortranRuntimeDebug;
+  bool FortranRuntimeDLL;
+  bool FortranRuntimeMT;
+
   virtual void StoreUnknownFlag(const char* flag);
 };