diff --git a/Source/cmGetCMakePropertyCommand.cxx b/Source/cmGetCMakePropertyCommand.cxx
index a460ca6ed1aa08e4266c264ad7127748144399d4..99e2867c3749959c829f40de8960865dddd212b5 100644
--- a/Source/cmGetCMakePropertyCommand.cxx
+++ b/Source/cmGetCMakePropertyCommand.cxx
@@ -41,7 +41,10 @@ bool cmGetCMakePropertyCommand
   else if ( args[1] == "MACROS" )
     {
     output.clear();
-    this->Makefile->GetListOfMacros(output);
+    if (const char* macrosProp = this->Makefile->GetProperty("MACROS"))
+      {
+      output = macrosProp;
+      }
     }
   else if ( args[1] == "COMPONENTS" )
     {
diff --git a/Source/cmMacroCommand.cxx b/Source/cmMacroCommand.cxx
index 6d3054a1b9dc698a86ca37edf7b87c5de38c282f..fa5a623543d641c04a64027aeb0ac188f6da935c 100644
--- a/Source/cmMacroCommand.cxx
+++ b/Source/cmMacroCommand.cxx
@@ -211,7 +211,7 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf,
     // if this is the endmacro for this macro then execute
     if (!this->Depth)
       {
-      mf.AddMacro(this->Args[0].c_str());
+      mf.AppendProperty("MACROS", this->Args[0].c_str());
       // create a new command and add it to cmake
       cmMacroHelperCommand *f = new cmMacroHelperCommand();
       f->Args = this->Args;
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 3c8a41d29a0e6aadea6ea0afa28be4fbf3d3964b..14ef934720eafe28f48c335f6d5cbf88bb9ff7a8 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -3817,18 +3817,6 @@ cmVariableWatch *cmMakefile::GetVariableWatch() const
 }
 #endif
 
-void cmMakefile::AddMacro(const char* name)
-{
-  assert(name);
-  this->MacrosList.push_back(name);
-}
-
-void cmMakefile::GetListOfMacros(std::string& macros) const
-{
-  assert(macros.empty());
-  macros = cmJoin(this->MacrosList, ";");
-}
-
 cmState *cmMakefile::GetState() const
 {
   return this->GetCMakeInstance()->GetState();
@@ -4265,11 +4253,6 @@ const char *cmMakefile::GetProperty(const std::string& prop,
     output = cmJoin(this->GetDefinitions(), ";");
     return output.c_str();
     }
-  else if (prop == "MACROS")
-    {
-    this->GetListOfMacros(output);
-    return output.c_str();
-    }
   else if (prop == "INCLUDE_DIRECTORIES")
     {
     std::string sep;
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 98d199a2e5800341d96c6f01768e34a72b29242d..489a8b124376cf55d2ef040aaa3f14ae7db1294e 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -655,12 +655,6 @@ public:
    */
   cmSourceFile *GetSourceFileWithOutput(const std::string& outName) const;
 
-  /**
-   * Add a macro to the list of macros. The arguments should be name of the
-   * macro and a documentation signature of it
-   */
-  void AddMacro(const char* name);
-
   ///! Add a new cmTest to the list of tests for this makefile.
   cmTest* CreateTest(const std::string& testName);
 
@@ -669,11 +663,6 @@ public:
    */
   cmTest* GetTest(const std::string& testName) const;
 
-  /**
-   * Get a list of macros as a ; separated string
-   */
-  void GetListOfMacros(std::string& macros) const;
-
   /**
    * Return a location of a file in cmake or custom modules directory
    */
@@ -909,8 +898,6 @@ private:
 
   std::stack<int> LoopBlockCounter;
 
-  std::vector<std::string> MacrosList;
-
   mutable cmsys::RegularExpression cmDefineRegex;
   mutable cmsys::RegularExpression cmDefine01Regex;
   mutable cmsys::RegularExpression cmAtVarRegex;