Browse Source

Merge topic 'install-default-directory-permissions'

d4812a955b cmake-install: implement default directory permissions

Acked-by: Kitware Robot <[email protected]>
Merge-request: !4927
Kyle Edwards 5 years ago
parent
commit
5fc7c14528
23 changed files with 194 additions and 0 deletions
  1. 3 0
      Help/manual/cmake.1.rst
  2. 5 0
      Help/release/dev/install-default-directory-permissions.rst
  3. 139 0
      Source/cmakemain.cxx
  4. 26 0
      Tests/RunCMake/CommandLine/RunCMakeTest.cmake
  5. 3 0
      Tests/RunCMake/CommandLine/dir-permissions-install-options-to-vars/cmake_install.cmake
  6. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-afew-result.txt
  7. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-afew-stderr.txt
  8. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-all-result.txt
  9. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-all-stderr.txt
  10. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-beginning-result.txt
  11. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-beginning-stderr.txt
  12. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-end-result.txt
  13. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-end-stderr.txt
  14. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-comma-at-the-end-result.txt
  15. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-comma-at-the-end-stderr.txt
  16. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-assignment-result.txt
  17. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-assignment-stderr.txt
  18. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma1-result.txt
  19. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma1-stderr.txt
  20. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma2-result.txt
  21. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma2-stderr.txt
  22. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-none-result.txt
  23. 1 0
      Tests/RunCMake/CommandLine/install-default-dir-permissions-none-stderr.txt

+ 3 - 0
Help/manual/cmake.1.rst

@@ -450,6 +450,9 @@ The options are:
 ``--component <comp>``
   Component-based install. Only install component ``<comp>``.
 
+``--default-directory-permissions <permissions>``
+  Default directory install permissions. Permissions in format ``<u=rwx,g=rx,o=rx>``.
+
 ``--prefix <prefix>``
   Override the installation prefix, :variable:`CMAKE_INSTALL_PREFIX`.
 

+ 5 - 0
Help/release/dev/install-default-directory-permissions.rst

@@ -0,0 +1,5 @@
+install-default-directory-permissions
+-------------------------------------
+
+* The ``--install`` argument of the :manual:`cmake(1)` command line tool gained a
+  ``--default-directory-permissions`` argument.

+ 139 - 0
Source/cmakemain.cxx

@@ -3,11 +3,13 @@
 
 #include "cmConfigure.h" // IWYU pragma: keep
 
+#include <algorithm>
 #include <cassert>
 #include <cctype>
 #include <climits>
 #include <cstring>
 #include <iostream>
+#include <sstream>
 #include <string>
 #include <vector>
 
@@ -517,6 +519,121 @@ int do_build(int ac, char const* const* av)
 #endif
 }
 
+bool parse_default_directory_permissions(const std::string& permissions,
+                                         std::string& parsedPermissionsVar)
+{
+  std::vector<std::string> parsedPermissions;
+  enum Doing
+  {
+    DoingNone,
+    DoingOwner,
+    DoingGroup,
+    DoingWorld,
+    DoingOwnerAssignment,
+    DoingGroupAssignment,
+    DoingWorldAssignment,
+  };
+  Doing doing = DoingNone;
+
+  auto uniquePushBack = [&parsedPermissions](const std::string& e) {
+    if (std::find(parsedPermissions.begin(), parsedPermissions.end(), e) ==
+        parsedPermissions.end()) {
+      parsedPermissions.push_back(e);
+    }
+  };
+
+  for (auto const& e : permissions) {
+    switch (doing) {
+      case DoingNone:
+        if (e == 'u') {
+          doing = DoingOwner;
+        } else if (e == 'g') {
+          doing = DoingGroup;
+        } else if (e == 'o') {
+          doing = DoingWorld;
+        } else {
+          return false;
+        }
+        break;
+      case DoingOwner:
+        if (e == '=') {
+          doing = DoingOwnerAssignment;
+        } else {
+          return false;
+        }
+        break;
+      case DoingGroup:
+        if (e == '=') {
+          doing = DoingGroupAssignment;
+        } else {
+          return false;
+        }
+        break;
+      case DoingWorld:
+        if (e == '=') {
+          doing = DoingWorldAssignment;
+        } else {
+          return false;
+        }
+        break;
+      case DoingOwnerAssignment:
+        if (e == 'r') {
+          uniquePushBack("OWNER_READ");
+        } else if (e == 'w') {
+          uniquePushBack("OWNER_WRITE");
+        } else if (e == 'x') {
+          uniquePushBack("OWNER_EXECUTE");
+        } else if (e == ',') {
+          doing = DoingNone;
+        } else {
+          return false;
+        }
+        break;
+      case DoingGroupAssignment:
+        if (e == 'r') {
+          uniquePushBack("GROUP_READ");
+        } else if (e == 'w') {
+          uniquePushBack("GROUP_WRITE");
+        } else if (e == 'x') {
+          uniquePushBack("GROUP_EXECUTE");
+        } else if (e == ',') {
+          doing = DoingNone;
+        } else {
+          return false;
+        }
+        break;
+      case DoingWorldAssignment:
+        if (e == 'r') {
+          uniquePushBack("WORLD_READ");
+        } else if (e == 'w') {
+          uniquePushBack("WORLD_WRITE");
+        } else if (e == 'x') {
+          uniquePushBack("WORLD_EXECUTE");
+        } else if (e == ',') {
+          doing = DoingNone;
+        } else {
+          return false;
+        }
+        break;
+    }
+  }
+  if (doing != DoingOwnerAssignment && doing != DoingGroupAssignment &&
+      doing != DoingWorldAssignment) {
+    return false;
+  }
+
+  std::ostringstream oss;
+  for (auto i = 0u; i < parsedPermissions.size(); i++) {
+    if (i != 0) {
+      oss << ";";
+    }
+    oss << parsedPermissions[i];
+  }
+
+  parsedPermissionsVar = oss.str();
+  return true;
+}
+
 int do_install(int ac, char const* const* av)
 {
 #ifdef CMAKE_BOOTSTRAP
@@ -527,6 +644,7 @@ int do_install(int ac, char const* const* av)
 
   std::string config;
   std::string component;
+  std::string defaultDirectoryPermissions;
   std::string prefix;
   std::string dir;
   bool strip = false;
@@ -539,6 +657,7 @@ int do_install(int ac, char const* const* av)
     DoingConfig,
     DoingComponent,
     DoingPrefix,
+    DoingDefaultDirectoryPermissions,
   };
 
   Doing doing = DoingDir;
@@ -557,6 +676,8 @@ int do_install(int ac, char const* const* av)
                (strcmp(av[i], "-v") == 0)) {
       verbose = true;
       doing = DoingNone;
+    } else if (strcmp(av[i], "--default-directory-permissions") == 0) {
+      doing = DoingDefaultDirectoryPermissions;
     } else {
       switch (doing) {
         case DoingDir:
@@ -575,6 +696,10 @@ int do_install(int ac, char const* const* av)
           prefix = av[i];
           doing = DoingNone;
           break;
+        case DoingDefaultDirectoryPermissions:
+          defaultDirectoryPermissions = av[i];
+          doing = DoingNone;
+          break;
         default:
           std::cerr << "Unknown argument " << av[i] << std::endl;
           dir.clear();
@@ -591,6 +716,8 @@ int do_install(int ac, char const* const* av)
       "  <dir>              = Project binary directory to install.\n"
       "  --config <cfg>     = For multi-configuration tools, choose <cfg>.\n"
       "  --component <comp> = Component-based install. Only install <comp>.\n"
+      "  --default-directory-permissions <permission> \n"
+      "     Default install permission. Use default permission <permission>.\n"
       "  --prefix <prefix>  = The installation prefix CMAKE_INSTALL_PREFIX.\n"
       "  --strip            = Performing install/strip.\n"
       "  -v --verbose       = Enable verbose output.\n"
@@ -631,6 +758,18 @@ int do_install(int ac, char const* const* av)
     args.emplace_back("-DCMAKE_INSTALL_CONFIG_NAME=" + config);
   }
 
+  if (!defaultDirectoryPermissions.empty()) {
+    std::string parsedPermissionsVar;
+    if (!parse_default_directory_permissions(defaultDirectoryPermissions,
+                                             parsedPermissionsVar)) {
+      std::cerr << "--default-directory-permissions is in incorrect format"
+                << std::endl;
+      return 1;
+    }
+    args.emplace_back("-DCMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS=" +
+                      parsedPermissionsVar);
+  }
+
   args.emplace_back("-P");
   args.emplace_back(dir + "/cmake_install.cmake");
 

+ 26 - 0
Tests/RunCMake/CommandLine/RunCMakeTest.cmake

@@ -67,6 +67,32 @@ run_cmake_command(install-bad-dir
 run_cmake_command(install-options-to-vars
   ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-install-options-to-vars
   --strip --prefix /var/test --config sample --component pack)
+run_cmake_command(install-default-dir-permissions-all
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars
+  --default-directory-permissions u=rwx,g=rx,o=rx)
+run_cmake_command(install-default-dir-permissions-afew
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars
+  --default-directory-permissions u=rwx,g=rx)
+run_cmake_command(install-default-dir-permissions-none
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars)
+run_cmake_command(install-default-dir-permissions-invalid-comma1
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars
+  --default-directory-permissions u=rwxg=,x)
+run_cmake_command(install-default-dir-permissions-invalid-comma2
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars
+  --default-directory-permissions u=rwxg,=x)
+run_cmake_command(install-default-dir-permissions-comma-at-the-end
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars
+  --default-directory-permissions u=rwx,)
+run_cmake_command(install-default-dir-permissions-invalid-assignment
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars
+  --default-directory-permissions u=rwx,=x)
+run_cmake_command(install-default-dir-permissions-assignment-at-the-end
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars
+  --default-directory-permissions u=rwx,g=)
+run_cmake_command(install-default-dir-permissions-assignment-at-the-beginning
+  ${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-permissions-install-options-to-vars
+  --default-directory-permissions =u=rwx,g=rx)
 
 run_cmake_command(cache-bad-entry
   ${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-entry/)

+ 3 - 0
Tests/RunCMake/CommandLine/dir-permissions-install-options-to-vars/cmake_install.cmake

@@ -0,0 +1,3 @@
+if(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS)
+  message("CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS is ${CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS}")
+endif()

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-afew-result.txt

@@ -0,0 +1 @@
+0

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-afew-stderr.txt

@@ -0,0 +1 @@
+CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS is OWNER_READ;OWNER_WRITE;OWNER_EXECUTE;GROUP_READ;GROUP_EXECUTE

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-all-result.txt

@@ -0,0 +1 @@
+0

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-all-stderr.txt

@@ -0,0 +1 @@
+CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS is OWNER_READ;OWNER_WRITE;OWNER_EXECUTE;GROUP_READ;GROUP_EXECUTE;WORLD_READ;WORLD_EXECUTE

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-beginning-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-beginning-stderr.txt

@@ -0,0 +1 @@
+--default-directory-permissions is in incorrect format

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-end-result.txt

@@ -0,0 +1 @@
+0

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-end-stderr.txt

@@ -0,0 +1 @@
+CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS is OWNER_READ;OWNER_WRITE;OWNER_EXECUTE

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-comma-at-the-end-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-comma-at-the-end-stderr.txt

@@ -0,0 +1 @@
+--default-directory-permissions is in incorrect format

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-assignment-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-assignment-stderr.txt

@@ -0,0 +1 @@
+--default-directory-permissions is in incorrect format

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma1-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma1-stderr.txt

@@ -0,0 +1 @@
+--default-directory-permissions is in incorrect format

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma2-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma2-stderr.txt

@@ -0,0 +1 @@
+--default-directory-permissions is in incorrect format

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-none-result.txt

@@ -0,0 +1 @@
+0

+ 1 - 0
Tests/RunCMake/CommandLine/install-default-dir-permissions-none-stderr.txt

@@ -0,0 +1 @@
+^$