forked from neovim/neovim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInstallHelpers.cmake
156 lines (134 loc) · 4.87 KB
/
InstallHelpers.cmake
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
148
149
150
151
152
153
154
155
156
# Fix CMAKE_INSTALL_MANDIR on BSD before including GNUInstallDirs. #6771
if(CMAKE_SYSTEM_NAME MATCHES "BSD" AND NOT DEFINED CMAKE_INSTALL_MANDIR)
if(DEFINED ENV{MANPREFIX})
set(CMAKE_INSTALL_MANDIR "$ENV{MANPREFIX}/man")
elseif(CMAKE_INSTALL_PREFIX MATCHES "^/usr/local$")
set(CMAKE_INSTALL_MANDIR "man")
endif()
endif()
# 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()