浏览代码

ENH: Make the Fortran compiler id available to cmDependsFortran at scanning and module timestamp copy time.

Brad King 18 年之前
父节点
当前提交
c7de81f9a6
共有 3 个文件被更改,包括 35 次插入5 次删除
  1. 21 4
      Source/cmDependsFortran.cxx
  2. 2 1
      Source/cmDependsFortran.h
  3. 12 0
      Source/cmLocalUnixMakefileGenerator3.cxx

+ 21 - 4
Source/cmDependsFortran.cxx

@@ -536,7 +536,14 @@ cmDependsFortran
                                       cmLocalGenerator::HOME_OUTPUT,
                                       cmLocalGenerator::SHELL);
       makeDepends << "\t$(CMAKE_COMMAND) -E cmake_copy_f90_mod "
-                  << modFile << " " << stampFile << "\n";
+                  << modFile << " " << stampFile;
+      cmMakefile* mf = this->LocalGenerator->GetMakefile();
+      const char* cid = mf->GetDefinition("CMAKE_Fortran_COMPILER_ID");
+      if(cid && *cid)
+        {
+        makeDepends << " " << cid;
+        }
+      makeDepends << "\n";
       }
     // After copying the modules update the timestamp file so that
     // copying will not be done again until the source rebuilds.
@@ -600,6 +607,7 @@ bool cmDependsFortran::CopyModule(const std::vector<std::string>& args)
   // Implements
   //
   //   $(CMAKE_COMMAND) -E cmake_copy_f90_mod input.mod output.mod.stamp
+  //                                          [compiler-id]
   //
   // Note that the case of the .mod file depends on the compiler.  In
   // the future this copy could also account for the fact that some
@@ -608,6 +616,11 @@ bool cmDependsFortran::CopyModule(const std::vector<std::string>& args)
 
   std::string mod = args[2];
   std::string stamp = args[3];
+  std::string compilerId;
+  if(args.size() >= 5)
+    {
+    compilerId = args[4];
+    }
   std::string mod_dir = cmSystemTools::GetFilenamePath(mod);
   if(!mod_dir.empty()) { mod_dir += "/"; }
   std::string mod_upper = mod_dir;
@@ -619,7 +632,8 @@ bool cmDependsFortran::CopyModule(const std::vector<std::string>& args)
   mod_lower += ".mod";
   if(cmSystemTools::FileExists(mod_upper.c_str(), true))
     {
-    if(cmDependsFortran::ModulesDiffer(mod_upper.c_str(), stamp.c_str()))
+    if(cmDependsFortran::ModulesDiffer(mod_upper.c_str(), stamp.c_str(),
+                                       compilerId.c_str()))
       {
       if(!cmSystemTools::CopyFileAlways(mod_upper.c_str(), stamp.c_str()))
         {
@@ -633,7 +647,8 @@ bool cmDependsFortran::CopyModule(const std::vector<std::string>& args)
     }
   else if(cmSystemTools::FileExists(mod_lower.c_str(), true))
     {
-    if(cmDependsFortran::ModulesDiffer(mod_lower.c_str(), stamp.c_str()))
+    if(cmDependsFortran::ModulesDiffer(mod_lower.c_str(), stamp.c_str(),
+                                       compilerId.c_str()))
       {
       if(!cmSystemTools::CopyFileAlways(mod_lower.c_str(), stamp.c_str()))
         {
@@ -654,8 +669,10 @@ bool cmDependsFortran::CopyModule(const std::vector<std::string>& args)
 
 //----------------------------------------------------------------------------
 bool cmDependsFortran::ModulesDiffer(const char* modFile,
-                                     const char* stampFile)
+                                     const char* stampFile,
+                                     const char* compilerId)
 {
+  (void)compilerId;
   /*
   This following is valid for intel and gnu. For others this may be valid
   too, but has to be proven.

+ 2 - 1
Source/cmDependsFortran.h

@@ -48,7 +48,8 @@ public:
 
   /** Determine if a mod file and the corresponding mod.stamp file
       are representing  different module information. */
-  static bool  ModulesDiffer(const char* modFile, const char* stampFile);
+  static bool  ModulesDiffer(const char* modFile, const char* stampFile,
+                             const char* compilerId);
 
   /** Method to find an included file in the include path.  Fortran
       always searches the directory containing the including source

+ 12 - 0
Source/cmLocalUnixMakefileGenerator3.cxx

@@ -1780,6 +1780,18 @@ void cmLocalUnixMakefileGenerator3
       cmakefileStream << "\"" << pi->first << "\"\n";
       }
     cmakefileStream << "  )\n";
+
+    // Tell the dependency scanner what compiler is used.
+    std::string cidVar = "CMAKE_";
+    cidVar += l->first;
+    cidVar += "_COMPILER_ID";
+    const char* cid = this->Makefile->GetDefinition(cidVar.c_str());
+    if(cid && *cid)
+      {
+      cmakefileStream
+        << "SET(CMAKE_" << l->first.c_str() << "_COMPILER_ID \""
+        << cid << "\")\n";
+      }
     }
 }