|
|
@@ -901,44 +901,34 @@ cmFileCommand::HandleDifferentCommand(std::vector<std::string> const& args)
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
// File installation helper class.
|
|
|
-struct cmFileInstaller
|
|
|
+struct cmFileCopier
|
|
|
{
|
|
|
- // All instances need the file command and makefile using them.
|
|
|
- cmFileInstaller(cmFileCommand* command):
|
|
|
- FileCommand(command), Makefile(command->GetMakefile()),
|
|
|
- Always(false), Optional(false), DestDirLength(0), MatchlessFiles(true)
|
|
|
- {
|
|
|
- // Check whether to copy files always or only if they have changed.
|
|
|
- this->Always =
|
|
|
- cmSystemTools::IsOn(cmSystemTools::GetEnv("CMAKE_INSTALL_ALWAYS"));
|
|
|
- // Get the current manifest.
|
|
|
- this->Manifest =
|
|
|
- this->Makefile->GetSafeDefinition("CMAKE_INSTALL_MANIFEST_FILES");
|
|
|
- }
|
|
|
- ~cmFileInstaller()
|
|
|
+ cmFileCopier(cmFileCommand* command):
|
|
|
+ FileCommand(command),
|
|
|
+ Makefile(command->GetMakefile()),
|
|
|
+ Always(false),
|
|
|
+ MatchlessFiles(true),
|
|
|
+ FilePermissions(0),
|
|
|
+ DirPermissions(0),
|
|
|
+ CurrentMatchRule(0),
|
|
|
+ UseGivenPermissionsFile(false),
|
|
|
+ UseGivenPermissionsDir(false),
|
|
|
+ UseSourcePermissions(false),
|
|
|
+ Doing(DoingNone)
|
|
|
{
|
|
|
- // Save the updated install manifest.
|
|
|
- this->Makefile->AddDefinition("CMAKE_INSTALL_MANIFEST_FILES",
|
|
|
- this->Manifest.c_str());
|
|
|
}
|
|
|
|
|
|
-private:
|
|
|
+ bool Run(std::vector<std::string> const& args);
|
|
|
+protected:
|
|
|
+
|
|
|
cmFileCommand* FileCommand;
|
|
|
cmMakefile* Makefile;
|
|
|
bool Always;
|
|
|
cmFileTimeComparison FileTimes;
|
|
|
-public:
|
|
|
- bool Optional;
|
|
|
-
|
|
|
- // The length of the destdir setting.
|
|
|
- int DestDirLength;
|
|
|
|
|
|
// Whether to install a file not matching any expression.
|
|
|
bool MatchlessFiles;
|
|
|
|
|
|
- // The current file manifest (semicolon separated list).
|
|
|
- std::string Manifest;
|
|
|
-
|
|
|
// Permissions for files and directories installed by this object.
|
|
|
mode_t FilePermissions;
|
|
|
mode_t DirPermissions;
|
|
|
@@ -989,13 +979,6 @@ public:
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- // Append a file to the installation manifest.
|
|
|
- void ManifestAppend(std::string const& file)
|
|
|
- {
|
|
|
- this->Manifest += ";";
|
|
|
- this->Manifest += file.substr(this->DestDirLength);
|
|
|
- }
|
|
|
-
|
|
|
bool SetPermissions(const char* toFile, mode_t permissions)
|
|
|
{
|
|
|
if(permissions && !cmSystemTools::SetPermissions(toFile, permissions))
|
|
|
@@ -1032,18 +1015,299 @@ public:
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-private:
|
|
|
bool InstallSymlink(const char* fromFile, const char* toFile);
|
|
|
-public:
|
|
|
bool InstallFile(const char* fromFile, const char* toFile,
|
|
|
MatchProperties const& match_properties);
|
|
|
bool InstallDirectory(const char* source, const char* destination,
|
|
|
MatchProperties const& match_properties);
|
|
|
- bool Install(const char* fromFile, const char* toFile);
|
|
|
+ virtual bool Install(const char* fromFile, const char* toFile);
|
|
|
+ virtual std::string const& ToName(std::string const& fromName)
|
|
|
+ { return fromName; }
|
|
|
+
|
|
|
+ enum Type
|
|
|
+ {
|
|
|
+ TypeFile,
|
|
|
+ TypeDir,
|
|
|
+ TypeLink
|
|
|
+ };
|
|
|
+ virtual void ReportCopy(const char* toFile, Type type, bool copy) {}
|
|
|
+ virtual bool ReportMissing(const char* fromFile)
|
|
|
+ {
|
|
|
+ // The input file does not exist and installation is not optional.
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "INSTALL cannot find \"" << fromFile << "\".";
|
|
|
+ this->FileCommand->SetError(e.str().c_str());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ MatchRule* CurrentMatchRule;
|
|
|
+ bool UseGivenPermissionsFile;
|
|
|
+ bool UseGivenPermissionsDir;
|
|
|
+ bool UseSourcePermissions;
|
|
|
+ std::string Destination;
|
|
|
+ std::vector<std::string> Files;
|
|
|
+ int Doing;
|
|
|
+
|
|
|
+ virtual bool Parse(std::vector<std::string> const& args);
|
|
|
+ enum
|
|
|
+ {
|
|
|
+ DoingNone,
|
|
|
+ DoingError,
|
|
|
+ DoingDestination,
|
|
|
+ DoingFiles,
|
|
|
+ DoingRegex,
|
|
|
+ DoingPermissionsFile,
|
|
|
+ DoingPermissionsDir,
|
|
|
+ DoingPermissionsMatch,
|
|
|
+ DoingLast1
|
|
|
+ };
|
|
|
+ virtual bool CheckKeyword(std::string const& arg);
|
|
|
+ virtual bool CheckValue(std::string const& arg);
|
|
|
+
|
|
|
+ void NotBeforeMatch(std::string const& arg)
|
|
|
+ {
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "option " << arg << " may not appear before REGEX.";
|
|
|
+ this->FileCommand->SetError(e.str().c_str());
|
|
|
+ this->Doing = DoingError;
|
|
|
+ }
|
|
|
+ void NotAfterMatch(std::string const& arg)
|
|
|
+ {
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "option " << arg << " may not appear after REGEX.";
|
|
|
+ this->FileCommand->SetError(e.str().c_str());
|
|
|
+ this->Doing = DoingError;
|
|
|
+ }
|
|
|
+ virtual void DefaultFilePermissions()
|
|
|
+ {
|
|
|
+ // Use read/write permissions.
|
|
|
+ this->FilePermissions = 0;
|
|
|
+ this->FilePermissions |= mode_owner_read;
|
|
|
+ this->FilePermissions |= mode_owner_write;
|
|
|
+ this->FilePermissions |= mode_group_read;
|
|
|
+ this->FilePermissions |= mode_world_read;
|
|
|
+ }
|
|
|
+ virtual void DefaultDirectoryPermissions()
|
|
|
+ {
|
|
|
+ // Use read/write/executable permissions.
|
|
|
+ this->DirPermissions = 0;
|
|
|
+ this->DirPermissions |= mode_owner_read;
|
|
|
+ this->DirPermissions |= mode_owner_write;
|
|
|
+ this->DirPermissions |= mode_owner_execute;
|
|
|
+ this->DirPermissions |= mode_group_read;
|
|
|
+ this->DirPermissions |= mode_group_execute;
|
|
|
+ this->DirPermissions |= mode_world_read;
|
|
|
+ this->DirPermissions |= mode_world_execute;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
-bool cmFileInstaller::Install(const char* fromFile, const char* toFile)
|
|
|
+bool cmFileCopier::Parse(std::vector<std::string> const& args)
|
|
|
+{
|
|
|
+ this->Doing = DoingFiles;
|
|
|
+ for(unsigned int i=1; i < args.size(); ++i)
|
|
|
+ {
|
|
|
+ // Check this argument.
|
|
|
+ if(!this->CheckKeyword(args[i]) &&
|
|
|
+ !this->CheckValue(args[i]))
|
|
|
+ {
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "called with unknown argument \"" << args[i] << "\".";
|
|
|
+ this->FileCommand->SetError(e.str().c_str());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Quit if an argument is invalid.
|
|
|
+ if(this->Doing == DoingError)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Require a destination.
|
|
|
+ if(this->Destination.empty())
|
|
|
+ {
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "INSTALL given no DESTINATION";
|
|
|
+ this->FileCommand->SetError(e.str().c_str());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // If file permissions were not specified set default permissions.
|
|
|
+ if(!this->UseGivenPermissionsFile && !this->UseSourcePermissions)
|
|
|
+ {
|
|
|
+ this->DefaultFilePermissions();
|
|
|
+ }
|
|
|
+
|
|
|
+ // If directory permissions were not specified set default permissions.
|
|
|
+ if(!this->UseGivenPermissionsDir && !this->UseSourcePermissions)
|
|
|
+ {
|
|
|
+ this->DefaultDirectoryPermissions();
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmFileCopier::CheckKeyword(std::string const& arg)
|
|
|
+{
|
|
|
+ if(arg == "DESTINATION")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->NotAfterMatch(arg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingDestination;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "REGEX")
|
|
|
+ {
|
|
|
+ this->Doing = DoingRegex;
|
|
|
+ }
|
|
|
+ else if(arg == "EXCLUDE")
|
|
|
+ {
|
|
|
+ // Add this property to the current match rule.
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->CurrentMatchRule->Properties.Exclude = true;
|
|
|
+ this->Doing = DoingNone;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->NotBeforeMatch(arg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "USE_SOURCE_PERMISSIONS")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->NotAfterMatch(arg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingNone;
|
|
|
+ this->UseSourcePermissions = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "FILES_MATCHING")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->NotAfterMatch(arg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingNone;
|
|
|
+ this->MatchlessFiles = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmFileCopier::CheckValue(std::string const& arg)
|
|
|
+{
|
|
|
+ switch(this->Doing)
|
|
|
+ {
|
|
|
+ case DoingFiles:
|
|
|
+ this->Files.push_back(arg);
|
|
|
+ break;
|
|
|
+ case DoingDestination:
|
|
|
+ this->Destination = arg;
|
|
|
+ this->Doing = DoingNone;
|
|
|
+ break;
|
|
|
+ case DoingRegex:
|
|
|
+ this->MatchRules.push_back(MatchRule(arg));
|
|
|
+ this->CurrentMatchRule = &*(this->MatchRules.end()-1);
|
|
|
+ if(this->CurrentMatchRule->Regex.is_valid())
|
|
|
+ {
|
|
|
+ this->Doing = DoingNone;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "could not compile REGEX \"" << arg << "\".";
|
|
|
+ this->FileCommand->SetError(e.str().c_str());
|
|
|
+ this->Doing = DoingError;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DoingPermissionsFile:
|
|
|
+ if(!this->CheckPermissions(arg, this->FilePermissions))
|
|
|
+ {
|
|
|
+ this->Doing = DoingError;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DoingPermissionsDir:
|
|
|
+ if(!this->CheckPermissions(arg, this->DirPermissions))
|
|
|
+ {
|
|
|
+ this->Doing = DoingError;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DoingPermissionsMatch:
|
|
|
+ if(!this->CheckPermissions(
|
|
|
+ arg, this->CurrentMatchRule->Properties.Permissions))
|
|
|
+ {
|
|
|
+ this->Doing = DoingError;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmFileCopier::Run(std::vector<std::string> const& args)
|
|
|
+{
|
|
|
+ if(!this->Parse(args))
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ std::vector<std::string> const& files = this->Files;
|
|
|
+ for(std::vector<std::string>::size_type i = 0; i < files.size(); ++i)
|
|
|
+ {
|
|
|
+ // Split the input file into its directory and name components.
|
|
|
+ std::vector<std::string> fromPathComponents;
|
|
|
+ cmSystemTools::SplitPath(files[i].c_str(), fromPathComponents);
|
|
|
+ std::string fromName = *(fromPathComponents.end()-1);
|
|
|
+ std::string fromDir = cmSystemTools::JoinPath(fromPathComponents.begin(),
|
|
|
+ fromPathComponents.end()-1);
|
|
|
+
|
|
|
+ // Compute the full path to the destination file.
|
|
|
+ std::string toFile = this->Destination;
|
|
|
+ std::string const& toName = this->ToName(fromName);
|
|
|
+ if(!toName.empty())
|
|
|
+ {
|
|
|
+ toFile += "/";
|
|
|
+ toFile += toName;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Construct the full path to the source file. The file name may
|
|
|
+ // have been changed above.
|
|
|
+ std::string fromFile = fromDir;
|
|
|
+ if(!fromName.empty())
|
|
|
+ {
|
|
|
+ fromFile += "/";
|
|
|
+ fromFile += fromName;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!this->Install(fromFile.c_str(), toFile.c_str()))
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmFileCopier::Install(const char* fromFile, const char* toFile)
|
|
|
{
|
|
|
if(!*fromFile)
|
|
|
{
|
|
|
@@ -1078,19 +1342,11 @@ bool cmFileInstaller::Install(const char* fromFile, const char* toFile)
|
|
|
{
|
|
|
return this->InstallFile(fromFile, toFile, match_properties);
|
|
|
}
|
|
|
- else if(!this->Optional)
|
|
|
- {
|
|
|
- // The input file does not exist and installation is not optional.
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL cannot find file \"" << fromFile << "\" to install.";
|
|
|
- this->FileCommand->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
- return true;
|
|
|
+ return this->ReportMissing(fromFile);
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
-bool cmFileInstaller::InstallSymlink(const char* fromFile, const char* toFile)
|
|
|
+bool cmFileCopier::InstallSymlink(const char* fromFile, const char* toFile)
|
|
|
{
|
|
|
// Read the original symlink.
|
|
|
std::string symlinkTarget;
|
|
|
@@ -1119,9 +1375,7 @@ bool cmFileInstaller::InstallSymlink(const char* fromFile, const char* toFile)
|
|
|
}
|
|
|
|
|
|
// Inform the user about this file installation.
|
|
|
- std::string message = (copy? "Installing: " : "Up-to-date: ");
|
|
|
- message += toFile;
|
|
|
- this->Makefile->DisplayStatus(message.c_str(), -1);
|
|
|
+ this->ReportCopy(toFile, TypeLink, copy);
|
|
|
|
|
|
if(copy)
|
|
|
{
|
|
|
@@ -1139,15 +1393,12 @@ bool cmFileInstaller::InstallSymlink(const char* fromFile, const char* toFile)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // Add the file to the manifest.
|
|
|
- this->ManifestAppend(toFile);
|
|
|
-
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
-bool cmFileInstaller::InstallFile(const char* fromFile, const char* toFile,
|
|
|
- MatchProperties const& match_properties)
|
|
|
+bool cmFileCopier::InstallFile(const char* fromFile, const char* toFile,
|
|
|
+ MatchProperties const& match_properties)
|
|
|
{
|
|
|
// Determine whether we will copy the file.
|
|
|
bool copy = true;
|
|
|
@@ -1161,9 +1412,7 @@ bool cmFileInstaller::InstallFile(const char* fromFile, const char* toFile,
|
|
|
}
|
|
|
|
|
|
// Inform the user about this file installation.
|
|
|
- std::string message = (copy? "Installing: " : "Up-to-date: ");
|
|
|
- message += toFile;
|
|
|
- this->Makefile->DisplayStatus(message.c_str(), -1);
|
|
|
+ this->ReportCopy(toFile, TypeFile, copy);
|
|
|
|
|
|
// Copy the file.
|
|
|
if(copy && !cmSystemTools::CopyAFile(fromFile, toFile, true, false))
|
|
|
@@ -1175,9 +1424,6 @@ bool cmFileInstaller::InstallFile(const char* fromFile, const char* toFile,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- // Add the file to the manifest.
|
|
|
- this->ManifestAppend(toFile);
|
|
|
-
|
|
|
// Set the file modification time of the destination file.
|
|
|
if(copy && !this->Always)
|
|
|
{
|
|
|
@@ -1203,14 +1449,12 @@ bool cmFileInstaller::InstallFile(const char* fromFile, const char* toFile,
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
-bool cmFileInstaller::InstallDirectory(const char* source,
|
|
|
- const char* destination,
|
|
|
- MatchProperties const& match_properties)
|
|
|
+bool cmFileCopier::InstallDirectory(const char* source,
|
|
|
+ const char* destination,
|
|
|
+ MatchProperties const& match_properties)
|
|
|
{
|
|
|
// Inform the user about this directory installation.
|
|
|
- std::string message = "Installing: ";
|
|
|
- message += destination;
|
|
|
- this->Makefile->DisplayStatus(message.c_str(), -1);
|
|
|
+ this->ReportCopy(destination, TypeDir, true);
|
|
|
|
|
|
// Make sure the destination directory exists.
|
|
|
if(!cmSystemTools::MakeDirectory(destination))
|
|
|
@@ -1288,114 +1532,313 @@ bool cmFileInstaller::InstallDirectory(const char* source,
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
-void cmFileCommand::HandleInstallPermissions(cmFileInstaller& installer,
|
|
|
- mode_t& permissions_file,
|
|
|
- mode_t& permissions_dir,
|
|
|
- int itype,
|
|
|
- bool use_given_permissions_file,
|
|
|
- bool use_given_permissions_dir,
|
|
|
- bool use_source_permissions) const
|
|
|
+struct cmFileInstaller: public cmFileCopier
|
|
|
{
|
|
|
- // Choose a default for shared library permissions.
|
|
|
- bool install_so_no_exe = this->Makefile->IsOn("CMAKE_INSTALL_SO_NO_EXE");
|
|
|
- // If file permissions were not specified set default permissions
|
|
|
- // for this target type.
|
|
|
- if(!use_given_permissions_file && !use_source_permissions)
|
|
|
+ cmFileInstaller(cmFileCommand* command):
|
|
|
+ cmFileCopier(command),
|
|
|
+ InstallType(cmTarget::INSTALL_FILES),
|
|
|
+ Optional(false),
|
|
|
+ DestDirLength(0)
|
|
|
+ {
|
|
|
+ // Check whether to copy files always or only if they have changed.
|
|
|
+ this->Always =
|
|
|
+ cmSystemTools::IsOn(cmSystemTools::GetEnv("CMAKE_INSTALL_ALWAYS"));
|
|
|
+ // Get the current manifest.
|
|
|
+ this->Manifest =
|
|
|
+ this->Makefile->GetSafeDefinition("CMAKE_INSTALL_MANIFEST_FILES");
|
|
|
+ }
|
|
|
+ ~cmFileInstaller()
|
|
|
{
|
|
|
- switch(itype)
|
|
|
+ // Save the updated install manifest.
|
|
|
+ this->Makefile->AddDefinition("CMAKE_INSTALL_MANIFEST_FILES",
|
|
|
+ this->Manifest.c_str());
|
|
|
+ }
|
|
|
+
|
|
|
+protected:
|
|
|
+ cmTarget::TargetType InstallType;
|
|
|
+ bool Optional;
|
|
|
+ int DestDirLength;
|
|
|
+ std::string Rename;
|
|
|
+
|
|
|
+ std::string Manifest;
|
|
|
+ void ManifestAppend(std::string const& file)
|
|
|
+ {
|
|
|
+ this->Manifest += ";";
|
|
|
+ this->Manifest += file.substr(this->DestDirLength);
|
|
|
+ }
|
|
|
+
|
|
|
+ virtual std::string const& ToName(std::string const& fromName)
|
|
|
+ { return this->Rename.empty()? fromName : this->Rename; }
|
|
|
+
|
|
|
+ virtual void ReportCopy(const char* toFile, Type type, bool copy)
|
|
|
+ {
|
|
|
+ std::string message = (copy? "Installing: " : "Up-to-date: ");
|
|
|
+ message += toFile;
|
|
|
+ this->Makefile->DisplayStatus(message.c_str(), -1);
|
|
|
+ if(type != TypeDir)
|
|
|
+ {
|
|
|
+ // Add the file to the manifest.
|
|
|
+ this->ManifestAppend(toFile);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ virtual bool ReportMissing(const char* fromFile)
|
|
|
+ {
|
|
|
+ return (this->Optional ||
|
|
|
+ this->cmFileCopier::ReportMissing(fromFile));
|
|
|
+ }
|
|
|
+ virtual bool Install(const char* fromFile, const char* toFile)
|
|
|
+ {
|
|
|
+ // Support installing from empty source to make a directory.
|
|
|
+ if(this->InstallType == cmTarget::INSTALL_DIRECTORY && !*fromFile)
|
|
|
+ {
|
|
|
+ return this->InstallDirectory(fromFile, toFile, MatchProperties());
|
|
|
+ }
|
|
|
+ return this->cmFileCopier::Install(fromFile, toFile);
|
|
|
+ }
|
|
|
+
|
|
|
+ virtual bool Parse(std::vector<std::string> const& args);
|
|
|
+ enum
|
|
|
+ {
|
|
|
+ DoingType = DoingLast1,
|
|
|
+ DoingRename,
|
|
|
+ DoingSelf24
|
|
|
+ };
|
|
|
+ virtual bool CheckKeyword(std::string const& arg);
|
|
|
+ virtual bool CheckValue(std::string const& arg);
|
|
|
+ virtual void DefaultFilePermissions()
|
|
|
+ {
|
|
|
+ this->cmFileCopier::DefaultFilePermissions();
|
|
|
+ // Add execute permissions based on the target type.
|
|
|
+ switch(this->InstallType)
|
|
|
{
|
|
|
case cmTarget::SHARED_LIBRARY:
|
|
|
case cmTarget::MODULE_LIBRARY:
|
|
|
- if(install_so_no_exe)
|
|
|
+ if(this->Makefile->IsOn("CMAKE_INSTALL_SO_NO_EXE"))
|
|
|
{
|
|
|
- // Use read/write permissions.
|
|
|
- permissions_file = 0;
|
|
|
- permissions_file |= mode_owner_read;
|
|
|
- permissions_file |= mode_owner_write;
|
|
|
- permissions_file |= mode_group_read;
|
|
|
- permissions_file |= mode_world_read;
|
|
|
break;
|
|
|
}
|
|
|
case cmTarget::EXECUTABLE:
|
|
|
case cmTarget::INSTALL_PROGRAMS:
|
|
|
- // Use read/write/executable permissions.
|
|
|
- permissions_file = 0;
|
|
|
- permissions_file |= mode_owner_read;
|
|
|
- permissions_file |= mode_owner_write;
|
|
|
- permissions_file |= mode_owner_execute;
|
|
|
- permissions_file |= mode_group_read;
|
|
|
- permissions_file |= mode_group_execute;
|
|
|
- permissions_file |= mode_world_read;
|
|
|
- permissions_file |= mode_world_execute;
|
|
|
- break;
|
|
|
- default:
|
|
|
- // Use read/write permissions.
|
|
|
- permissions_file = 0;
|
|
|
- permissions_file |= mode_owner_read;
|
|
|
- permissions_file |= mode_owner_write;
|
|
|
- permissions_file |= mode_group_read;
|
|
|
- permissions_file |= mode_world_read;
|
|
|
+ this->FilePermissions |= mode_owner_execute;
|
|
|
+ this->FilePermissions |= mode_group_execute;
|
|
|
+ this->FilePermissions |= mode_world_execute;
|
|
|
break;
|
|
|
+ default: break;
|
|
|
}
|
|
|
}
|
|
|
+ bool GetTargetTypeFromString(const std::string& stype);
|
|
|
+ bool HandleInstallDestination();
|
|
|
+};
|
|
|
|
|
|
- // If directory permissions were not specified set default permissions.
|
|
|
- if(!use_given_permissions_dir && !use_source_permissions)
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmFileInstaller::Parse(std::vector<std::string> const& args)
|
|
|
+{
|
|
|
+ if(!this->cmFileCopier::Parse(args))
|
|
|
{
|
|
|
- // Use read/write/executable permissions.
|
|
|
- permissions_dir = 0;
|
|
|
- permissions_dir |= mode_owner_read;
|
|
|
- permissions_dir |= mode_owner_write;
|
|
|
- permissions_dir |= mode_owner_execute;
|
|
|
- permissions_dir |= mode_group_read;
|
|
|
- permissions_dir |= mode_group_execute;
|
|
|
- permissions_dir |= mode_world_read;
|
|
|
- permissions_dir |= mode_world_execute;
|
|
|
- }
|
|
|
- // Set the installer permissions.
|
|
|
- installer.FilePermissions = permissions_file;
|
|
|
- installer.DirPermissions = permissions_dir;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!this->Rename.empty())
|
|
|
+ {
|
|
|
+ if(this->InstallType != cmTarget::INSTALL_FILES &&
|
|
|
+ this->InstallType != cmTarget::INSTALL_PROGRAMS)
|
|
|
+ {
|
|
|
+ this->FileCommand->SetError("INSTALL option RENAME may be used "
|
|
|
+ "only with FILES or PROGRAMS.");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if(this->Files.size() > 1)
|
|
|
+ {
|
|
|
+ this->FileCommand->SetError("INSTALL option RENAME may be used "
|
|
|
+ "only with one file.");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!this->HandleInstallDestination())
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmFileInstaller::CheckKeyword(std::string const& arg)
|
|
|
+{
|
|
|
+ if(arg == "TYPE")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->NotAfterMatch(arg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingType;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "FILES")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->NotAfterMatch(arg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingFiles;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "RENAME")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->NotAfterMatch(arg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingRename;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "OPTIONAL")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->NotAfterMatch(arg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingNone;
|
|
|
+ this->Optional = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "PERMISSIONS")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->Doing = DoingPermissionsMatch;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingPermissionsFile;
|
|
|
+ this->UseGivenPermissionsFile = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "DIR_PERMISSIONS")
|
|
|
+ {
|
|
|
+ if(this->CurrentMatchRule)
|
|
|
+ {
|
|
|
+ this->NotAfterMatch(arg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ this->Doing = DoingPermissionsDir;
|
|
|
+ this->UseGivenPermissionsDir = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(arg == "COMPONENTS" || arg == "CONFIGURATIONS" ||
|
|
|
+ arg == "PROPERTIES")
|
|
|
+ {
|
|
|
+ if(this->Makefile->IsOn("CMAKE_INSTALL_SELF_2_4"))
|
|
|
+ {
|
|
|
+ // When CMake 2.4 builds this CMake version we need to support
|
|
|
+ // the install scripts it generates since it asks this CMake
|
|
|
+ // to install itself using the rules it generated.
|
|
|
+ this->Doing = DoingSelf24;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "INSTALL called with old-style " << arg << " argument. "
|
|
|
+ << "This script was generated with an older version of CMake. "
|
|
|
+ << "Re-run this cmake version on your build tree.";
|
|
|
+ this->FileCommand->SetError(e.str().c_str());
|
|
|
+ this->Doing = DoingError;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return this->cmFileCopier::CheckKeyword(arg);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
|
-void cmFileCommand
|
|
|
-::GetTargetTypeFromString(const std::string& stype, int& itype) const
|
|
|
+bool cmFileInstaller::CheckValue(std::string const& arg)
|
|
|
+{
|
|
|
+ switch(this->Doing)
|
|
|
+ {
|
|
|
+ case DoingType:
|
|
|
+ if(!this->GetTargetTypeFromString(arg))
|
|
|
+ {
|
|
|
+ this->Doing = DoingError;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DoingRename:
|
|
|
+ this->Rename = arg;
|
|
|
+ break;
|
|
|
+ case DoingSelf24:
|
|
|
+ // Ignore these arguments for compatibility. This should be
|
|
|
+ // reached only when CMake 2.4 is installing the current
|
|
|
+ // CMake. It can be removed when CMake 2.6 or higher is
|
|
|
+ // required to build CMake.
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return this->cmFileCopier::CheckValue(arg);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmFileInstaller
|
|
|
+::GetTargetTypeFromString(const std::string& stype)
|
|
|
{
|
|
|
if ( stype == "EXECUTABLE" )
|
|
|
{
|
|
|
- itype = cmTarget::EXECUTABLE;
|
|
|
+ this->InstallType = cmTarget::EXECUTABLE;
|
|
|
+ }
|
|
|
+ else if ( stype == "FILE" )
|
|
|
+ {
|
|
|
+ this->InstallType = cmTarget::INSTALL_FILES;
|
|
|
}
|
|
|
else if ( stype == "PROGRAM" )
|
|
|
{
|
|
|
- itype = cmTarget::INSTALL_PROGRAMS;
|
|
|
+ this->InstallType = cmTarget::INSTALL_PROGRAMS;
|
|
|
}
|
|
|
else if ( stype == "STATIC_LIBRARY" )
|
|
|
{
|
|
|
- itype = cmTarget::STATIC_LIBRARY;
|
|
|
+ this->InstallType = cmTarget::STATIC_LIBRARY;
|
|
|
}
|
|
|
else if ( stype == "SHARED_LIBRARY" )
|
|
|
{
|
|
|
- itype = cmTarget::SHARED_LIBRARY;
|
|
|
+ this->InstallType = cmTarget::SHARED_LIBRARY;
|
|
|
}
|
|
|
else if ( stype == "MODULE" )
|
|
|
{
|
|
|
- itype = cmTarget::MODULE_LIBRARY;
|
|
|
+ this->InstallType = cmTarget::MODULE_LIBRARY;
|
|
|
}
|
|
|
else if ( stype == "DIRECTORY" )
|
|
|
{
|
|
|
- itype = cmTarget::INSTALL_DIRECTORY;
|
|
|
+ this->InstallType = cmTarget::INSTALL_DIRECTORY;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "Option TYPE given uknown value \"" << stype << "\".";
|
|
|
+ this->FileCommand->SetError(e.str().c_str());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//----------------------------------------------------------------------------
|
|
|
-bool cmFileCommand::HandleInstallDestination(cmFileInstaller& installer,
|
|
|
- std::string& destination)
|
|
|
+bool cmFileInstaller::HandleInstallDestination()
|
|
|
{
|
|
|
+ std::string& destination = this->Destination;
|
|
|
+
|
|
|
// allow for / to be a valid destination
|
|
|
if ( destination.size() < 2 && destination != "/" )
|
|
|
{
|
|
|
- this->SetError("called with inapropriate arguments. "
|
|
|
+ this->FileCommand->SetError("called with inapropriate arguments. "
|
|
|
"No DESTINATION provided or .");
|
|
|
return false;
|
|
|
}
|
|
|
@@ -1435,9 +1878,10 @@ bool cmFileCommand::HandleInstallDestination(cmFileInstaller& installer,
|
|
|
{
|
|
|
// This is relative path on unix or windows. Since we are doing
|
|
|
// destdir, this case does not make sense.
|
|
|
- this->SetError("called with relative DESTINATION. This "
|
|
|
- "does not make sense when using DESTDIR. Specify "
|
|
|
- "absolute path or remove DESTDIR environment variable.");
|
|
|
+ this->FileCommand->SetError(
|
|
|
+ "called with relative DESTINATION. This "
|
|
|
+ "does not make sense when using DESTDIR. Specify "
|
|
|
+ "absolute path or remove DESTDIR environment variable.");
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
@@ -1451,12 +1895,12 @@ bool cmFileCommand::HandleInstallDestination(cmFileInstaller& installer,
|
|
|
"absolute path or remove DESTDIR environment variable."
|
|
|
"\nDESTINATION=\n";
|
|
|
message += destination;
|
|
|
- this->SetError(message.c_str());
|
|
|
+ this->FileCommand->SetError(message.c_str());
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
destination = sdestdir + (destination.c_str() + skip);
|
|
|
- installer.DestDirLength = int(sdestdir.size());
|
|
|
+ this->DestDirLength = int(sdestdir.size());
|
|
|
}
|
|
|
|
|
|
if ( !cmSystemTools::FileExists(destination.c_str()) )
|
|
|
@@ -1465,7 +1909,7 @@ bool cmFileCommand::HandleInstallDestination(cmFileInstaller& installer,
|
|
|
{
|
|
|
std::string errstring = "cannot create directory: " + destination +
|
|
|
". Maybe need administrative privileges.";
|
|
|
- this->SetError(errstring.c_str());
|
|
|
+ this->FileCommand->SetError(errstring.c_str());
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
@@ -1473,7 +1917,7 @@ bool cmFileCommand::HandleInstallDestination(cmFileInstaller& installer,
|
|
|
{
|
|
|
std::string errstring = "INSTALL destination: " + destination +
|
|
|
" is not a directory.";
|
|
|
- this->SetError(errstring.c_str());
|
|
|
+ this->FileCommand->SetError(errstring.c_str());
|
|
|
return false;
|
|
|
}
|
|
|
return true;
|
|
|
@@ -1718,367 +2162,8 @@ cmFileCommand::HandleRPathCheckCommand(std::vector<std::string> const& args)
|
|
|
//----------------------------------------------------------------------------
|
|
|
bool cmFileCommand::HandleInstallCommand(std::vector<std::string> const& args)
|
|
|
{
|
|
|
- if ( args.size() < 6 )
|
|
|
- {
|
|
|
- this->SetError("called with incorrect number of arguments");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- // Construct a file installer object.
|
|
|
cmFileInstaller installer(this);
|
|
|
-
|
|
|
- std::string rename = "";
|
|
|
- std::string destination = "";
|
|
|
-
|
|
|
- std::vector<std::string> files;
|
|
|
- int itype = cmTarget::INSTALL_FILES;
|
|
|
-
|
|
|
- bool result = this->ParseInstallArgs(args, installer,
|
|
|
- itype, rename, destination, files);
|
|
|
- if (result == true)
|
|
|
- {
|
|
|
- result = this->DoInstall(installer,
|
|
|
- itype, rename, destination, files);
|
|
|
- }
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-//----------------------------------------------------------------------------
|
|
|
-bool cmFileCommand::ParseInstallArgs(std::vector<std::string> const& args,
|
|
|
- cmFileInstaller& installer,
|
|
|
- int& itype,
|
|
|
- std::string& rename,
|
|
|
- std::string& destination,
|
|
|
- std::vector<std::string>& files)
|
|
|
-{
|
|
|
- std::string stype = "FILES";
|
|
|
- enum Doing { DoingNone, DoingFiles,
|
|
|
- DoingPermissionsFile, DoingPermissionsDir,
|
|
|
- DoingPermissionsMatch, DoingSelf24 };
|
|
|
- Doing doing = DoingNone;
|
|
|
- bool use_given_permissions_file = false;
|
|
|
- bool use_given_permissions_dir = false;
|
|
|
- bool use_source_permissions = false;
|
|
|
- mode_t permissions_file = 0;
|
|
|
- mode_t permissions_dir = 0;
|
|
|
-
|
|
|
- cmFileInstaller::MatchRule* current_match_rule = 0;
|
|
|
- std::vector<std::string>::size_type i = 0;
|
|
|
- i++; // Get rid of subcommand
|
|
|
- for ( ; i != args.size(); ++i )
|
|
|
- {
|
|
|
- const std::string* cstr = &args[i];
|
|
|
- if ( *cstr == "DESTINATION" && i < args.size()-1 )
|
|
|
- {
|
|
|
- if(current_match_rule)
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL does not allow \"" << *cstr << "\" after REGEX.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- i++;
|
|
|
- destination = args[i];
|
|
|
- doing = DoingNone;
|
|
|
- }
|
|
|
- else if ( *cstr == "TYPE" && i < args.size()-1 )
|
|
|
- {
|
|
|
- if(current_match_rule)
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL does not allow \"" << *cstr << "\" after REGEX.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- i++;
|
|
|
- stype = args[i];
|
|
|
- if ( args[i+1] == "OPTIONAL" )
|
|
|
- {
|
|
|
- i++;
|
|
|
- installer.Optional = true;
|
|
|
- }
|
|
|
- doing = DoingNone;
|
|
|
- }
|
|
|
- else if ( *cstr == "RENAME" && i < args.size()-1 )
|
|
|
- {
|
|
|
- if(current_match_rule)
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL does not allow \"" << *cstr << "\" after REGEX.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- i++;
|
|
|
- rename = args[i];
|
|
|
- doing = DoingNone;
|
|
|
- }
|
|
|
- else if ( *cstr == "REGEX" && i < args.size()-1 )
|
|
|
- {
|
|
|
- i++;
|
|
|
- installer.MatchRules.push_back(cmFileInstaller::MatchRule(args[i]));
|
|
|
- current_match_rule = &*(installer.MatchRules.end()-1);
|
|
|
- if(!current_match_rule->Regex.is_valid())
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL could not compile REGEX \"" << args[i] << "\".";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
- doing = DoingNone;
|
|
|
- }
|
|
|
- else if ( *cstr == "EXCLUDE" )
|
|
|
- {
|
|
|
- // Add this property to the current match rule.
|
|
|
- if(!current_match_rule)
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL does not allow \""
|
|
|
- << *cstr << "\" before a REGEX is given.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
- current_match_rule->Properties.Exclude = true;
|
|
|
- doing = DoingPermissionsMatch;
|
|
|
- }
|
|
|
- else if ( *cstr == "PROPERTIES" )
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL called with old-style PROPERTIES argument. "
|
|
|
- << "This script was generated with an older version of CMake. "
|
|
|
- << "Re-run this cmake version on your build tree.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
- else if ( *cstr == "PERMISSIONS" )
|
|
|
- {
|
|
|
- if(current_match_rule)
|
|
|
- {
|
|
|
- doing = DoingPermissionsMatch;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- doing = DoingPermissionsFile;
|
|
|
- use_given_permissions_file = true;
|
|
|
- }
|
|
|
- }
|
|
|
- else if ( *cstr == "DIR_PERMISSIONS" )
|
|
|
- {
|
|
|
- if(current_match_rule)
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL does not allow \"" << *cstr << "\" after REGEX.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- use_given_permissions_dir = true;
|
|
|
- doing = DoingPermissionsDir;
|
|
|
- }
|
|
|
- else if ( *cstr == "USE_SOURCE_PERMISSIONS" )
|
|
|
- {
|
|
|
- if(current_match_rule)
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL does not allow \"" << *cstr << "\" after REGEX.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- doing = DoingNone;
|
|
|
- use_source_permissions = true;
|
|
|
- }
|
|
|
- else if ( *cstr == "FILES_MATCHING" )
|
|
|
- {
|
|
|
- if(current_match_rule)
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL does not allow \"" << *cstr << "\" after REGEX.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- doing = DoingNone;
|
|
|
- installer.MatchlessFiles = false;
|
|
|
- }
|
|
|
- else if ( *cstr == "COMPONENTS" )
|
|
|
- {
|
|
|
- if(this->Makefile->IsOn("CMAKE_INSTALL_SELF_2_4"))
|
|
|
- {
|
|
|
- // When CMake 2.4 builds this CMake version we need to support
|
|
|
- // the install scripts it generates since it asks this CMake
|
|
|
- // to install itself using the rules it generated.
|
|
|
- doing = DoingSelf24;
|
|
|
- continue;
|
|
|
- }
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL called with old-style COMPONENTS argument. "
|
|
|
- << "This script was generated with an older version of CMake. "
|
|
|
- << "Re-run this cmake version on your build tree.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
- else if ( *cstr == "CONFIGURATIONS" )
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL called with old-style CONFIGURATIONS argument. "
|
|
|
- << "This script was generated with an older version of CMake. "
|
|
|
- << "Re-run this cmake version on your build tree.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
- else if(*cstr == "FILES" && doing != DoingFiles)
|
|
|
- {
|
|
|
- if(current_match_rule)
|
|
|
- {
|
|
|
- cmOStringStream e;
|
|
|
- e << "INSTALL does not allow \"" << *cstr << "\" after REGEX.";
|
|
|
- this->SetError(e.str().c_str());
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- doing = DoingFiles;
|
|
|
- }
|
|
|
- else if(doing == DoingFiles)
|
|
|
- {
|
|
|
- files.push_back(*cstr);
|
|
|
- }
|
|
|
- else if(doing == DoingPermissionsFile)
|
|
|
- {
|
|
|
- if(!installer.CheckPermissions(args[i], permissions_file))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(doing == DoingPermissionsDir)
|
|
|
- {
|
|
|
- if(!installer.CheckPermissions(args[i], permissions_dir))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(doing == DoingPermissionsMatch)
|
|
|
- {
|
|
|
- if(!installer.CheckPermissions(
|
|
|
- args[i], current_match_rule->Properties.Permissions))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(doing == DoingSelf24)
|
|
|
- {
|
|
|
- // Ignore these arguments for compatibility. This should be
|
|
|
- // reached only when CMake 2.4 is installing the current
|
|
|
- // CMake. It can be removed when CMake 2.6 or higher is
|
|
|
- // required to build CMake.
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- this->SetError("called with inappropriate arguments");
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // now check and postprocess what has been parsed
|
|
|
- if ( files.size() == 0 )
|
|
|
- {
|
|
|
- // nothing to do, no files were listed.
|
|
|
- // if this is handled as error, INSTALL_FILES() creates an invalid
|
|
|
- // cmake_install.cmake script with no FILES() arguments if no files were
|
|
|
- // given to INSTALL_FILES(). This was accepted with CMake 2.4.x.
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- // Check rename form.
|
|
|
- if(!rename.empty())
|
|
|
- {
|
|
|
- if(itype != cmTarget::INSTALL_FILES &&
|
|
|
- itype != cmTarget::INSTALL_PROGRAMS)
|
|
|
- {
|
|
|
- this->SetError("INSTALL option RENAME may be used only with "
|
|
|
- "FILES or PROGRAMS.");
|
|
|
- return false;
|
|
|
- }
|
|
|
- if(files.size() > 1)
|
|
|
- {
|
|
|
- this->SetError("INSTALL option RENAME may be used only with "
|
|
|
- "one file.");
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (this->HandleInstallDestination(installer, destination) == false)
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- this->GetTargetTypeFromString(stype, itype);
|
|
|
-
|
|
|
- this->HandleInstallPermissions(installer,
|
|
|
- permissions_file,
|
|
|
- permissions_dir,
|
|
|
- itype,
|
|
|
- use_given_permissions_file,
|
|
|
- use_given_permissions_dir,
|
|
|
- use_source_permissions);
|
|
|
-
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-//----------------------------------------------------------------------------
|
|
|
-bool cmFileCommand::DoInstall( cmFileInstaller& installer,
|
|
|
- const int itype,
|
|
|
- const std::string& rename,
|
|
|
- const std::string& destination,
|
|
|
- const std::vector<std::string>& files)
|
|
|
-{
|
|
|
- typedef std::set<cmStdString>::const_iterator iter_type;
|
|
|
-
|
|
|
- // Handle each file listed.
|
|
|
- for (std::vector<std::string>::size_type i = 0; i < files.size(); i ++ )
|
|
|
- {
|
|
|
- // Split the input file into its directory and name components.
|
|
|
- std::vector<std::string> fromPathComponents;
|
|
|
- cmSystemTools::SplitPath(files[i].c_str(), fromPathComponents);
|
|
|
- std::string fromName = *(fromPathComponents.end()-1);
|
|
|
- std::string fromDir = cmSystemTools::JoinPath(fromPathComponents.begin(),
|
|
|
- fromPathComponents.end()-1);
|
|
|
-
|
|
|
- // Compute the full path to the destination file.
|
|
|
- std::string toFile = destination;
|
|
|
- std::string const& toName = rename.empty()? fromName : rename;
|
|
|
- if(!toName.empty())
|
|
|
- {
|
|
|
- toFile += "/";
|
|
|
- toFile += toName;
|
|
|
- }
|
|
|
-
|
|
|
- // Construct the full path to the source file. The file name may
|
|
|
- // have been changed above.
|
|
|
- std::string fromFile = fromDir;
|
|
|
- if(!fromName.empty())
|
|
|
- {
|
|
|
- fromFile += "/";
|
|
|
- fromFile += fromName;
|
|
|
- }
|
|
|
-
|
|
|
- if(itype == cmTarget::INSTALL_DIRECTORY && fromFile.empty())
|
|
|
- {
|
|
|
- if(!installer.InstallDirectory(fromFile.c_str(), toFile.c_str(),
|
|
|
- cmFileInstaller::MatchProperties()))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(!installer.Install(fromFile.c_str(), toFile.c_str()))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
+ return installer.Run(args);
|
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|