Browse Source

Use cascading-if for per-config test and install code

When generating per-config blocks in test and install scripts replace
the form

  IF()
    # config == A
  ENDIF()
  IF()
    # config == B
  ENDIF()

with

  IF()
    # config == A
  ELSEIF()
    # config == B
  ELSE()
    # no config matches
  ENDIF()

for clarity and to support the else() case cleanly.
Brad King 14 years ago
parent
commit
77ddb6a0cd
2 changed files with 14 additions and 2 deletions
  1. 12 2
      Source/cmScriptGenerator.cxx
  2. 2 0
      Source/cmScriptGenerator.h

+ 12 - 2
Source/cmScriptGenerator.cxx

@@ -209,6 +209,7 @@ void cmScriptGenerator::GenerateScriptActionsPerConfig(std::ostream& os,
     // In a multi-configuration generator we produce a separate rule
     // in a block for each configuration that is built.  We restrict
     // the list of configurations to those to which this rule applies.
+    bool first = true;
     for(std::vector<std::string>::const_iterator i =
           this->ConfigurationTypes->begin();
         i != this->ConfigurationTypes->end(); ++i)
@@ -218,10 +219,19 @@ void cmScriptGenerator::GenerateScriptActionsPerConfig(std::ostream& os,
         {
         // Generate a per-configuration block.
         std::string config_test = this->CreateConfigTest(config);
-        os << indent << "IF(" << config_test << ")\n";
+        os << indent << (first? "IF(" : "ELSEIF(") << config_test << ")\n";
         this->GenerateScriptForConfig(os, config, indent.Next());
-        os << indent << "ENDIF(" << config_test << ")\n";
+        first = false;
         }
       }
+    if(!first)
+      {
+      if(this->NeedsScriptNoConfig())
+        {
+        os << indent << "ELSE()\n";
+        this->GenerateScriptNoConfig(os, indent.Next());
+        }
+      os << indent << "ENDIF()\n";
+      }
     }
 }

+ 2 - 0
Source/cmScriptGenerator.h

@@ -65,6 +65,8 @@ protected:
   virtual void GenerateScriptForConfig(std::ostream& os,
                                        const char* config,
                                        Indent const& indent);
+  virtual void GenerateScriptNoConfig(std::ostream&, Indent const&) {}
+  virtual bool NeedsScriptNoConfig() const { return false; }
 
   // Test if this generator does something for a given configuration.
   bool GeneratesForConfig(const char*);