ソースを参照

install: Set permissions on directories created by install(DIRECTORY)

The directories that are implicitly created by install(DIRECTORY)
were not having their permissions being set by
CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS. This change refactors
cmFileCopier to take this into account for directory installation.
Kyle Edwards 7 年 前
コミット
5e61b79b82
1 ファイル変更38 行追加18 行削除
  1. 38 18
      Source/cmFileCommand.cxx

+ 38 - 18
Source/cmFileCommand.cxx

@@ -1275,6 +1275,33 @@ protected:
     this->DirPermissions |= mode_world_read;
     this->DirPermissions |= mode_world_execute;
   }
+
+  bool GetDefaultDirectoryPermissions(mode_t** mode)
+  {
+    // check if default dir creation permissions were set
+    const char* default_dir_install_permissions =
+      this->Makefile->GetDefinition(
+        "CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS");
+    if (default_dir_install_permissions && *default_dir_install_permissions) {
+      std::vector<std::string> items;
+      cmSystemTools::ExpandListArgument(default_dir_install_permissions,
+                                        items);
+      for (const auto& arg : items) {
+        if (!this->CheckPermissions(arg, **mode)) {
+          std::ostringstream e;
+          e << this->FileCommand->GetError()
+            << " Set with CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS "
+               "variable.";
+          this->FileCommand->SetError(e.str());
+          return false;
+        }
+      }
+    } else {
+      *mode = nullptr;
+    }
+
+    return true;
+  }
 };
 
 bool cmFileCopier::Parse(std::vector<std::string> const& args)
@@ -1668,8 +1695,15 @@ bool cmFileCopier::InstallDirectory(const char* source,
   this->ReportCopy(destination, TypeDir,
                    !cmSystemTools::FileIsDirectory(destination));
 
+  // check if default dir creation permissions were set
+  mode_t default_dir_mode_v = 0;
+  mode_t* default_dir_mode = &default_dir_mode_v;
+  if (!this->GetDefaultDirectoryPermissions(&default_dir_mode)) {
+    return false;
+  }
+
   // Make sure the destination directory exists.
-  if (!cmSystemTools::MakeDirectory(destination)) {
+  if (!cmSystemTools::MakeDirectory(destination, default_dir_mode)) {
     std::ostringstream e;
     e << this->Name << " cannot make directory \"" << destination
       << "\": " << cmSystemTools::GetLastSystemError();
@@ -2073,23 +2107,9 @@ bool cmFileInstaller::HandleInstallDestination()
 
   // check if default dir creation permissions were set
   mode_t default_dir_mode_v = 0;
-  mode_t* default_dir_mode = nullptr;
-  const char* default_dir_install_permissions = this->Makefile->GetDefinition(
-    "CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS");
-  if (default_dir_install_permissions && *default_dir_install_permissions) {
-    std::vector<std::string> items;
-    cmSystemTools::ExpandListArgument(default_dir_install_permissions, items);
-    for (const auto& arg : items) {
-      if (!this->CheckPermissions(arg, default_dir_mode_v)) {
-        std::ostringstream e;
-        e << this->FileCommand->GetError()
-          << " Set with CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS variable.";
-        this->FileCommand->SetError(e.str());
-        return false;
-      }
-    }
-
-    default_dir_mode = &default_dir_mode_v;
+  mode_t* default_dir_mode = &default_dir_mode_v;
+  if (!this->GetDefaultDirectoryPermissions(&default_dir_mode)) {
+    return false;
   }
 
   if (this->InstallType != cmInstallType_DIRECTORY) {