diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx
index b9ffe62..61cd16e 100644
--- a/Source/cmLocalVisualStudio7Generator.cxx
+++ b/Source/cmLocalVisualStudio7Generator.cxx
@@ -1333,12 +1333,20 @@ cmLocalVisualStudio7GeneratorFCInfo
       fc.CompileFlags = cflags;
       needfc = true;
       }
+    std::string defPropName = "COMPILE_FLAGS_";
+    defPropName += configUpper;
+    if(const char* cflags = sf.GetProperty(defPropName.c_str()))
+      {
+      fc.CompileFlags = cflags;
+      needfc = true;
+      }
+
     if(const char* cdefs = sf.GetProperty("COMPILE_DEFINITIONS"))
       {
       fc.CompileDefs = cdefs;
       needfc = true;
       }
-    std::string defPropName = "COMPILE_DEFINITIONS_";
+    defPropName = "COMPILE_DEFINITIONS_";
     defPropName += configUpper;
     if(const char* ccdefs = sf.GetProperty(defPropName.c_str()))
       {
diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index 9dcd8f1..65ee87d 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -536,13 +536,28 @@ cmMakefileTargetGenerator
     {
     this->LocalGenerator->AppendFlags
       (flags, source.GetProperty("COMPILE_FLAGS"));
+ 
     *this->FlagFileStream << "# Custom flags: "
                           << relativeObj << "_FLAGS = "
                           << source.GetProperty("COMPILE_FLAGS")
                           << "\n"
                           << "\n";
     }
-
+  std::string defPropName = "COMPILE_FLAGS_";
+  defPropName +=
+    cmSystemTools::UpperCase(this->LocalGenerator->ConfigurationName);
+  if (source.GetProperty(defPropName.c_str()))
+    {
+    this->LocalGenerator->AppendFlags
+      (flags, source.GetProperty(defPropName.c_str()));
+ 
+    *this->FlagFileStream << "# Custom flags: "
+                          << relativeObj << "_FLAGS = "
+                          << source.GetProperty(defPropName.c_str())
+                          << "\n"
+                          << "\n";
+    }
+ 
   // Add language-specific defines.
   std::string defines = "$(";
   defines += lang;
@@ -559,7 +574,7 @@ cmMakefileTargetGenerator
     }
   std::string configUpper =
     cmSystemTools::UpperCase(this->LocalGenerator->ConfigurationName);
-  std::string defPropName = "COMPILE_DEFINITIONS_";
+  defPropName = "COMPILE_DEFINITIONS_";
   defPropName += configUpper;
   if(const char* config_compile_defs =
      source.GetProperty(defPropName.c_str()))
diff --git a/Source/cmSourceFile.cxx b/Source/cmSourceFile.cxx
index 42d3f06..a723471 100644
--- a/Source/cmSourceFile.cxx
+++ b/Source/cmSourceFile.cxx
@@ -401,6 +401,14 @@ void cmSourceFile::DefineProperties(cmake *cm)
      "preprocessor definitions.");
 
   cm->DefineProperty
+    ("COMPILE_FLAGS_<CONFIG>", cmProperty::SOURCE_FILE, 
+     "Per-configuration additional flags to be added when compiling this source file.",
+     "This is the configuration-specific version of "
+     "COMPILE_FLAGSS.  Note that Xcode does not support "
+     "per-configuration source file flags so this property will "
+     "be ignored by the Xcode generator.");
+
+  cm->DefineProperty
     ("COMPILE_DEFINITIONS", cmProperty::SOURCE_FILE,
      "Preprocessor definitions for compiling a source file.",
      "The COMPILE_DEFINITIONS property may be set to a "
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 8a27ffd..59cc93b 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -829,6 +829,7 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
   for( std::vector<std::string>::iterator config = configs->begin();
        config != configs->end(); ++config)
     { 
+    std::string configFlags = flags;
     std::string configUpper = cmSystemTools::UpperCase(*config);
     std::string configDefines = defines;
     std::string defPropName = "COMPILE_DEFINITIONS_";
@@ -841,9 +842,19 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
         }
       configDefines += ccdefs;
       }
+    defPropName = "COMPILE_FLAGS_";
+    defPropName += configUpper;
+    if(const char* cflags = sf.GetProperty(defPropName.c_str()))
+      {
+      if(configFlags.size())
+        {
+        configFlags += ";";
+        }
+      configFlags += cflags;
+      }
     // if we have flags or defines for this config then 
     // use them
-    if(flags.size() || configDefines.size())
+    if(configFlags.size() || configDefines.size())
       {
       (*this->BuildFileStream ) << firstString;
       firstString = ""; // only do firstString once
@@ -852,7 +863,7 @@ bool cmVisualStudio10TargetGenerator::OutputSourceSpecificFlags(
         clOptions(this->LocalGenerator,
                   10, cmVisualStudioGeneratorOptions::Compiler,
                   cmVS10CLFlagTable, 0, this);
-      clOptions.Parse(flags.c_str());
+      clOptions.Parse(configFlags.c_str());
       clOptions.AddDefines(configDefines.c_str());
       clOptions.SetConfiguration((*config).c_str());
       clOptions.OutputAdditionalOptions(*this->BuildFileStream, "      ", "");
