diff options
author | John Szakmeister <john@szakmeister.net> | 2014-09-22 05:56:59 -0400 |
---|---|---|
committer | John Szakmeister <john@szakmeister.net> | 2014-09-22 05:56:59 -0400 |
commit | a4b9e0df67ae95777f8f7d833e7d4c6b8fc3840c (patch) | |
tree | bf4c79a74728022dd5566d6373cc9e6e7ac39831 /cmake/InstallHelpers.cmake | |
parent | 2f212ca2ebec9a735c3ae4904fc1a1adbeb5d908 (diff) | |
parent | 0d35369324e75b2abfbfd59978939c16f7960d23 (diff) | |
download | rneovim-a4b9e0df67ae95777f8f7d833e7d4c6b8fc3840c.tar.gz rneovim-a4b9e0df67ae95777f8f7d833e7d4c6b8fc3840c.tar.bz2 rneovim-a4b9e0df67ae95777f8f7d833e7d4c6b8fc3840c.zip |
Merge #1213 'Fix install permissions'
Diffstat (limited to 'cmake/InstallHelpers.cmake')
-rw-r--r-- | cmake/InstallHelpers.cmake | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/cmake/InstallHelpers.cmake b/cmake/InstallHelpers.cmake new file mode 100644 index 0000000000..de2f970cc1 --- /dev/null +++ b/cmake/InstallHelpers.cmake @@ -0,0 +1,136 @@ +# This will create any directories that need to be created in the destination +# path with the typical owner, group, and user permissions--independent of the +# umask setting. +function(create_install_dir_with_perms) + cmake_parse_arguments(_install_dir + "" + "DESTINATION" + "DIRECTORY_PERMISSIONS" + ${ARGN} + ) + + if(NOT _install_dir_DESTINATION) + message(FATAL_ERROR "Must specify DESTINATION") + endif() + + if(NOT _install_dir_DIRECTORY_PERMISSIONS) + set(_install_dir_DIRECTORY_PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + endif() + + install(CODE + " + if(ENV{DESTDIR}) + set(PREFIX \$ENV{DESTDIR}/\${CMAKE_INSTALL_PREFIX}) + else() + set(PREFIX \${CMAKE_INSTALL_PREFIX}) + endif() + + set(_current_dir \"\${PREFIX}/${_install_dir_DESTINATION}\") + set(_dir_permissions \"${_install_dir_DIRECTORY_PERMISSIONS}\") + + set(_parent_dirs) + while(NOT EXISTS \${_current_dir}) + list(APPEND _parent_dirs \${_current_dir}) + get_filename_component(_current_dir \${_current_dir} PATH) + endwhile() + + if(_parent_dirs) + list(REVERSE _parent_dirs) + endif() + + # Create any missing folders with the useful permissions. Note: this uses + # a hidden option of CMake, but it's been shown to work with 2.8.11 thru + # 3.0.2. + foreach(_current_dir \${_parent_dirs}) + if(NOT IS_DIRECTORY \${_current_dir}) + file(INSTALL DESTINATION \${_current_dir} + TYPE DIRECTORY + DIR_PERMISSIONS \${_dir_permissions} + FILES \"\") + endif() + endforeach() + ") +endfunction() + +# This is to prevent the user's umask from corrupting the expected permissions +# for the parent directories. We want to behave like the install tool here: +# preserve what's there already, but create new things with useful permissions. +function(install_helper) + cmake_parse_arguments(_install_helper + "" + "DESTINATION;DIRECTORY;RENAME" + "FILES;PROGRAMS;TARGETS;DIRECTORY_PERMISSIONS;FILE_PERMISSIONS" + ${ARGN} + ) + + if(NOT _install_helper_DESTINATION AND NOT _install_helper_TARGETS) + message(FATAL_ERROR "Must specify the DESTINATION path") + endif() + + if(NOT _install_helper_FILES AND NOT _install_helper_DIRECTORY AND + NOT _install_helper_PROGRAMS AND NOT _install_helper_TARGETS) + message(FATAL_ERROR "Must specify FILES, PROGRAMS, TARGETS, or a DIRECTORY to install") + endif() + + if(NOT _install_helper_DIRECTORY_PERMISSIONS) + set(_install_helper_DIRECTORY_PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + endif() + + if(NOT _install_helper_FILE_PERMISSIONS) + set(_install_helper_FILE_PERMISSIONS + OWNER_READ OWNER_WRITE + GROUP_READ + WORLD_READ) + endif() + + if(_install_helper_RENAME) + set(RENAME RENAME ${_install_helper_RENAME}) + endif() + + if(_install_helper_TARGETS) + set(_install_helper_DESTINATION "") + endif() + + if(_install_helper_TARGETS) + # Ensure the bin area exists with the correct permissions. + create_install_dir_with_perms(DESTINATION bin) + + install( + TARGETS ${_install_helper_TARGETS} + RUNTIME DESTINATION bin) + else() + create_install_dir_with_perms( + DESTINATION ${_install_helper_DESTINATION} + DIRECTORY_PERMISSIONS ${_install_helper_DIRECTORY_PERMISSIONS}) + endif() + + if(_install_helper_DIRECTORY) + install( + DIRECTORY ${_install_helper_DIRECTORY} + DESTINATION ${_install_helper_DESTINATION} + DIRECTORY_PERMISSIONS ${_install_helper_DIRECTORY_PERMISSIONS} + FILE_PERMISSIONS ${_install_helper_FILE_PERMISSIONS}) + endif() + + if(_install_helper_FILES) + install( + FILES ${_install_helper_FILES} + DESTINATION ${_install_helper_DESTINATION} + PERMISSIONS ${_install_helper_FILE_PERMISSIONS} + ${RENAME}) + endif() + + if(_install_helper_PROGRAMS) + install( + PROGRAMS ${_install_helper_PROGRAMS} + DESTINATION ${_install_helper_DESTINATION} + PERMISSIONS ${_install_helper_FILE_PERMISSIONS} + ${RENAME}) + endif() +endfunction() |