summaryrefslogtreecommitdiffstats
path: root/Source/cmFileCommand.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2006-08-17 18:48:54 (GMT)
committerBrad King <brad.king@kitware.com>2006-08-17 18:48:54 (GMT)
commit8a72d43c176df44818154019248ad28d043f5dde (patch)
tree549347ba1e8ebb0fefec838132eff5fd98d74965 /Source/cmFileCommand.cxx
parentb642ffa7a82922d99475fa38e9a7f317e029ebf3 (diff)
downloadCMake-8a72d43c176df44818154019248ad28d043f5dde.zip
CMake-8a72d43c176df44818154019248ad28d043f5dde.tar.gz
CMake-8a72d43c176df44818154019248ad28d043f5dde.tar.bz2
ENH: Started implementing INSTALL(DIRECTORY) command mode. This is not yet finished so it is undocumented and there is no test. These changes also separate the notions of file and directory permissions.
Diffstat (limited to 'Source/cmFileCommand.cxx')
-rw-r--r--Source/cmFileCommand.cxx350
1 files changed, 262 insertions, 88 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index 80c69e6..9f2573e 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -316,6 +316,121 @@ bool cmFileCommand::HandleMakeDirectoryCommand(
}
//----------------------------------------------------------------------------
+struct cmFileInstaller
+{
+ bool InstallFile(const char* fromFile, const char* toFile, bool always);
+ bool InstallDirectory(const char* source,
+ const char* destination,
+ bool always,
+ std::string& smanifest_files,
+ int destDirLength);
+ cmFileInstaller(cmFileCommand* fc, cmMakefile* mf):
+ FileCommand(fc), Makefile(mf) {}
+ cmFileCommand* FileCommand;
+ cmMakefile* Makefile;
+ mode_t FilePermissions;
+ mode_t DirPermissions;
+};
+
+//----------------------------------------------------------------------------
+bool cmFileInstaller::InstallFile(const char* fromFile, const char* toFile,
+ bool always)
+{
+ // Inform the user about this file installation.
+ std::string message = "Installing ";
+ message += toFile;
+ this->Makefile->DisplayStatus(message.c_str(), -1);
+
+ // Copy the file.
+ if(!cmSystemTools::CopyAFile(fromFile, toFile, always))
+ {
+ cmOStringStream e;
+ e << "INSTALL cannot copy file \"" << fromFile
+ << "\" to \"" << toFile << "\".";
+ this->FileCommand->SetError(e.str().c_str());
+ return false;
+ }
+
+ // Set permissions of the destination file.
+ if(!cmSystemTools::SetPermissions(toFile, this->FilePermissions))
+ {
+ cmOStringStream e;
+ e << "Problem setting permissions on file \"" << toFile << "\"";
+ this->FileCommand->SetError(e.str().c_str());
+ return false;
+ }
+
+ return true;
+}
+
+//----------------------------------------------------------------------------
+bool cmFileInstaller::InstallDirectory(const char* source,
+ const char* destination,
+ bool always,
+ std::string& smanifest_files,
+ int destDirLength)
+{
+ cmsys::Directory dir;
+ dir.Load(source);
+ if(!cmSystemTools::MakeDirectory(destination))
+ {
+ return false;
+ }
+ // TODO: Make sure destination directory has write permissions
+ // before installing files. User requested permissions may be
+ // restored later.
+ unsigned long numFiles = static_cast<unsigned long>(dir.GetNumberOfFiles());
+ for(unsigned long fileNum = 0; fileNum < numFiles; ++fileNum)
+ {
+ if(!(strcmp(dir.GetFile(fileNum), ".") == 0 ||
+ strcmp(dir.GetFile(fileNum), "..") == 0))
+ {
+ kwsys_stl::string fromPath = source;
+ fromPath += "/";
+ fromPath += dir.GetFile(fileNum);
+ if(cmSystemTools::FileIsDirectory(fromPath.c_str()))
+ {
+ kwsys_stl::string toDir = destination;
+ toDir += "/";
+ toDir += dir.GetFile(fileNum);
+ if(!this->InstallDirectory(fromPath.c_str(), toDir.c_str(), always,
+ smanifest_files, destDirLength))
+ {
+ return false;
+ }
+ }
+ else
+ {
+ // Install this file.
+ std::string toFile = destination;
+ toFile += "/";
+ toFile += dir.GetFile(fileNum);
+ if(this->InstallFile(fromPath.c_str(), toFile.c_str(), always))
+ {
+ smanifest_files += ";";
+ smanifest_files += toFile.substr(destDirLength);
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ }
+
+ // Set the requested permissions on the destination directory.
+ if(!cmSystemTools::SetPermissions(destination, this->DirPermissions))
+ {
+ cmOStringStream e;
+ e << "Problem setting permissions on directory \"" << destination << "\"";
+ this->FileCommand->SetError(e.str().c_str());
+ return false;
+ }
+
+ return true;
+}
+
+//----------------------------------------------------------------------------
bool cmFileCommand::HandleInstallCommand(
std::vector<std::string> const& args)
{
@@ -369,11 +484,14 @@ bool cmFileCommand::HandleInstallCommand(
bool in_files = false;
bool in_properties = false;
- bool in_permissions = false;
+ bool in_permissions_file = false;
+ bool in_permissions_dir = false;
bool in_components = false;
bool in_configurations = false;
- bool use_given_permissions = false;
- mode_t permissions = 0;
+ bool use_given_permissions_file = false;
+ bool use_given_permissions_dir = false;
+ mode_t permissions_file = 0;
+ mode_t permissions_dir = 0;
bool optional = false;
for ( ; i != args.size(); ++i )
{
@@ -384,7 +502,8 @@ bool cmFileCommand::HandleInstallCommand(
destination = args[i];
in_files = false;
in_properties = false;
- in_permissions = false;
+ in_permissions_file = false;
+ in_permissions_dir = false;
in_components = false;
in_configurations = false;
}
@@ -399,7 +518,8 @@ bool cmFileCommand::HandleInstallCommand(
}
in_properties = false;
in_files = false;
- in_permissions = false;
+ in_permissions_file = false;
+ in_permissions_dir = false;
in_components = false;
in_configurations = false;
}
@@ -409,7 +529,8 @@ bool cmFileCommand::HandleInstallCommand(
rename = args[i];
in_properties = false;
in_files = false;
- in_permissions = false;
+ in_permissions_file = false;
+ in_permissions_dir = false;
in_components = false;
in_configurations = false;
}
@@ -417,16 +538,28 @@ bool cmFileCommand::HandleInstallCommand(
{
in_properties = true;
in_files = false;
- in_permissions = false;
+ in_permissions_file = false;
+ in_permissions_dir = false;
in_components = false;
in_configurations = false;
}
- else if ( *cstr == "PERMISSIONS" )
+ else if ( *cstr == "PERMISSIONS" )
{
- use_given_permissions = true;
+ use_given_permissions_file = true;
in_properties = false;
in_files = false;
- in_permissions = true;
+ in_permissions_file = true;
+ in_permissions_dir = false;
+ in_components = false;
+ in_configurations = false;
+ }
+ else if ( *cstr == "DIR_PERMISSIONS" )
+ {
+ use_given_permissions_dir = true;
+ in_properties = false;
+ in_files = false;
+ in_permissions_file = false;
+ in_permissions_dir = true;
in_components = false;
in_configurations = false;
}
@@ -434,7 +567,8 @@ bool cmFileCommand::HandleInstallCommand(
{
in_properties = false;
in_files = false;
- in_permissions = false;
+ in_permissions_file = false;
+ in_permissions_dir = false;
in_components = true;
in_configurations = false;
}
@@ -442,7 +576,8 @@ bool cmFileCommand::HandleInstallCommand(
{
in_properties = false;
in_files = false;
- in_permissions = false;
+ in_permissions_file = false;
+ in_permissions_dir = false;
in_components = false;
in_configurations = true;
}
@@ -450,7 +585,8 @@ bool cmFileCommand::HandleInstallCommand(
{
in_files = true;
in_properties = false;
- in_permissions = false;
+ in_permissions_file = false;
+ in_permissions_dir = false;
in_components = false;
in_configurations = false;
}
@@ -471,49 +607,93 @@ bool cmFileCommand::HandleInstallCommand(
{
configurations.insert(cmSystemTools::UpperCase(*cstr));
}
- else if(in_permissions && args[i] == "OWNER_READ")
+ else if(in_permissions_file && args[i] == "OWNER_READ")
+ {
+ permissions_file |= mode_owner_read;
+ }
+ else if(in_permissions_file && args[i] == "OWNER_WRITE")
+ {
+ permissions_file |= mode_owner_write;
+ }
+ else if(in_permissions_file && args[i] == "OWNER_EXECUTE")
+ {
+ permissions_file |= mode_owner_execute;
+ }
+ else if(in_permissions_file && args[i] == "GROUP_READ")
+ {
+ permissions_file |= mode_group_read;
+ }
+ else if(in_permissions_file && args[i] == "GROUP_WRITE")
+ {
+ permissions_file |= mode_group_write;
+ }
+ else if(in_permissions_file && args[i] == "GROUP_EXECUTE")
+ {
+ permissions_file |= mode_group_execute;
+ }
+ else if(in_permissions_file && args[i] == "WORLD_READ")
+ {
+ permissions_file |= mode_world_read;
+ }
+ else if(in_permissions_file && args[i] == "WORLD_WRITE")
+ {
+ permissions_file |= mode_world_write;
+ }
+ else if(in_permissions_file && args[i] == "WORLD_EXECUTE")
+ {
+ permissions_file |= mode_world_execute;
+ }
+ else if(in_permissions_file && args[i] == "SETUID")
+ {
+ permissions_file |= mode_setuid;
+ }
+ else if(in_permissions_file && args[i] == "SETGID")
{
- permissions |= mode_owner_read;
+ permissions_file |= mode_setgid;
}
- else if(in_permissions && args[i] == "OWNER_WRITE")
+ else if(in_permissions_dir && args[i] == "OWNER_READ")
{
- permissions |= mode_owner_write;
+ permissions_dir |= mode_owner_read;
}
- else if(in_permissions && args[i] == "OWNER_EXECUTE")
+ else if(in_permissions_dir && args[i] == "OWNER_WRITE")
{
- permissions |= mode_owner_execute;
+ permissions_dir |= mode_owner_write;
}
- else if(in_permissions && args[i] == "GROUP_READ")
+ else if(in_permissions_dir && args[i] == "OWNER_EXECUTE")
{
- permissions |= mode_group_read;
+ permissions_dir |= mode_owner_execute;
}
- else if(in_permissions && args[i] == "GROUP_WRITE")
+ else if(in_permissions_dir && args[i] == "GROUP_READ")
{
- permissions |= mode_group_write;
+ permissions_dir |= mode_group_read;
}
- else if(in_permissions && args[i] == "GROUP_EXECUTE")
+ else if(in_permissions_dir && args[i] == "GROUP_WRITE")
{
- permissions |= mode_group_execute;
+ permissions_dir |= mode_group_write;
}
- else if(in_permissions && args[i] == "WORLD_READ")
+ else if(in_permissions_dir && args[i] == "GROUP_EXECUTE")
{
- permissions |= mode_world_read;
+ permissions_dir |= mode_group_execute;
}
- else if(in_permissions && args[i] == "WORLD_WRITE")
+ else if(in_permissions_dir && args[i] == "WORLD_READ")
{
- permissions |= mode_world_write;
+ permissions_dir |= mode_world_read;
}
- else if(in_permissions && args[i] == "WORLD_EXECUTE")
+ else if(in_permissions_dir && args[i] == "WORLD_WRITE")
{
- permissions |= mode_world_execute;
+ permissions_dir |= mode_world_write;
}
- else if(in_permissions && args[i] == "SETUID")
+ else if(in_permissions_dir && args[i] == "WORLD_EXECUTE")
{
- permissions |= mode_setuid;
+ permissions_dir |= mode_world_execute;
}
- else if(in_permissions && args[i] == "SETGID")
+ else if(in_permissions_dir && args[i] == "SETUID")
{
- permissions |= mode_setgid;
+ permissions_dir |= mode_setuid;
+ }
+ else if(in_permissions_dir && args[i] == "SETGID")
+ {
+ permissions_dir |= mode_setgid;
}
else
{
@@ -683,9 +863,9 @@ bool cmFileCommand::HandleInstallCommand(
}
}
- // If permissions were not specified set default permissions for
- // this target type.
- if(!use_given_permissions)
+ // If file permissions were not specified set default permissions
+ // for this target type.
+ if(!use_given_permissions_file)
{
switch(itype)
{
@@ -693,36 +873,55 @@ bool cmFileCommand::HandleInstallCommand(
case cmTarget::MODULE_LIBRARY:
#if defined(__linux__)
// Use read/write permissions.
- permissions = 0;
- permissions |= mode_owner_read;
- permissions |= mode_owner_write;
- permissions |= mode_group_read;
- permissions |= mode_world_read;
+ permissions_file = 0;
+ permissions_file |= mode_owner_read;
+ permissions_file |= mode_owner_write;
+ permissions_file |= mode_group_read;
+ permissions_file |= mode_world_read;
break;
#endif
case cmTarget::EXECUTABLE:
case cmTarget::INSTALL_PROGRAMS:
// Use read/write/executable permissions.
- permissions = 0;
- permissions |= mode_owner_read;
- permissions |= mode_owner_write;
- permissions |= mode_owner_execute;
- permissions |= mode_group_read;
- permissions |= mode_group_execute;
- permissions |= mode_world_read;
- permissions |= mode_world_execute;
+ 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 = 0;
- permissions |= mode_owner_read;
- permissions |= mode_owner_write;
- permissions |= mode_group_read;
- permissions |= mode_world_read;
+ permissions_file = 0;
+ permissions_file |= mode_owner_read;
+ permissions_file |= mode_owner_write;
+ permissions_file |= mode_group_read;
+ permissions_file |= mode_world_read;
break;
}
}
+ // If directory permissions were not specified set default permissions.
+ if(!use_given_permissions_dir)
+ {
+ // 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;
+ }
+
+ // Construct a file installer object.
+ cmFileInstaller installer(this, this->Makefile);
+ installer.FilePermissions = permissions_file;
+ installer.DirPermissions = permissions_dir;
+
// Get the current manifest.
const char* manifest_files =
this->Makefile->GetDefinition("CMAKE_INSTALL_MANIFEST_FILES");
@@ -870,35 +1069,20 @@ bool cmFileCommand::HandleInstallCommand(
if(itype == cmTarget::INSTALL_DIRECTORY &&
cmSystemTools::FileIsDirectory(fromFile.c_str()))
{
- // We will install this file. Display the information.
- message = "Installing ";
- message += toFile.c_str();
- this->Makefile->DisplayStatus(message.c_str(), -1);
- if(!cmSystemTools::CopyADirectory(fromFile.c_str(), toFile.c_str(),
- copy_always))
+ // Try installing this directory.
+ if(!installer.InstallDirectory(fromFile.c_str(), toFile.c_str(),
+ copy_always, smanifest_files,
+ destDirLength))
{
- cmOStringStream e;
- e << "INSTALL cannot copy directory \"" << fromFile
- << "\" to \"" << toFile + "\".";
- this->SetError(e.str().c_str());
return false;
}
}
else if(cmSystemTools::FileExists(fromFile.c_str()))
{
- // We will install this file. Display the information.
- message = "Installing ";
- message += toFile.c_str();
- this->Makefile->DisplayStatus(message.c_str(), -1);
-
- // Copy the file.
- if(!cmSystemTools::CopyAFile(fromFile.c_str(), toFile.c_str(),
- copy_always))
+ // Install this file.
+ if(!installer.InstallFile(fromFile.c_str(), toFile.c_str(),
+ copy_always))
{
- cmOStringStream e;
- e << "INSTALL cannot copy file \"" << fromFile
- << "\" to \"" << toFile + "\".";
- this->SetError(e.str().c_str());
return false;
}
@@ -920,16 +1104,6 @@ bool cmFileCommand::HandleInstallCommand(
}
#endif
- // Set permissions of the destination file.
- if(!cmSystemTools::SetPermissions(toFile.c_str(), permissions))
- {
- cmOStringStream e;
- e << "Problem setting permissions on file \""
- << toFile.c_str() << "\"";
- this->SetError(e.str().c_str());
- return false;
- }
-
// Add the file to the manifest.
smanifest_files += ";";
smanifest_files += toFile.substr(destDirLength);