diff --git a/Source/cmGeneratedFileStream.cxx b/Source/cmGeneratedFileStream.cxx
index d70bc5c0ac..d0f2cc0b4f 100644
--- a/Source/cmGeneratedFileStream.cxx
+++ b/Source/cmGeneratedFileStream.cxx
@@ -162,7 +162,8 @@ void cmGeneratedFileStreamBase::Close()
 
   // Only consider replacing the destination file if no error
   // occurred.
-  if(m_Okay &&
+  if(!m_Name.empty() &&
+    m_Okay &&
     (!m_CopyIfDifferent ||
      cmSystemTools::FilesDiffer(m_TempName.c_str(), resname.c_str())))
     {
@@ -277,3 +278,14 @@ int cmGeneratedFileStreamBase::RenameFile(const char* oldname,
   return rename(oldname, newname) == 0;
 #endif
 }
+
+//----------------------------------------------------------------------------
+void cmGeneratedFileStream::SetName(const char* fname)
+{
+  if ( !fname )
+    {
+    m_Name = "";
+    return;
+    }
+  m_Name = fname;
+}
diff --git a/Source/cmGeneratedFileStream.h b/Source/cmGeneratedFileStream.h
index 6706164a55..cb81d1d145 100644
--- a/Source/cmGeneratedFileStream.h
+++ b/Source/cmGeneratedFileStream.h
@@ -130,6 +130,12 @@ public:
    * Set whether compression is done.
    */
   void SetCompression(bool compression);
+
+  /**
+   * Set name of the file that will hold the actual output. This method allows
+   * the output file to be changed during the use of cmGeneratedFileStream.
+   */
+  void SetName(const char* fname);
 };
 
 #if defined(__sgi) && !defined(__GNUC__)