1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
# For $CMAKE_INSTALL_{DATAROOT,MAN, ...}DIR
include(GNUInstallDirs)
# 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
"
set(_current_dir \"\${CMAKE_INSTALL_PREFIX}/${_install_dir_DESTINATION}\")
set(_dir_permissions \"${_install_dir_DIRECTORY_PERMISSIONS}\")
set(_parent_dirs)
set(_prev_dir)
# Explicitly prepend DESTDIR when using EXISTS.
# file(INSTALL ...) implicitly respects DESTDIR, but EXISTS does not.
while(NOT EXISTS \$ENV{DESTDIR}\${_current_dir} AND NOT \${_prev_dir} STREQUAL \${_current_dir})
list(APPEND _parent_dirs \${_current_dir})
set(_prev_dir \${_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 ...) implicitly respects DESTDIR, so there's no need to
# prepend it here.
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(NOT _install_helper_PROGRAM_PERMISSIONS)
set(_install_helper_PROGRAM_PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE)
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 ${CMAKE_INSTALL_BINDIR})
install(
TARGETS ${_install_helper_TARGETS}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
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_PROGRAM_PERMISSIONS}
${RENAME})
endif()
endfunction()
|