mirror of
https://github.com/neovim/neovim.git
synced 2024-12-27 14:21:31 -07:00
6e87557c08
It turns out that CMake always canonicalizes `CMAKE_INSTALL_PREFIX` to an absolute path--if it's a relative path, it canonicalizes it relative to the build directory. As a result, the only thing the DESTDIR and relative directory check prevents is an installation into the root directory since CMake strips the trailing slash, turning "/" into an empty string. Let's just remove the check all together, since it cannot accomplish what we intended.
145 lines
4.4 KiB
CMake
145 lines
4.4 KiB
CMake
# 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 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_PROGRAM_PERMISSIONS}
|
|
${RENAME})
|
|
endif()
|
|
endfunction()
|