diff options
-rw-r--r-- | Source/cmInstallCommand.cxx | 19 | ||||
-rw-r--r-- | Source/cmInstallCommand.h | 2 | ||||
-rw-r--r-- | Source/cmInstallDirectoryGenerator.cxx | 8 | ||||
-rw-r--r-- | Source/cmInstallDirectoryGenerator.h | 4 | ||||
-rw-r--r-- | Tests/SimpleInstall/CMakeLists.txt | 3 | ||||
-rw-r--r-- | Tests/SimpleInstallS2/CMakeLists.txt | 3 |
6 files changed, 32 insertions, 7 deletions
diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index 001bd95..37c0f9b 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 0b7ae7a..b8b01bc 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 110e6b6..6f46d29 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 9810d56..a1166e1 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 c204e64..1a87c56 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 c204e64..1a87c56 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 |