InstallHelpers.cmake (4919B)
1 # Fix CMAKE_INSTALL_MANDIR on BSD before including GNUInstallDirs. #6771 2 if(CMAKE_SYSTEM_NAME MATCHES "BSD" AND NOT DEFINED CMAKE_INSTALL_MANDIR) 3 if(DEFINED ENV{MANPREFIX}) 4 set(CMAKE_INSTALL_MANDIR "$ENV{MANPREFIX}/man") 5 elseif(CMAKE_INSTALL_PREFIX MATCHES "^/usr/local$") 6 set(CMAKE_INSTALL_MANDIR "man") 7 endif() 8 endif() 9 10 # This will create any directories that need to be created in the destination 11 # path with the typical owner, group, and user permissions--independent of the 12 # umask setting. 13 function(create_install_dir_with_perms) 14 cmake_parse_arguments(_install_dir 15 "" 16 "DESTINATION" 17 "DIRECTORY_PERMISSIONS" 18 ${ARGN} 19 ) 20 21 if(NOT _install_dir_DESTINATION) 22 message(FATAL_ERROR "Must specify DESTINATION") 23 endif() 24 25 if(NOT _install_dir_DIRECTORY_PERMISSIONS) 26 set(_install_dir_DIRECTORY_PERMISSIONS 27 OWNER_READ OWNER_WRITE OWNER_EXECUTE 28 GROUP_READ GROUP_EXECUTE 29 WORLD_READ WORLD_EXECUTE) 30 endif() 31 32 install(CODE 33 " 34 set(_current_dir \"\${CMAKE_INSTALL_PREFIX}/${_install_dir_DESTINATION}\") 35 set(_dir_permissions \"${_install_dir_DIRECTORY_PERMISSIONS}\") 36 37 set(_parent_dirs) 38 set(_prev_dir) 39 40 # Explicitly prepend DESTDIR when using EXISTS. 41 # file(INSTALL ...) implicitly respects DESTDIR, but EXISTS does not. 42 while(NOT EXISTS \$ENV{DESTDIR}\${_current_dir} AND NOT \${_prev_dir} STREQUAL \${_current_dir}) 43 list(APPEND _parent_dirs \${_current_dir}) 44 set(_prev_dir \${_current_dir}) 45 get_filename_component(_current_dir \${_current_dir} DIRECTORY) 46 endwhile() 47 48 if(_parent_dirs) 49 list(REVERSE _parent_dirs) 50 endif() 51 52 # Create any missing folders with the useful permissions. Note: this uses 53 # a hidden option of CMake, but it's been shown to work with 2.8.11 thru 54 # 3.0.2. 55 foreach(_current_dir \${_parent_dirs}) 56 if(NOT IS_DIRECTORY \${_current_dir}) 57 # file(INSTALL ...) implicitly respects DESTDIR, so there's no need to 58 # prepend it here. 59 file(INSTALL DESTINATION \${_current_dir} 60 TYPE DIRECTORY 61 DIR_PERMISSIONS \${_dir_permissions} 62 FILES \"\") 63 endif() 64 endforeach() 65 ") 66 endfunction() 67 68 # This is to prevent the user's umask from corrupting the expected permissions 69 # for the parent directories. We want to behave like the install tool here: 70 # preserve what's there already, but create new things with useful permissions. 71 function(install_helper) 72 cmake_parse_arguments(_install_helper 73 "" 74 "DESTINATION;DIRECTORY;RENAME" 75 "FILES;PROGRAMS;TARGETS;DIRECTORY_PERMISSIONS;FILE_PERMISSIONS" 76 ${ARGN} 77 ) 78 79 if(NOT _install_helper_DESTINATION AND NOT _install_helper_TARGETS) 80 message(FATAL_ERROR "Must specify the DESTINATION path") 81 endif() 82 83 if(NOT _install_helper_FILES AND NOT _install_helper_DIRECTORY AND 84 NOT _install_helper_PROGRAMS AND NOT _install_helper_TARGETS) 85 message(FATAL_ERROR "Must specify FILES, PROGRAMS, TARGETS, or a DIRECTORY to install") 86 endif() 87 88 if(NOT _install_helper_DIRECTORY_PERMISSIONS) 89 set(_install_helper_DIRECTORY_PERMISSIONS 90 OWNER_READ OWNER_WRITE OWNER_EXECUTE 91 GROUP_READ GROUP_EXECUTE 92 WORLD_READ WORLD_EXECUTE) 93 endif() 94 95 if(NOT _install_helper_FILE_PERMISSIONS) 96 set(_install_helper_FILE_PERMISSIONS 97 OWNER_READ OWNER_WRITE 98 GROUP_READ 99 WORLD_READ) 100 endif() 101 102 if(NOT _install_helper_PROGRAM_PERMISSIONS) 103 set(_install_helper_PROGRAM_PERMISSIONS 104 OWNER_READ OWNER_WRITE OWNER_EXECUTE 105 GROUP_READ GROUP_EXECUTE 106 WORLD_READ WORLD_EXECUTE) 107 endif() 108 109 if(_install_helper_RENAME) 110 set(RENAME RENAME ${_install_helper_RENAME}) 111 endif() 112 113 if(_install_helper_TARGETS) 114 set(_install_helper_DESTINATION "") 115 endif() 116 117 if(_install_helper_TARGETS) 118 # Ensure the bin area exists with the correct permissions. 119 create_install_dir_with_perms(DESTINATION ${CMAKE_INSTALL_BINDIR}) 120 121 install( 122 TARGETS ${_install_helper_TARGETS} 123 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 124 else() 125 create_install_dir_with_perms( 126 DESTINATION ${_install_helper_DESTINATION} 127 DIRECTORY_PERMISSIONS ${_install_helper_DIRECTORY_PERMISSIONS}) 128 endif() 129 130 if(_install_helper_DIRECTORY) 131 install( 132 DIRECTORY ${_install_helper_DIRECTORY} 133 DESTINATION ${_install_helper_DESTINATION} 134 DIRECTORY_PERMISSIONS ${_install_helper_DIRECTORY_PERMISSIONS} 135 FILE_PERMISSIONS ${_install_helper_FILE_PERMISSIONS}) 136 endif() 137 138 if(_install_helper_FILES) 139 install( 140 FILES ${_install_helper_FILES} 141 DESTINATION ${_install_helper_DESTINATION} 142 PERMISSIONS ${_install_helper_FILE_PERMISSIONS} 143 ${RENAME}) 144 endif() 145 146 if(_install_helper_PROGRAMS) 147 install( 148 PROGRAMS ${_install_helper_PROGRAMS} 149 DESTINATION ${_install_helper_DESTINATION} 150 PERMISSIONS ${_install_helper_PROGRAM_PERMISSIONS} 151 ${RENAME}) 152 endif() 153 endfunction()