diff --git a/CMakeLists.txt b/CMakeLists.txt index cb680da902..3622dabb23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,12 +119,13 @@ endif() message(STATUS "Using the Lua interpreter ${LUA_PRG}") -add_subdirectory(config) -add_subdirectory(src/nvim) -add_subdirectory(test/includes) - +# Setup busted. find_program(BUSTED_PRG busted) +if(NOT BUSTED_OUTPUT_TYPE) + set(BUSTED_OUTPUT_TYPE "utfTerminal") +endif() +# Setup make. find_program(MAKE_PRG NAMES gmake make) if(MAKE_PRG) execute_process( @@ -146,10 +147,47 @@ if(CMAKE_GENERATOR MATCHES "Makefiles") set(MAKE_PRG "$(MAKE)") endif() -if(NOT BUSTED_OUTPUT_TYPE) - set(BUSTED_OUTPUT_TYPE "utfTerminal") -endif() +# CMake is painful here. It will create the destination using the user's +# current umask, and we don't want that. And we don't just want to install +# the target directory, as it will mess with existing permissions. So this +# seems like the best compromise. If we create it, then everyone can see it. +# If it's preexisting, leave it alone. +include(InstallHelpers) +install_helper( + DIRECTORY runtime + DESTINATION share/nvim) + +file(GLOB_RECURSE RUNTIME_PROGRAMS + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + runtime/*.pl runtime/*.awk runtime/*.sh + runtime/tools/ref + runtime/tools/vimm) + +foreach(PROG ${RUNTIME_PROGRAMS}) + get_filename_component(BASEDIR ${PROG} PATH) + install_helper(PROGRAMS ${PROG} DESTINATION share/nvim/${BASEDIR}) +endforeach() + +install(SCRIPT ${CMAKE_MODULE_PATH}/GenerateHelptags.cmake) + +# Unfortunately, the below does not work under Ninja. Ninja doesn't use a +# pseudo-tty when launching processes, because it can put many jobs in parallel +# and eat-up all the available pseudo-ttys. Unfortunately, that doesn't work +# well with the legacy tests. I have a branch that converts them to run under +# CTest, but it needs a little more work. +# add_custom_target(test +# COMMAND ${MAKE_PRG} -C ${CMAKE_CURRENT_SOURCE_DIR}/src/nvim/testdir +# VIMPROG=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nvim) + +# Go down the tree. + +add_subdirectory(config) +add_subdirectory(src/nvim) +add_subdirectory(test/includes) + +# Setup some test-related bits. We do this after going down the tree because we +# need some of the targets. if(BUSTED_PRG) get_property(TEST_INCLUDE_DIRS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) @@ -176,15 +214,3 @@ if(BUSTED_PRG) -P ${CMAKE_MODULE_PATH}/RunUnittests.cmake DEPENDS nvim-test unittest-headers) endif() - -install(DIRECTORY runtime DESTINATION share/nvim) -install(SCRIPT ${CMAKE_MODULE_PATH}/GenerateHelptags.cmake) - -# Unfortunately, the below does not work under Ninja. Ninja doesn't use a -# pseudo-tty when launching processes, because it can put many jobs in parallel -# and eat-up all the available pseudo-ttys. Unfortunately, that doesn't work -# well with the legacy tests. I have a branch that converts them to run under -# CTest, but it needs a little more work. -# add_custom_target(test -# COMMAND ${MAKE_PRG} -C ${CMAKE_CURRENT_SOURCE_DIR}/src/nvim/testdir -# VIMPROG=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/nvim) diff --git a/cmake/InstallHelpers.cmake b/cmake/InstallHelpers.cmake new file mode 100644 index 0000000000..de2f970cc1 --- /dev/null +++ b/cmake/InstallHelpers.cmake @@ -0,0 +1,136 @@ +# 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 + " + if(ENV{DESTDIR}) + set(PREFIX \$ENV{DESTDIR}/\${CMAKE_INSTALL_PREFIX}) + else() + set(PREFIX \${CMAKE_INSTALL_PREFIX}) + endif() + + set(_current_dir \"\${PREFIX}/${_install_dir_DESTINATION}\") + set(_dir_permissions \"${_install_dir_DIRECTORY_PERMISSIONS}\") + + set(_parent_dirs) + while(NOT EXISTS \${_current_dir}) + list(APPEND _parent_dirs \${_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 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(_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_FILE_PERMISSIONS} + ${RENAME}) + endif() +endfunction() diff --git a/runtime/doc/vim2html.pl b/runtime/doc/vim2html.pl old mode 100644 new mode 100755 diff --git a/runtime/indent/lifelines.vim b/runtime/indent/lifelines.vim old mode 100755 new mode 100644 diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt index 83de3347bd..208df31596 100644 --- a/src/nvim/CMakeLists.txt +++ b/src/nvim/CMakeLists.txt @@ -174,7 +174,7 @@ if(NOT DEFINED ENV{SKIP_EXEC}) add_executable(nvim ${NEOVIM_GENERATED_SOURCES} ${NEOVIM_SOURCES} ${NEOVIM_HEADERS}) target_link_libraries(nvim ${NVIM_LINK_LIBRARIES}) - install(TARGETS nvim RUNTIME DESTINATION bin) + install_helper(TARGETS nvim) endif() if(NOT DEFINED ENV{SKIP_UNITTEST}) diff --git a/src/nvim/po/CMakeLists.txt b/src/nvim/po/CMakeLists.txt index 4a9c97dc20..0ed39e8c49 100644 --- a/src/nvim/po/CMakeLists.txt +++ b/src/nvim/po/CMakeLists.txt @@ -71,7 +71,7 @@ if(HAVE_WORKING_LIBINTL AND GETTEXT_FOUND AND XGETTEXT_PRG AND ICONV_PRG AND -P ${CMAKE_MODULE_PATH}/RunMsgfmt.cmake DEPENDS ${poFile} ${NVIM_POT}) - install( + install_helper( FILES ${moFile} DESTINATION share/locale/${name}/LC_MESSAGES RENAME nvim.mo)