Merge topic 'install-default-directory-permissions'
d4812a955b
cmake-install: implement default directory permissions
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !4927
This commit is contained in:
commit
5fc7c14528
@ -450,6 +450,9 @@ The options are:
|
|||||||
``--component <comp>``
|
``--component <comp>``
|
||||||
Component-based install. Only install 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>``
|
``--prefix <prefix>``
|
||||||
Override the installation prefix, :variable:`CMAKE_INSTALL_PREFIX`.
|
Override the installation prefix, :variable:`CMAKE_INSTALL_PREFIX`.
|
||||||
|
|
||||||
|
@ -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.
|
@ -3,11 +3,13 @@
|
|||||||
|
|
||||||
#include "cmConfigure.h" // IWYU pragma: keep
|
#include "cmConfigure.h" // IWYU pragma: keep
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -517,6 +519,121 @@ int do_build(int ac, char const* const* av)
|
|||||||
#endif
|
#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)
|
int do_install(int ac, char const* const* av)
|
||||||
{
|
{
|
||||||
#ifdef CMAKE_BOOTSTRAP
|
#ifdef CMAKE_BOOTSTRAP
|
||||||
@ -527,6 +644,7 @@ int do_install(int ac, char const* const* av)
|
|||||||
|
|
||||||
std::string config;
|
std::string config;
|
||||||
std::string component;
|
std::string component;
|
||||||
|
std::string defaultDirectoryPermissions;
|
||||||
std::string prefix;
|
std::string prefix;
|
||||||
std::string dir;
|
std::string dir;
|
||||||
bool strip = false;
|
bool strip = false;
|
||||||
@ -539,6 +657,7 @@ int do_install(int ac, char const* const* av)
|
|||||||
DoingConfig,
|
DoingConfig,
|
||||||
DoingComponent,
|
DoingComponent,
|
||||||
DoingPrefix,
|
DoingPrefix,
|
||||||
|
DoingDefaultDirectoryPermissions,
|
||||||
};
|
};
|
||||||
|
|
||||||
Doing doing = DoingDir;
|
Doing doing = DoingDir;
|
||||||
@ -557,6 +676,8 @@ int do_install(int ac, char const* const* av)
|
|||||||
(strcmp(av[i], "-v") == 0)) {
|
(strcmp(av[i], "-v") == 0)) {
|
||||||
verbose = true;
|
verbose = true;
|
||||||
doing = DoingNone;
|
doing = DoingNone;
|
||||||
|
} else if (strcmp(av[i], "--default-directory-permissions") == 0) {
|
||||||
|
doing = DoingDefaultDirectoryPermissions;
|
||||||
} else {
|
} else {
|
||||||
switch (doing) {
|
switch (doing) {
|
||||||
case DoingDir:
|
case DoingDir:
|
||||||
@ -575,6 +696,10 @@ int do_install(int ac, char const* const* av)
|
|||||||
prefix = av[i];
|
prefix = av[i];
|
||||||
doing = DoingNone;
|
doing = DoingNone;
|
||||||
break;
|
break;
|
||||||
|
case DoingDefaultDirectoryPermissions:
|
||||||
|
defaultDirectoryPermissions = av[i];
|
||||||
|
doing = DoingNone;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
std::cerr << "Unknown argument " << av[i] << std::endl;
|
std::cerr << "Unknown argument " << av[i] << std::endl;
|
||||||
dir.clear();
|
dir.clear();
|
||||||
@ -591,6 +716,8 @@ int do_install(int ac, char const* const* av)
|
|||||||
" <dir> = Project binary directory to install.\n"
|
" <dir> = Project binary directory to install.\n"
|
||||||
" --config <cfg> = For multi-configuration tools, choose <cfg>.\n"
|
" --config <cfg> = For multi-configuration tools, choose <cfg>.\n"
|
||||||
" --component <comp> = Component-based install. Only install <comp>.\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"
|
" --prefix <prefix> = The installation prefix CMAKE_INSTALL_PREFIX.\n"
|
||||||
" --strip = Performing install/strip.\n"
|
" --strip = Performing install/strip.\n"
|
||||||
" -v --verbose = Enable verbose output.\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);
|
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("-P");
|
||||||
args.emplace_back(dir + "/cmake_install.cmake");
|
args.emplace_back(dir + "/cmake_install.cmake");
|
||||||
|
|
||||||
|
@ -67,6 +67,32 @@ run_cmake_command(install-bad-dir
|
|||||||
run_cmake_command(install-options-to-vars
|
run_cmake_command(install-options-to-vars
|
||||||
${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-install-options-to-vars
|
${CMAKE_COMMAND} --install ${RunCMake_SOURCE_DIR}/dir-install-options-to-vars
|
||||||
--strip --prefix /var/test --config sample --component pack)
|
--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
|
run_cmake_command(cache-bad-entry
|
||||||
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-entry/)
|
${CMAKE_COMMAND} --build ${RunCMake_SOURCE_DIR}/cache-bad-entry/)
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
if(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS)
|
||||||
|
message("CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS is ${CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS}")
|
||||||
|
endif()
|
@ -0,0 +1 @@
|
|||||||
|
0
|
@ -0,0 +1 @@
|
|||||||
|
CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS is OWNER_READ;OWNER_WRITE;OWNER_EXECUTE;GROUP_READ;GROUP_EXECUTE
|
@ -0,0 +1 @@
|
|||||||
|
0
|
@ -0,0 +1 @@
|
|||||||
|
CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS is OWNER_READ;OWNER_WRITE;OWNER_EXECUTE;GROUP_READ;GROUP_EXECUTE;WORLD_READ;WORLD_EXECUTE
|
@ -0,0 +1 @@
|
|||||||
|
1
|
@ -0,0 +1 @@
|
|||||||
|
--default-directory-permissions is in incorrect format
|
@ -0,0 +1 @@
|
|||||||
|
0
|
@ -0,0 +1 @@
|
|||||||
|
CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS is OWNER_READ;OWNER_WRITE;OWNER_EXECUTE
|
@ -0,0 +1 @@
|
|||||||
|
1
|
@ -0,0 +1 @@
|
|||||||
|
--default-directory-permissions is in incorrect format
|
@ -0,0 +1 @@
|
|||||||
|
1
|
@ -0,0 +1 @@
|
|||||||
|
--default-directory-permissions is in incorrect format
|
@ -0,0 +1 @@
|
|||||||
|
1
|
@ -0,0 +1 @@
|
|||||||
|
--default-directory-permissions is in incorrect format
|
@ -0,0 +1 @@
|
|||||||
|
1
|
@ -0,0 +1 @@
|
|||||||
|
--default-directory-permissions is in incorrect format
|
@ -0,0 +1 @@
|
|||||||
|
0
|
@ -0,0 +1 @@
|
|||||||
|
^$
|
Loading…
Reference in New Issue
Block a user