neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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()