Browse Source

cmake-install: implement default directory permissions

provide an argument for default directory permissions in cmake --install

Fixes: #20700
pull/334/head
Asit Dhal 5 years ago
committed by Kyle Edwards
parent
commit
d4812a955b
  1. 3
      Help/manual/cmake.1.rst
  2. 5
      Help/release/dev/install-default-directory-permissions.rst
  3. 139
      Source/cmakemain.cxx
  4. 26
      Tests/RunCMake/CommandLine/RunCMakeTest.cmake
  5. 3
      Tests/RunCMake/CommandLine/dir-permissions-install-options-to-vars/cmake_install.cmake
  6. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-afew-result.txt
  7. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-afew-stderr.txt
  8. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-all-result.txt
  9. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-all-stderr.txt
  10. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-beginning-result.txt
  11. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-beginning-stderr.txt
  12. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-end-result.txt
  13. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-end-stderr.txt
  14. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-comma-at-the-end-result.txt
  15. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-comma-at-the-end-stderr.txt
  16. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-assignment-result.txt
  17. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-assignment-stderr.txt
  18. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma1-result.txt
  19. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma1-stderr.txt
  20. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma2-result.txt
  21. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-invalid-comma2-stderr.txt
  22. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-none-result.txt
  23. 1
      Tests/RunCMake/CommandLine/install-default-dir-permissions-none-stderr.txt

3
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
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
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
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
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
Tests/RunCMake/CommandLine/install-default-dir-permissions-afew-result.txt

@ -0,0 +1 @@
0

1
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
Tests/RunCMake/CommandLine/install-default-dir-permissions-all-result.txt

@ -0,0 +1 @@
0

1
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
Tests/RunCMake/CommandLine/install-default-dir-permissions-assignment-at-the-beginning-result.txt

@ -0,0 +1 @@
1

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

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

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

@ -0,0 +1 @@
0

1
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
Tests/RunCMake/CommandLine/install-default-dir-permissions-comma-at-the-end-result.txt

@ -0,0 +1 @@
1

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

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

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

@ -0,0 +1 @@
1

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

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

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

@ -0,0 +1 @@
1

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

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

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

@ -0,0 +1 @@
1

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

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

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

@ -0,0 +1 @@
0

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

@ -0,0 +1 @@
^$
Loading…
Cancel
Save