From 8f1aaf28c13094f21a835a5b0fe47f7813179126 Mon Sep 17 00:00:00 2001
From: Bill Hoffman <bill.hoffman@kitware.com>
Date: Tue, 8 Aug 2006 13:44:25 -0400
Subject: ENH: make sure RuleVariable struct is initialized correctly, also
 make sure custom command targets do not crash cmake

---
 Source/cmLocalGenerator.cxx | 41 +++++++++++++++++++++++++++--------------
 Source/cmLocalGenerator.h   | 15 +--------------
 2 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index 8447cb9..a251ee2 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -617,7 +617,11 @@ void cmLocalGenerator::AddBuildTargetRule(const char* llang, cmTarget& target)
   vars.LinkLibraries = linkLibs.c_str();
   vars.Flags = flags.c_str();
   vars.LinkFlags = linkFlags.c_str();
-
+ 
+  std::string langFlags;
+  this->AddLanguageFlags(langFlags, llang, 0);
+  vars.LanguageCompileFlags = langFlags.c_str();
+  
   cmCustomCommandLines commandLines;
   std::vector<std::string> rules;
   rules.push_back(this->Makefile->GetRequiredDefinition(createRule.c_str()));
@@ -812,30 +816,39 @@ cmLocalGenerator::ExpandRuleVariable(std::string const& variable,
         return targetQuoted;
         }
       }
-    if(variable == "LANGUAGE_COMPILE_FLAGS")
+    if(replaceValues.LanguageCompileFlags)
       {
-      return replaceValues.LanguageCompileFlags;
+      if(variable == "LANGUAGE_COMPILE_FLAGS")
+        {
+        return replaceValues.LanguageCompileFlags;
+        }
       }
-    if(variable == "TARGET")
+    if(replaceValues.Target)
       {
-      return replaceValues.Target;
+      if(variable == "TARGET")
+        {
+        return replaceValues.Target;
+        }
       }
     if(variable == "TARGET_IMPLIB")
       {
       return this->TargetImplib;
       }
-    if(variable == "TARGET_BASE")
+    if(replaceValues.Target)
       {
-      // Strip the last extension off the target name.
-      std::string targetBase = replaceValues.Target;
-      std::string::size_type pos = targetBase.rfind(".");
-      if(pos != targetBase.npos)
+      if(variable == "TARGET_BASE")
         {
+        // Strip the last extension off the target name.
+        std::string targetBase = replaceValues.Target;
+        std::string::size_type pos = targetBase.rfind(".");
+        if(pos != targetBase.npos)
+          {
         return targetBase.substr(0, pos);
-        }
-      else
-        {
-        return targetBase;
+          }
+        else
+          {
+          return targetBase;
+          }
         }
       }
     }
diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h
index 03df6cb..6a49375 100644
--- a/Source/cmLocalGenerator.h
+++ b/Source/cmLocalGenerator.h
@@ -181,20 +181,7 @@ public:
   {
     RuleVariables()
       {
-        this->Language= 0;
-        this->Objects= 0;
-        this->Target= 0;
-        this->LinkLibraries= 0;
-        this->Source= 0;
-        this->AssemblySource = 0;
-        this->PreprocessedSource = 0;
-        this->Object= 0;
-        this->ObjectDir= 0;
-        this->Flags= 0;
-        this->ObjectsQuoted= 0;
-        this->TargetSOName= 0;
-        this->TargetInstallNameDir = 0;
-        this->LinkFlags= 0;
+        memset(this, 0,  sizeof(*this));
       }
     const char* TargetPDB;
     const char* Language;
-- 
cgit v0.12