diff --git a/Help/command/install.rst b/Help/command/install.rst
index c99ed73..9c17bba 100644
--- a/Help/command/install.rst
+++ b/Help/command/install.rst
@@ -192,6 +192,10 @@ The list of ``files...`` given to ``FILES`` or ``PROGRAMS`` may use
 However, if any item begins in a generator expression it must evaluate
 to a full path.
 
+The install destination given to the files install ``DESTINATION`` may
+use "generator expressions" with the syntax ``$<...>``.  See the
+:manual:`cmake-generator-expressions(7)` manual for available expressions.
+
 Installing Directories
 ^^^^^^^^^^^^^^^^^^^^^^
 
diff --git a/Help/release/dev/INSTALL_DESTINATION-genex.rst b/Help/release/dev/INSTALL_DESTINATION-genex.rst
new file mode 100644
index 0000000..5b242ce
--- /dev/null
+++ b/Help/release/dev/INSTALL_DESTINATION-genex.rst
@@ -0,0 +1,5 @@
+INSTALL_DESTINATION-genex
+-------------------------
+
+* The :command:`install` command ``DESTINATION`` option learned to support
+  :manual:`generator expressions <cmake-generator-expressions(7)>`.
diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx
index 333c2ff..d9e8823 100644
--- a/Source/cmInstallCommand.cxx
+++ b/Source/cmInstallCommand.cxx
@@ -27,7 +27,9 @@ static cmInstallTargetGenerator* CreateInstallTargetGenerator(cmTarget& target,
 {
   cmInstallGenerator::MessageLevel message =
     cmInstallGenerator::SelectMessageLevel(target.GetMakefile());
-  return new cmInstallTargetGenerator(target.GetName(),
+  return new cmInstallTargetGenerator(
+                        target.GetMakefile(),
+                        target.GetName(),
                         args.GetDestination().c_str(),
                         impLib, args.GetPermissions().c_str(),
                         args.GetConfigurations(), args.GetComponent().c_str(),
@@ -43,6 +45,7 @@ static cmInstallFilesGenerator* CreateInstallFilesGenerator(
   cmInstallGenerator::MessageLevel message =
     cmInstallGenerator::SelectMessageLevel(mf);
   return new cmInstallFilesGenerator(
+                        mf,
                         absFiles, args.GetDestination().c_str(),
                         programs, args.GetPermissions().c_str(),
                         args.GetConfigurations(), args.GetComponent().c_str(),
@@ -173,7 +176,8 @@ bool cmInstallCommand::HandleScriptMode(std::vector<std::string> const& args)
         return false;
         }
       this->Makefile->AddInstallGenerator(
-        new cmInstallScriptGenerator(script.c_str(), false,
+        new cmInstallScriptGenerator(this->Makefile,
+                                     script.c_str(), false,
                                      component.c_str()));
       }
     else if(doing_code)
@@ -181,7 +185,8 @@ bool cmInstallCommand::HandleScriptMode(std::vector<std::string> const& args)
       doing_code = false;
       std::string code = args[i];
       this->Makefile->AddInstallGenerator(
-        new cmInstallScriptGenerator(code.c_str(), true,
+        new cmInstallScriptGenerator(this->Makefile,
+                                     code.c_str(), true,
                                      component.c_str()));
       }
     }
@@ -1272,7 +1277,8 @@ cmInstallCommand::HandleDirectoryMode(std::vector<std::string> const& args)
 
   // Create the directory install generator.
   this->Makefile->AddInstallGenerator(
-    new cmInstallDirectoryGenerator(dirs, destination,
+    new cmInstallDirectoryGenerator(this->Makefile,
+                                    dirs, destination,
                                     permissions_file.c_str(),
                                     permissions_dir.c_str(),
                                     configurations,
@@ -1402,6 +1408,7 @@ bool cmInstallCommand::HandleExportMode(std::vector<std::string> const& args)
   // Create the export install generator.
   cmInstallExportGenerator* exportGenerator =
     new cmInstallExportGenerator(
+      this->Makefile,
       exportSet,
       ica.GetDestination().c_str(),
       ica.GetPermissions().c_str(), ica.GetConfigurations(),
diff --git a/Source/cmInstallDirectoryGenerator.cxx b/Source/cmInstallDirectoryGenerator.cxx
index 7593380..a604e0b 100644
--- a/Source/cmInstallDirectoryGenerator.cxx
+++ b/Source/cmInstallDirectoryGenerator.cxx
@@ -15,7 +15,8 @@
 
 //----------------------------------------------------------------------------
 cmInstallDirectoryGenerator
-::cmInstallDirectoryGenerator(std::vector<std::string> const& dirs,
+::cmInstallDirectoryGenerator(cmMakefile* mf,
+                              std::vector<std::string> const& dirs,
                               const char* dest,
                               const char* file_permissions,
                               const char* dir_permissions,
@@ -24,7 +25,7 @@ cmInstallDirectoryGenerator
                               MessageLevel message,
                               const char* literal_args,
                               bool optional):
-  cmInstallGenerator(dest, configurations, component, message),
+  cmInstallGenerator(mf, dest, configurations, component, message),
   Directories(dirs),
   FilePermissions(file_permissions), DirPermissions(dir_permissions),
   LiteralArguments(literal_args), Optional(optional)
@@ -45,7 +46,7 @@ cmInstallDirectoryGenerator::GenerateScriptActions(std::ostream& os,
   // Write code to install the directories.
   const char* no_rename = 0;
   this->AddInstallRule(os,
-                       this->Destination,
+                       this->GetDestination(),
                        cmInstallType_DIRECTORY,
                        this->Directories,
                        this->Optional,
diff --git a/Source/cmInstallDirectoryGenerator.h b/Source/cmInstallDirectoryGenerator.h
index 165ab91..d3b3def 100644
--- a/Source/cmInstallDirectoryGenerator.h
+++ b/Source/cmInstallDirectoryGenerator.h
@@ -20,7 +20,8 @@
 class cmInstallDirectoryGenerator: public cmInstallGenerator
 {
 public:
-  cmInstallDirectoryGenerator(std::vector<std::string> const& dirs,
+  cmInstallDirectoryGenerator(cmMakefile* mf,
+                              std::vector<std::string> const& dirs,
                               const char* dest,
                               const char* file_permissions,
                               const char* dir_permissions,
diff --git a/Source/cmInstallExportGenerator.cxx b/Source/cmInstallExportGenerator.cxx
index 97b9405..55ef580 100644
--- a/Source/cmInstallExportGenerator.cxx
+++ b/Source/cmInstallExportGenerator.cxx
@@ -27,6 +27,7 @@
 
 //----------------------------------------------------------------------------
 cmInstallExportGenerator::cmInstallExportGenerator(
+  cmMakefile* mf,
   cmExportSet* exportSet,
   const char* destination,
   const char* file_permissions,
@@ -35,7 +36,7 @@ cmInstallExportGenerator::cmInstallExportGenerator(
   MessageLevel message,
   const char* filename, const char* name_space,
   bool exportOld)
-  :cmInstallGenerator(destination, configurations, component, message)
+  :cmInstallGenerator(mf, destination, configurations, component, message)
   ,ExportSet(exportSet)
   ,FilePermissions(file_permissions)
   ,FileName(filename)
@@ -67,7 +68,7 @@ void cmInstallExportGenerator::ComputeTempDir()
       this->LocalGenerator->GetMakefile()->GetCurrentBinaryDirectory();
   this->TempDir += cmake::GetCMakeFilesDirectory();
   this->TempDir += "/Export";
-  if(this->Destination.empty())
+  if(this->GetDestination().empty())
     {
     return;
     }
@@ -87,7 +88,7 @@ void cmInstallExportGenerator::ComputeTempDir()
     {
     // Keep the total path length below the limit.
     std::string::size_type max_len = max_total_len - this->TempDir.size();
-    if(this->Destination.size() > max_len)
+    if(this->GetDestination().size() > max_len)
       {
       useMD5 = true;
       }
@@ -100,11 +101,11 @@ void cmInstallExportGenerator::ComputeTempDir()
     {
     // Replace the destination path with a hash to keep it short.
     this->TempDir +=
-      cmSystemTools::ComputeStringMD5(this->Destination);
+      cmSystemTools::ComputeStringMD5(this->GetDestination());
     }
   else
     {
-    std::string dest = this->Destination;
+    std::string dest = this->GetDestination();
     // Avoid unix full paths.
     if(dest[0] == '/')
       {
@@ -190,7 +191,7 @@ cmInstallExportGenerator::GenerateScriptConfigs(std::ostream& os,
     files.push_back(i->second);
     std::string config_test = this->CreateConfigTest(i->first);
     os << indent << "if(" << config_test << ")\n";
-    this->AddInstallRule(os, this->Destination,
+    this->AddInstallRule(os, this->GetDestination(),
                          cmInstallType_FILES, files, false,
                          this->FilePermissions.c_str(), 0, 0, 0,
                          indent.Next());
@@ -205,7 +206,7 @@ void cmInstallExportGenerator::GenerateScriptActions(std::ostream& os,
 {
   // Remove old per-configuration export files if the main changes.
   std::string installedDir = "$ENV{DESTDIR}";
-  installedDir += this->ConvertToAbsoluteDestination(this->Destination);
+  installedDir += this->ConvertToAbsoluteDestination(this->GetDestination());
   installedDir += "/";
   std::string installedFile = installedDir;
   installedFile += this->FileName;
@@ -230,7 +231,7 @@ void cmInstallExportGenerator::GenerateScriptActions(std::ostream& os,
   // Install the main export file.
   std::vector<std::string> files;
   files.push_back(this->MainImportFile);
-  this->AddInstallRule(os, this->Destination,
+  this->AddInstallRule(os, this->GetDestination(),
                        cmInstallType_FILES, files, false,
                        this->FilePermissions.c_str(), 0, 0, 0, indent);
 }
diff --git a/Source/cmInstallExportGenerator.h b/Source/cmInstallExportGenerator.h
index 885ed05..d87dbeb 100644
--- a/Source/cmInstallExportGenerator.h
+++ b/Source/cmInstallExportGenerator.h
@@ -26,7 +26,8 @@ class cmMakefile;
 class cmInstallExportGenerator: public cmInstallGenerator
 {
 public:
-  cmInstallExportGenerator(cmExportSet* exportSet,
+  cmInstallExportGenerator(cmMakefile* mf,
+                           cmExportSet* exportSet,
                            const char* dest, const char* file_permissions,
                            const std::vector<std::string>& configurations,
                            const char* component,
@@ -43,9 +44,6 @@ public:
 
   const std::string& GetNamespace() const { return this->Namespace; }
 
-  std::string const& GetDestination() const
-    { return this->Destination; }
-
 protected:
   virtual void GenerateScript(std::ostream& os);
   virtual void GenerateScriptConfigs(std::ostream& os, Indent const& indent);
diff --git a/Source/cmInstallFilesCommand.cxx b/Source/cmInstallFilesCommand.cxx
index 68557bd..c714a52 100644
--- a/Source/cmInstallFilesCommand.cxx
+++ b/Source/cmInstallFilesCommand.cxx
@@ -128,7 +128,8 @@ void cmInstallFilesCommand::CreateInstallGenerator() const
   cmInstallGenerator::MessageLevel message =
     cmInstallGenerator::SelectMessageLevel(this->Makefile);
   this->Makefile->AddInstallGenerator(
-    new cmInstallFilesGenerator(this->Files,
+    new cmInstallFilesGenerator(this->Makefile,
+                                this->Files,
                                 destination.c_str(), false,
                                 no_permissions, no_configurations,
                                 no_component.c_str(), message, no_rename));
diff --git a/Source/cmInstallFilesGenerator.cxx b/Source/cmInstallFilesGenerator.cxx
index c18b174..a18954d 100644
--- a/Source/cmInstallFilesGenerator.cxx
+++ b/Source/cmInstallFilesGenerator.cxx
@@ -18,7 +18,8 @@
 
 //----------------------------------------------------------------------------
 cmInstallFilesGenerator
-::cmInstallFilesGenerator(std::vector<std::string> const& files,
+::cmInstallFilesGenerator(cmMakefile* mf,
+                          std::vector<std::string> const& files,
                           const char* dest, bool programs,
                           const char* file_permissions,
                           std::vector<std::string> const& configurations,
@@ -26,7 +27,7 @@ cmInstallFilesGenerator
                           MessageLevel message,
                           const char* rename,
                           bool optional):
-  cmInstallGenerator(dest, configurations, component, message),
+  cmInstallGenerator(mf, dest, configurations, component, message),
   LocalGenerator(0),
   Files(files),
   FilePermissions(file_permissions),
@@ -64,7 +65,7 @@ void cmInstallFilesGenerator::AddFilesInstallRule(
   // Write code to install the files.
   const char* no_dir_permissions = 0;
   this->AddInstallRule(os,
-                       this->Destination,
+                       this->GetDestination(),
                        (this->Programs
                         ? cmInstallType_PROGRAMS
                         : cmInstallType_FILES),
diff --git a/Source/cmInstallFilesGenerator.h b/Source/cmInstallFilesGenerator.h
index 00b3a79..baf30ae 100644
--- a/Source/cmInstallFilesGenerator.h
+++ b/Source/cmInstallFilesGenerator.h
@@ -20,7 +20,8 @@
 class cmInstallFilesGenerator: public cmInstallGenerator
 {
 public:
-  cmInstallFilesGenerator(std::vector<std::string> const& files,
+  cmInstallFilesGenerator(cmMakefile* mf,
+                          std::vector<std::string> const& files,
                           const char* dest, bool programs,
                           const char* file_permissions,
                           std::vector<std::string> const& configurations,
diff --git a/Source/cmInstallGenerator.cxx b/Source/cmInstallGenerator.cxx
index 2e1c5f0..2e8e744 100644
--- a/Source/cmInstallGenerator.cxx
+++ b/Source/cmInstallGenerator.cxx
@@ -16,15 +16,22 @@
 
 //----------------------------------------------------------------------------
 cmInstallGenerator
-::cmInstallGenerator(const char* destination,
+::cmInstallGenerator(cmMakefile* mf,
+                     const char* destination,
                      std::vector<std::string> const& configurations,
                      const char* component,
                      MessageLevel message):
   cmScriptGenerator("CMAKE_INSTALL_CONFIG_NAME", configurations),
+  Makefile(mf),
   Destination(destination? destination:""),
   Component(component? component:""),
   Message(message)
 {
+  // We need per-config actions if destination have generator expressions.
+  if(cmGeneratorExpression::Find(Destination) != std::string::npos)
+    {
+    this->ActionsPerConfig = true;
+    }
 }
 
 //----------------------------------------------------------------------------
@@ -180,6 +187,22 @@ bool cmInstallGenerator::InstallsForConfig(const std::string& config)
 }
 
 //----------------------------------------------------------------------------
+std::string cmInstallGenerator::GetDestination() const
+{
+  return GetDestination(this->ConfigurationName);
+}
+
+std::string cmInstallGenerator::GetDestination(std::string const& config) const
+{
+  if(!config.empty())
+    {
+    cmGeneratorExpression ge;
+    cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(Destination);
+    return cge->Evaluate(this->Makefile, config);  
+    }
+  return Destination;
+}
+
 std::string
 cmInstallGenerator::ConvertToAbsoluteDestination(std::string const& dest) const
 {
diff --git a/Source/cmInstallGenerator.h b/Source/cmInstallGenerator.h
index b8e5b53..9fbeb1f 100644
--- a/Source/cmInstallGenerator.h
+++ b/Source/cmInstallGenerator.h
@@ -33,7 +33,8 @@ public:
     MessageNever
   };
 
-  cmInstallGenerator(const char* destination,
+  cmInstallGenerator(cmMakefile* mf,
+                     const char* destination,
                      std::vector<std::string> const& configurations,
                      const char* component,
                      MessageLevel message);
@@ -54,6 +55,8 @@ public:
 
   /** Get the install destination as it should appear in the
       installation script.  */
+  std::string GetDestination() const;
+  std::string GetDestination(std::string const& config) const;
   std::string ConvertToAbsoluteDestination(std::string const& dest) const;
 
   /** Test if this generator installs something for a given configuration.  */
@@ -70,9 +73,12 @@ protected:
   std::string CreateComponentTest(const char* component);
 
   // Information shared by most generator types.
-  std::string Destination;
+  cmMakefile* Makefile;
   std::string Component;
   MessageLevel Message;
+
+private:
+  std::string Destination;
 };
 
 #endif
diff --git a/Source/cmInstallProgramsCommand.cxx b/Source/cmInstallProgramsCommand.cxx
index e6fbe88..03322c2 100644
--- a/Source/cmInstallProgramsCommand.cxx
+++ b/Source/cmInstallProgramsCommand.cxx
@@ -91,7 +91,8 @@ void cmInstallProgramsCommand::FinalPass()
   cmInstallGenerator::MessageLevel message =
     cmInstallGenerator::SelectMessageLevel(this->Makefile);
   this->Makefile->AddInstallGenerator(
-    new cmInstallFilesGenerator(this->Files,
+    new cmInstallFilesGenerator(this->Makefile,
+                                this->Files,
                                 destination.c_str(), true,
                                 no_permissions, no_configurations,
                                 no_component.c_str(), message, no_rename));
diff --git a/Source/cmInstallScriptGenerator.cxx b/Source/cmInstallScriptGenerator.cxx
index 933aa07..106a7af 100644
--- a/Source/cmInstallScriptGenerator.cxx
+++ b/Source/cmInstallScriptGenerator.cxx
@@ -13,9 +13,10 @@
 
 //----------------------------------------------------------------------------
 cmInstallScriptGenerator
-::cmInstallScriptGenerator(const char* script, bool code,
+::cmInstallScriptGenerator(cmMakefile* mf,
+                           const char* script, bool code,
                            const char* component) :
-  cmInstallGenerator(0, std::vector<std::string>(), component, MessageDefault),
+  cmInstallGenerator(mf, 0, std::vector<std::string>(), component, MessageDefault),
   Script(script), Code(code)
 {
 }
diff --git a/Source/cmInstallScriptGenerator.h b/Source/cmInstallScriptGenerator.h
index 54a7b21..41dd319 100644
--- a/Source/cmInstallScriptGenerator.h
+++ b/Source/cmInstallScriptGenerator.h
@@ -20,7 +20,9 @@
 class cmInstallScriptGenerator: public cmInstallGenerator
 {
 public:
-  cmInstallScriptGenerator(const char* script, bool code,
+  cmInstallScriptGenerator(
+    cmMakefile* mf,
+    const char* script, bool code,
     const char* component);
   virtual ~cmInstallScriptGenerator();
 
diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx
index 30cf175..be6e22a 100644
--- a/Source/cmInstallTargetGenerator.cxx
+++ b/Source/cmInstallTargetGenerator.cxx
@@ -24,14 +24,15 @@
 
 //----------------------------------------------------------------------------
 cmInstallTargetGenerator
-::cmInstallTargetGenerator(const std::string& targetName,
+::cmInstallTargetGenerator(cmMakefile* mf,
+                           const std::string& targetName,
                            const char* dest, bool implib,
                            const char* file_permissions,
                            std::vector<std::string> const& configurations,
                            const char* component,
                            MessageLevel message,
                            bool optional):
-  cmInstallGenerator(dest, configurations, component, message),
+  cmInstallGenerator(mf, dest, configurations, component, message),
   TargetName(targetName),
   Target(0),
   FilePermissions(file_permissions),
@@ -347,15 +348,6 @@ void cmInstallTargetGenerator::GenerateScriptForConfig(std::ostream& os,
 
 //----------------------------------------------------------------------------
 std::string
-cmInstallTargetGenerator::GetDestination(std::string const& config) const
-{
-  cmGeneratorExpression ge;
-  return ge.Parse(this->Destination)
-    ->Evaluate(this->Target->Target->GetMakefile(), config);
-}
-
-//----------------------------------------------------------------------------
-std::string
 cmInstallTargetGenerator::GetInstallFilename(const std::string& config) const
 {
   NameType nameType = this->ImportLibrary? NameImplib : NameNormal;
diff --git a/Source/cmInstallTargetGenerator.h b/Source/cmInstallTargetGenerator.h
index a8f4a75..bb01f28 100644
--- a/Source/cmInstallTargetGenerator.h
+++ b/Source/cmInstallTargetGenerator.h
@@ -24,6 +24,7 @@ class cmInstallTargetGenerator: public cmInstallGenerator
 {
 public:
   cmInstallTargetGenerator(
+    cmMakefile* mf,
     std::string const& targetName, const char* dest, bool implib,
     const char* file_permissions,
     std::vector<std::string> const& configurations,
@@ -64,8 +65,6 @@ public:
 
   bool IsImportLibrary() const { return this->ImportLibrary; }
 
-  std::string GetDestination(std::string const& config) const;
-
 protected:
   virtual void GenerateScript(std::ostream& os);
   virtual void GenerateScriptForConfig(std::ostream& os,
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index b360c22..4027569 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -2424,7 +2424,7 @@ public:
   cmInstallTargetGeneratorLocal(cmLocalGenerator* lg, std::string const& t,
                                 const char* dest, bool implib):
     cmInstallTargetGenerator(
-      t, dest, implib, "", std::vector<std::string>(), "Unspecified",
+      this->Makefile, t, dest, implib, "", std::vector<std::string>(), "Unspecified",
       cmInstallGenerator::SelectMessageLevel(lg->GetMakefile()),
       false)
   {
@@ -2452,7 +2452,7 @@ cmLocalGenerator
     // Include the user-specified pre-install script for this target.
     if(const char* preinstall = l->second.GetProperty("PRE_INSTALL_SCRIPT"))
       {
-      cmInstallScriptGenerator g(preinstall, false, 0);
+      cmInstallScriptGenerator g(this->Makefile, preinstall, false, 0);
       g.Generate(os, config, configurationTypes);
       }
 
@@ -2513,7 +2513,7 @@ cmLocalGenerator
     // Include the user-specified post-install script for this target.
     if(const char* postinstall = l->second.GetProperty("POST_INSTALL_SCRIPT"))
       {
-      cmInstallScriptGenerator g(postinstall, false, 0);
+      cmInstallScriptGenerator g(this->Makefile, postinstall, false, 0);
       g.Generate(os, config, configurationTypes);
       }
     }
diff --git a/Source/cmScriptGenerator.cxx b/Source/cmScriptGenerator.cxx
index e44b236..b26b9e8 100644
--- a/Source/cmScriptGenerator.cxx
+++ b/Source/cmScriptGenerator.cxx
@@ -216,6 +216,7 @@ void cmScriptGenerator::GenerateScriptActionsPerConfig(std::ostream& os,
         i != this->ConfigurationTypes->end(); ++i)
       {
       const char* config = i->c_str();
+      this->ConfigurationName = config;
       if(this->GeneratesForConfig(config))
         {
         // Generate a per-configuration block.
@@ -224,6 +225,7 @@ void cmScriptGenerator::GenerateScriptActionsPerConfig(std::ostream& os,
         this->GenerateScriptForConfig(os, config, indent.Next());
         first = false;
         }
+      this->ConfigurationName = "";
       }
     if(!first)
       {
diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt
index 2b9e844..bf92d6f 100644
--- a/Tests/ExportImport/Export/CMakeLists.txt
+++ b/Tests/ExportImport/Export/CMakeLists.txt
@@ -79,6 +79,9 @@ set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_DEBUG testLib7D-$<CONFIG>)
 set_property(TARGET testLib7 PROPERTY OUTPUT_NAME_RELEASE testLib7R-$<CONFIG>)
 set_property(TARGET testLib7 PROPERTY OUTPUT_NAME testLib7-$<CONFIG>)
 
+# Test install(...DESTINATION) with generator expressions
+install(FILES $<TARGET_FILE:testLib7> DESTINATION testLib7-$<CONFIG>)
+
 # Work-around: Visual Studio 6 does not support per-target object files.
 set(VS6)
 if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6")
