浏览代码

Makefile: Refactor checks for lang-specific targets and export compile cmds

The checks are now split into languages that are able to generate
assembly listings, languages that are able to generate preprocessed
listings, and languages that are able to export the compile commands.
Tim Gallagher 11 年之前
父节点
当前提交
0842b08463
共有 2 个文件被更改,包括 34 次插入22 次删除
  1. 24 18
      Source/cmLocalUnixMakefileGenerator3.cxx
  2. 10 4
      Source/cmMakefileTargetGenerator.cxx

+ 24 - 18
Source/cmLocalUnixMakefileGenerator3.cxx

@@ -315,36 +315,42 @@ void cmLocalUnixMakefileGenerator3::WriteLocalMakefile()
 
 
     // Check whether preprocessing and assembly rules make sense.
     // Check whether preprocessing and assembly rules make sense.
     // They make sense only for C and C++ sources.
     // They make sense only for C and C++ sources.
-    bool lang_is_c_or_cxx = false;
+    bool lang_has_preprocessor = false;
+    bool lang_has_assembly = false;
+
     for(std::vector<LocalObjectEntry>::const_iterator ei =
     for(std::vector<LocalObjectEntry>::const_iterator ei =
           lo->second.begin(); ei != lo->second.end(); ++ei)
           lo->second.begin(); ei != lo->second.end(); ++ei)
       {
       {
-      if(ei->Language == "C" || ei->Language == "CXX")
+      if(ei->Language == "C" ||
+         ei->Language == "CXX")
         {
         {
-        lang_is_c_or_cxx = true;
+        // Right now, C and C++ have both a preprocessor and the
+        // ability to generate assembly code
+        lang_has_preprocessor = true;
+        lang_has_assembly = true;
         break;
         break;
         }
         }
       }
       }
 
 
     // Add convenience rules for preprocessed and assembly files.
     // Add convenience rules for preprocessed and assembly files.
-    if(lang_is_c_or_cxx && (do_preprocess_rules || do_assembly_rules))
+    if(lang_has_preprocessor && do_preprocess_rules)
       {
       {
       std::string::size_type dot_pos = lo->first.rfind(".");
       std::string::size_type dot_pos = lo->first.rfind(".");
       std::string base = lo->first.substr(0, dot_pos);
       std::string base = lo->first.substr(0, dot_pos);
-      if(do_preprocess_rules)
-        {
-        this->WriteObjectConvenienceRule(
-          ruleFileStream, "target to preprocess a source file",
-          (base + ".i").c_str(), lo->second);
-          lo->second.HasPreprocessRule = true;
-        }
-      if(do_assembly_rules)
-        {
-        this->WriteObjectConvenienceRule(
-          ruleFileStream, "target to generate assembly for a file",
-          (base + ".s").c_str(), lo->second);
-          lo->second.HasAssembleRule = true;
-        }
+      this->WriteObjectConvenienceRule(
+        ruleFileStream, "target to preprocess a source file",
+       (base + ".i").c_str(), lo->second);
+      lo->second.HasPreprocessRule = true;
+      }
+
+    if(lang_has_assembly && do_assembly_rules)
+      {
+      std::string::size_type dot_pos = lo->first.rfind(".");
+      std::string base = lo->first.substr(0, dot_pos);
+      this->WriteObjectConvenienceRule(
+       ruleFileStream, "target to generate assembly for a file",
+       (base + ".s").c_str(), lo->second);
+      lo->second.HasAssembleRule = true;
       }
       }
     }
     }
 
 

+ 10 - 4
Source/cmMakefileTargetGenerator.cxx

@@ -702,7 +702,13 @@ cmMakefileTargetGenerator
 
 
   vars.Defines = definesString.c_str();
   vars.Defines = definesString.c_str();
 
 
-  bool lang_is_c_or_cxx = ((lang == "C") || (lang == "CXX"));
+  // At the moment, it is assumed that C and C++ have both
+  // assembly and preprocessor capabilities. The same is true for the
+  // ability to export compile commands
+  bool lang_has_preprocessor = ((lang == "C") ||
+                                (lang == "CXX"));
+  bool const lang_has_assembly = lang_has_preprocessor;
+  bool const lang_can_export_cmds = lang_has_preprocessor;
 
 
   // Construct the compile rules.
   // Construct the compile rules.
   {
   {
@@ -715,7 +721,7 @@ cmMakefileTargetGenerator
   cmSystemTools::ExpandListArgument(compileRule, compileCommands);
   cmSystemTools::ExpandListArgument(compileRule, compileCommands);
 
 
   if (this->Makefile->IsOn("CMAKE_EXPORT_COMPILE_COMMANDS") &&
   if (this->Makefile->IsOn("CMAKE_EXPORT_COMPILE_COMMANDS") &&
-      lang_is_c_or_cxx && compileCommands.size() == 1)
+      lang_can_export_cmds && compileCommands.size() == 1)
     {
     {
     std::string compileCommand = compileCommands[0];
     std::string compileCommand = compileCommands[0];
     this->LocalGenerator->ExpandRuleVariables(compileCommand, vars);
     this->LocalGenerator->ExpandRuleVariables(compileCommand, vars);
@@ -771,9 +777,9 @@ cmMakefileTargetGenerator
       }
       }
     }
     }
 
 
-  bool do_preprocess_rules = lang_is_c_or_cxx &&
+  bool do_preprocess_rules = lang_has_preprocessor &&
     this->LocalGenerator->GetCreatePreprocessedSourceRules();
     this->LocalGenerator->GetCreatePreprocessedSourceRules();
-  bool do_assembly_rules = lang_is_c_or_cxx &&
+  bool do_assembly_rules = lang_has_assembly &&
     this->LocalGenerator->GetCreateAssemblySourceRules();
     this->LocalGenerator->GetCreateAssemblySourceRules();
   if(do_preprocess_rules || do_assembly_rules)
   if(do_preprocess_rules || do_assembly_rules)
     {
     {