summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-02-24 11:41:40 -0500
committerBrad King <brad.king@kitware.com>2009-02-24 11:41:40 -0500
commit1595b8e69eac0d2dbab6ac29663a85d8d486a5cc (patch)
treeded9bc2ffe1ee4ca3adb4f19a24534877d908b85
parenta79f8cd4c156b01ef0305a30a9c0ca2dcbf9a1cc (diff)
downloadcmake-1595b8e69eac0d2dbab6ac29663a85d8d486a5cc.tar.gz
ENH: Add install(DIRECTORY) option 'OPTIONAL'
This adds the OPTIONAL option to the install(DIRECTORY) command. It tells the installation rule that it is not an error if the source directory does not exist. See issue #8394.
-rw-r--r--Source/cmInstallCommand.cxx19
-rw-r--r--Source/cmInstallCommand.h2
-rw-r--r--Source/cmInstallDirectoryGenerator.cxx8
-rw-r--r--Source/cmInstallDirectoryGenerator.h4
-rw-r--r--Tests/SimpleInstall/CMakeLists.txt3
-rw-r--r--Tests/SimpleInstallS2/CMakeLists.txt3
6 files changed, 32 insertions, 7 deletions
diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx
index 001bd95bf1..37c0f9b079 100644
--- a/Source/cmInstallCommand.cxx
+++ b/Source/cmInstallCommand.cxx
@@ -855,6 +855,7 @@ cmInstallCommand::HandleDirectoryMode(std::vector<std::string> const& args)
DoingConfigurations, DoingComponent };
Doing doing = DoingDirs;
bool in_match_mode = false;
+ bool optional = false;
std::vector<std::string> dirs;
const char* destination = 0;
std::string permissions_file;
@@ -878,6 +879,21 @@ cmInstallCommand::HandleDirectoryMode(std::vector<std::string> const& args)
// Switch to setting the destination property.
doing = DoingDestination;
}
+ else if(args[i] == "OPTIONAL")
+ {
+ if(in_match_mode)
+ {
+ cmOStringStream e;
+ e << args[0] << " does not allow \""
+ << args[i] << "\" after PATTERN or REGEX.";
+ this->SetError(e.str().c_str());
+ return false;
+ }
+
+ // Mark the rule as optional.
+ optional = true;
+ doing = DoingNone;
+ }
else if(args[i] == "PATTERN")
{
// Switch to a new pattern match rule.
@@ -1144,7 +1160,8 @@ cmInstallCommand::HandleDirectoryMode(std::vector<std::string> const& args)
permissions_dir.c_str(),
configurations,
component.c_str(),
- literal_args.c_str()));
+ literal_args.c_str(),
+ optional));
// Tell the global generator about any installation component names
// specified.
diff --git a/Source/cmInstallCommand.h b/Source/cmInstallCommand.h
index 0b7ae7a3e8..b8b01bc17d 100644
--- a/Source/cmInstallCommand.h
+++ b/Source/cmInstallCommand.h
@@ -215,7 +215,7 @@ public:
" install(DIRECTORY dirs... DESTINATION <dir>\n"
" [FILE_PERMISSIONS permissions...]\n"
" [DIRECTORY_PERMISSIONS permissions...]\n"
- " [USE_SOURCE_PERMISSIONS]\n"
+ " [USE_SOURCE_PERMISSIONS] [OPTIONAL]\n"
" [CONFIGURATIONS [Debug|Release|...]]\n"
" [COMPONENT <component>] [FILES_MATCHING]\n"
" [[PATTERN <pattern> | REGEX <regex>]\n"
diff --git a/Source/cmInstallDirectoryGenerator.cxx b/Source/cmInstallDirectoryGenerator.cxx
index 110e6b6284..6f46d297f6 100644
--- a/Source/cmInstallDirectoryGenerator.cxx
+++ b/Source/cmInstallDirectoryGenerator.cxx
@@ -26,10 +26,11 @@ cmInstallDirectoryGenerator
const char* dir_permissions,
std::vector<std::string> const& configurations,
const char* component,
- const char* literal_args):
+ const char* literal_args,
+ bool optional):
cmInstallGenerator(dest, configurations, component), Directories(dirs),
FilePermissions(file_permissions), DirPermissions(dir_permissions),
- LiteralArguments(literal_args)
+ LiteralArguments(literal_args), Optional(optional)
{
}
@@ -45,12 +46,11 @@ cmInstallDirectoryGenerator::GenerateScriptActions(std::ostream& os,
Indent const& indent)
{
// Write code to install the directories.
- bool not_optional = false;
const char* no_properties = 0;
const char* no_rename = 0;
this->AddInstallRule(os, cmTarget::INSTALL_DIRECTORY,
this->Directories,
- not_optional, no_properties,
+ this->Optional, no_properties,
this->FilePermissions.c_str(),
this->DirPermissions.c_str(),
no_rename, this->LiteralArguments.c_str(),
diff --git a/Source/cmInstallDirectoryGenerator.h b/Source/cmInstallDirectoryGenerator.h
index 9810d56cf1..a1166e1b2e 100644
--- a/Source/cmInstallDirectoryGenerator.h
+++ b/Source/cmInstallDirectoryGenerator.h
@@ -31,7 +31,8 @@ public:
const char* dir_permissions,
std::vector<std::string> const& configurations,
const char* component,
- const char* literal_args);
+ const char* literal_args,
+ bool optional = false);
virtual ~cmInstallDirectoryGenerator();
protected:
@@ -40,6 +41,7 @@ protected:
std::string FilePermissions;
std::string DirPermissions;
std::string LiteralArguments;
+ bool Optional;
};
#endif
diff --git a/Tests/SimpleInstall/CMakeLists.txt b/Tests/SimpleInstall/CMakeLists.txt
index c204e64100..1a87c5656d 100644
--- a/Tests/SimpleInstall/CMakeLists.txt
+++ b/Tests/SimpleInstall/CMakeLists.txt
@@ -270,6 +270,9 @@ ELSE(STAGE2)
# Test empty directory installation.
INSTALL(DIRECTORY DESTINATION MyTest/share/empty)
+ # Test optional directory installation.
+ INSTALL(DIRECTORY does-not-exist DESTINATION MyTest/share OPTIONAL)
+
# Test user-specified install scripts, with and without COMPONENT.
INSTALL(
SCRIPT InstallScript1.cmake
diff --git a/Tests/SimpleInstallS2/CMakeLists.txt b/Tests/SimpleInstallS2/CMakeLists.txt
index c204e64100..1a87c5656d 100644
--- a/Tests/SimpleInstallS2/CMakeLists.txt
+++ b/Tests/SimpleInstallS2/CMakeLists.txt
@@ -270,6 +270,9 @@ ELSE(STAGE2)
# Test empty directory installation.
INSTALL(DIRECTORY DESTINATION MyTest/share/empty)
+ # Test optional directory installation.
+ INSTALL(DIRECTORY does-not-exist DESTINATION MyTest/share OPTIONAL)
+
# Test user-specified install scripts, with and without COMPONENT.
INSTALL(
SCRIPT InstallScript1.cmake