Hi,

I am attaching a patch that adds support for generator expressions in
the DIRECTORY arguments of install(DIRECTORY ...). It is my first
contribution, so I don't really have experience with quality
requirements, but I based the changes largely on other commits
implementing similar functionality for other commands, so hopefully it
is not be too bad for a first try. If additional changes are
necessary, let me know and I'll update the patch.

Regards,
Yves
From afd254fa9f634afec87e8503ce9f79d5095a1417 Mon Sep 17 00:00:00 2001
From: Yves Frederix <yves.frede...@gmail.com>
Date: Tue, 12 Jan 2016 21:01:07 +0100
Subject: [PATCH] install: Allow generator expressions in DIRECTORY

---
 Help/command/install.rst                           |  7 +++---
 Source/cmInstallDirectoryGenerator.cxx             | 27 ++++++++++++++++++----
 Source/cmInstallDirectoryGenerator.h               |  3 ++-
 Tests/ExportImport/Export/CMakeLists.txt           |  2 +-
 .../install/DIRECTORY-DIRECTORY-bad-result.txt     |  1 +
 .../install/DIRECTORY-DIRECTORY-bad-stderr.txt     |  6 +++++
 .../RunCMake/install/DIRECTORY-DIRECTORY-bad.cmake |  1 +
 Tests/RunCMake/install/RunCMakeTest.cmake          |  1 +
 Tests/SimpleInstall/CMakeLists.txt                 |  4 ++--
 Tests/SimpleInstallS2/CMakeLists.txt               |  4 ++--
 10 files changed, 43 insertions(+), 13 deletions(-)
 create mode 100644 Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad-result.txt
 create mode 100644 Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad-stderr.txt
 create mode 100644 Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad.cmake

diff --git a/Help/command/install.rst b/Help/command/install.rst
index 423899e..5d2add7 100644
--- a/Help/command/install.rst
+++ b/Help/command/install.rst
@@ -271,9 +271,10 @@ will install the ``icons`` directory to ``share/myproj/icons`` and the
 file permissions, the scripts will be given specific permissions, and any
 ``CVS`` directories will be excluded.
 
-The install destination given to the directory install ``DESTINATION`` may
-use "generator expressions" with the syntax ``$<...>``.  See the
-:manual:`cmake-generator-expressions(7)` manual for available expressions.
+The list of ``dirs...`` given to ``DIRECTORY`` and the install destination
+given to the directory install ``DESTINATION`` may use "generator expressions"
+with the syntax ``$<...>``.  See the :manual:`cmake-generator-expressions(7)`
+manual for available expressions.
 
 Custom Installation Logic
 ^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/Source/cmInstallDirectoryGenerator.cxx b/Source/cmInstallDirectoryGenerator.cxx
index ea27f61..178520b 100644
--- a/Source/cmInstallDirectoryGenerator.cxx
+++ b/Source/cmInstallDirectoryGenerator.cxx
@@ -36,6 +36,15 @@ cmInstallDirectoryGenerator
     {
     this->ActionsPerConfig = true;
     }
+  // We need per-config actions if any directories have generator expressions.
+  for(std::vector<std::string>::const_iterator i = dirs.begin();
+      !this->ActionsPerConfig && i != dirs.end(); ++i)
+    {
+    if(cmGeneratorExpression::Find(*i) != std::string::npos)
+      {
+      this->ActionsPerConfig = true;
+      }
+    }
 }
 
 //----------------------------------------------------------------------------
@@ -60,7 +69,7 @@ cmInstallDirectoryGenerator::GenerateScriptActions(std::ostream& os,
     }
   else
     {
-    this->AddDirectoryInstallRule(os, "", indent);
+    this->AddDirectoryInstallRule(os, "", indent, this->Directories);
     }
 }
 
@@ -69,20 +78,30 @@ void cmInstallDirectoryGenerator::GenerateScriptForConfig(
   const std::string& config,
   Indent const& indent)
 {
-  this->AddDirectoryInstallRule(os, config, indent);
+  std::vector<std::string> dirs;
+  cmGeneratorExpression ge;
+  for(std::vector<std::string>::const_iterator i = this->Directories.begin();
+      i != this->Directories.end(); ++i)
+    {
+    cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(*i);
+    cmSystemTools::ExpandListArgument(cge->Evaluate(
+        this->LocalGenerator, config), dirs);
+    }
+  this->AddDirectoryInstallRule(os, config, indent, dirs);
 }
 
 void cmInstallDirectoryGenerator::AddDirectoryInstallRule(
   std::ostream& os,
   const std::string& config,
-  Indent const& indent)
+  Indent const& indent,
+  std::vector<std::string> const& dirs)
 {
   // Write code to install the directories.
   const char* no_rename = 0;
   this->AddInstallRule(os,
                        this->GetDestination(config),
                        cmInstallType_DIRECTORY,
-                       this->Directories,
+                       dirs,
                        this->Optional,
                        this->FilePermissions.c_str(),
                        this->DirPermissions.c_str(),
diff --git a/Source/cmInstallDirectoryGenerator.h b/Source/cmInstallDirectoryGenerator.h
index 04107e1..9b732d3 100644
--- a/Source/cmInstallDirectoryGenerator.h
+++ b/Source/cmInstallDirectoryGenerator.h
@@ -42,7 +42,8 @@ protected:
                                        Indent const& indent);
   void AddDirectoryInstallRule(std::ostream& os,
                                const std::string& config,
-                               Indent const& indent);
+                               Indent const& indent,
+                               std::vector<std::string> const& dirs);
   cmLocalGenerator* LocalGenerator;
   std::vector<std::string> Directories;
   std::string FilePermissions;
diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt
index aedc89b..dcba9ac 100644
--- a/Tests/ExportImport/Export/CMakeLists.txt
+++ b/Tests/ExportImport/Export/CMakeLists.txt
@@ -551,5 +551,5 @@ install(
   ARCHIVE DESTINATION lib
   INCLUDES DESTINATION include/abs
   )
-install(DIRECTORY include/abs DESTINATION $<1:include>$<0:/wrong>)
+install(DIRECTORY $<1:include/abs>$<0:/wrong> DESTINATION $<1:include>$<0:/wrong>)
 install(EXPORT expAbs NAMESPACE expAbs_ DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/expAbs)
diff --git a/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad-result.txt b/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad-stderr.txt b/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad-stderr.txt
new file mode 100644
index 0000000..9844158
--- /dev/null
+++ b/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad-stderr.txt
@@ -0,0 +1,6 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<NOTAGENEX>
+
+  Expression did not evaluate to a known generator expression
diff --git a/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad.cmake b/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad.cmake
new file mode 100644
index 0000000..7be58b5
--- /dev/null
+++ b/Tests/RunCMake/install/DIRECTORY-DIRECTORY-bad.cmake
@@ -0,0 +1 @@
+install(DIRECTORY $<NOTAGENEX> DESTINATION .)
diff --git a/Tests/RunCMake/install/RunCMakeTest.cmake b/Tests/RunCMake/install/RunCMakeTest.cmake
index 043bd1f..2c1b29d 100644
--- a/Tests/RunCMake/install/RunCMakeTest.cmake
+++ b/Tests/RunCMake/install/RunCMakeTest.cmake
@@ -6,6 +6,7 @@ run_cmake(DIRECTORY-message-lazy)
 run_cmake(SkipInstallRulesWarning)
 run_cmake(SkipInstallRulesNoWarning1)
 run_cmake(SkipInstallRulesNoWarning2)
+run_cmake(DIRECTORY-DIRECTORY-bad)
 run_cmake(DIRECTORY-DESTINATION-bad)
 run_cmake(FILES-DESTINATION-bad)
 run_cmake(TARGETS-DESTINATION-bad)
diff --git a/Tests/SimpleInstall/CMakeLists.txt b/Tests/SimpleInstall/CMakeLists.txt
index e365076..2737f18 100644
--- a/Tests/SimpleInstall/CMakeLists.txt
+++ b/Tests/SimpleInstall/CMakeLists.txt
@@ -252,7 +252,7 @@ else()
   file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/MyTest/share/CVS")
   file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/MyTest/share/TestSubDir/CVS")
   install(
-    DIRECTORY TestSubDir scripts/ DESTINATION $<1:MyTest/share>$<0:/wrong>
+    DIRECTORY TestSubDir $<1:scripts/>$<0:/wrong> DESTINATION $<1:MyTest/share>$<0:/wrong>
     FILE_PERMISSIONS OWNER_READ OWNER_WRITE
     DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
                           GROUP_READ GROUP_EXECUTE
@@ -263,7 +263,7 @@ else()
 
   # Alternate directory installation for coverage.
   install(
-    DIRECTORY scripts/ DESTINATION $<1:MyTest/share/alt>$<0:/wrong>
+    DIRECTORY $<1:scripts/>$<0:/wrong> DESTINATION $<1:MyTest/share/alt>$<0:/wrong>
     COMPONENT Development
     USE_SOURCE_PERMISSIONS
     PATTERN "CVS" EXCLUDE
diff --git a/Tests/SimpleInstallS2/CMakeLists.txt b/Tests/SimpleInstallS2/CMakeLists.txt
index e365076..2737f18 100644
--- a/Tests/SimpleInstallS2/CMakeLists.txt
+++ b/Tests/SimpleInstallS2/CMakeLists.txt
@@ -252,7 +252,7 @@ else()
   file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/MyTest/share/CVS")
   file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}/MyTest/share/TestSubDir/CVS")
   install(
-    DIRECTORY TestSubDir scripts/ DESTINATION $<1:MyTest/share>$<0:/wrong>
+    DIRECTORY TestSubDir $<1:scripts/>$<0:/wrong> DESTINATION $<1:MyTest/share>$<0:/wrong>
     FILE_PERMISSIONS OWNER_READ OWNER_WRITE
     DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
                           GROUP_READ GROUP_EXECUTE
@@ -263,7 +263,7 @@ else()
 
   # Alternate directory installation for coverage.
   install(
-    DIRECTORY scripts/ DESTINATION $<1:MyTest/share/alt>$<0:/wrong>
+    DIRECTORY $<1:scripts/>$<0:/wrong> DESTINATION $<1:MyTest/share/alt>$<0:/wrong>
     COMPONENT Development
     USE_SOURCE_PERMISSIONS
     PATTERN "CVS" EXCLUDE
-- 
1.9.5.msysgit.0

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to