diff --git a/cmake/modules/InstallationHelper.cmake b/cmake/modules/InstallationHelper.cmake index edca39fb1..eb680a628 100644 --- a/cmake/modules/InstallationHelper.cmake +++ b/cmake/modules/InstallationHelper.cmake @@ -1,177 +1,196 @@ # This file contains facilities for installing the files. include(GNUInstallDirs) include(SanitizeHelper) function(_add_install_target COMPONENT) cmake_parse_arguments(ARG "EXCLUDE_FROM_ALL" "" "DEPENDS" ${ARGN} ) sanitize_target_name("install-" "${COMPONENT}" INSTALL_TARGET) if(NOT TARGET ${INSTALL_TARGET}) add_custom_target(${INSTALL_TARGET} COMMENT "Installing component ${COMPONENT}" COMMAND "${CMAKE_COMMAND}" -E env CMAKE_INSTALL_ALWAYS=ON "${CMAKE_COMMAND}" -DCOMPONENT="${COMPONENT}" -DCMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}" -P cmake_install.cmake WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" ) if(TARGET install-all) add_dependencies(install-all ${INSTALL_TARGET}) endif() endif() # Other arguments are additional dependencies if(ARG_DEPENDS) add_dependencies(${INSTALL_TARGET} ${ARG_DEPENDS}) endif() if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if(NOT TARGET "install-${COMPONENT}-debug") add_custom_target("install-${COMPONENT}-debug" COMMENT "Splitting out the debug symbols for component ${COMPONENT}" COMMAND "${CMAKE_SOURCE_DIR}/cmake/utils/split-installed-component.sh" "${CMAKE_BINARY_DIR}/contrib/devtools/split-debug.sh" "${CMAKE_BINARY_DIR}/install_manifest_${COMPONENT}.txt" "${CMAKE_INSTALL_BINDIR}" "${CMAKE_INSTALL_LIBDIR}" DEPENDS "${INSTALL_TARGET}" "${CMAKE_BINARY_DIR}/contrib/devtools/split-debug.sh" ) endif() if(NOT ARG_EXCLUDE_FROM_ALL AND TARGET install-debug) add_dependencies(install-debug "install-${COMPONENT}-debug") endif() if(TARGET install-all-debug) add_dependencies(install-all-debug "install-${COMPONENT}-debug") endif() endif() endfunction() function(install_target _target) cmake_parse_arguments(ARG "EXCLUDE_FROM_ALL" "COMPONENT" "" ${ARGN} ) if(NOT ARG_COMPONENT) set(ARG_COMPONENT ${PROJECT_NAME}) endif() if(ARG_EXCLUDE_FROM_ALL) set(INSTALL_EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL) endif() set(COMMON_INSTALL_ARGUMENTS COMPONENT ${ARG_COMPONENT} ${INSTALL_EXCLUDE_FROM_ALL} ${ARG_UNPARSED_ARGUMENTS} ) install( TARGETS ${_target} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ${COMMON_INSTALL_ARGUMENTS} ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" ${COMMON_INSTALL_ARGUMENTS} LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ${COMMON_INSTALL_ARGUMENTS} PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ${COMMON_INSTALL_ARGUMENTS} ) _add_install_target("${ARG_COMPONENT}" ${INSTALL_EXCLUDE_FROM_ALL} DEPENDS ${_target} ) endfunction() function(install_shared_library NAME) cmake_parse_arguments(ARG "EXCLUDE_FROM_ALL" "" "PUBLIC_HEADER" ${ARGN} ) set(_sources ${ARG_UNPARSED_ARGUMENTS}) get_target_property(_target_type ${NAME} TYPE) if(_target_type STREQUAL "SHARED_LIBRARY") set(_shared_name "${NAME}") target_sources(${NAME} PRIVATE ${_sources}) else() set(_shared_name "${NAME}-shared") add_library(${_shared_name} SHARED ${_sources}) target_link_libraries(${_shared_name} ${NAME}) endif() if(ARG_PUBLIC_HEADER) set_property(TARGET ${_shared_name} PROPERTY PUBLIC_HEADER ${ARG_PUBLIC_HEADER}) endif() if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") # FIXME For compatibility reason with autotools, the version is set # to 0.0.0 (major being actually 0). This is obviously wrong and the # version of the library should reflect the version of the release. # On platforms other than linux, only the major version (0) is used. # Replace the VERSION line with the statement below to set the # correct version: # set(_properties VERSION "${CMAKE_PROJECT_VERSION}") list(APPEND _properties VERSION "${CMAKE_PROJECT_VERSION_MAJOR}.0.0") else() list(APPEND _properties VERSION "${CMAKE_PROJECT_VERSION_MAJOR}") endif() # For autotools compatibility, rename the library to ${OUTPUT_NAME}-0.dll if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") list(APPEND _properties OUTPUT_NAME "${NAME}-${CMAKE_PROJECT_VERSION_MAJOR}") # DLL_EXPORT is defined by libtool, and is expected by some sources. target_compile_definitions(${_shared_name} PRIVATE DLL_EXPORT) else() list(APPEND _properties OUTPUT_NAME "${NAME}") endif() list(APPEND _properties SOVERSION "${CMAKE_PROJECT_VERSION_MAJOR}") set_target_properties(${_shared_name} PROPERTIES ${_properties}) # Forward EXCLUDE_FROM_ALL if set if(ARG_EXCLUDE_FROM_ALL) set(FORWARD_EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL) endif() install_target(${_shared_name} ${FORWARD_EXCLUDE_FROM_ALL}) endfunction() function(install_manpages) set(MAN_DESTINATION "${CMAKE_INSTALL_MANDIR}/man1") install( FILES ${ARGN} DESTINATION "${MAN_DESTINATION}" COMPONENT manpages ) _add_install_target(manpages) + + if(NOT TARGET install-manpages-html) + set(INPUT_DIR "${CMAKE_INSTALL_PREFIX}/${MAN_DESTINATION}") + set(OUTPUT_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_MANDIR}/html") + configure_file( + "${CMAKE_SOURCE_DIR}/cmake/templates/man2html.sh.in" + "${CMAKE_BINARY_DIR}/man2html.sh" + @ONLY + ) + + add_custom_target(install-manpages-html + COMMENT "Generating man pages for web rendering" + COMMAND + "${CMAKE_BINARY_DIR}/man2html.sh" + DEPENDS + install-manpages + "${CMAKE_BINARY_DIR}/man2html.sh" + ) + endif() endfunction() diff --git a/cmake/templates/man2html.sh.in b/cmake/templates/man2html.sh.in new file mode 100755 index 000000000..5825161da --- /dev/null +++ b/cmake/templates/man2html.sh.in @@ -0,0 +1,34 @@ +#!/bin/sh + +export LC_ALL=C.UTF-8 + +if ! command -v pandoc > /dev/null +then + echo "pandoc is required for converting the man pages, please install it" + exit 1 +fi + +if ! pandoc --list-input-formats | grep -x man > /dev/null +then + echo "pandoc >= 2.4 is required for converting the man pages, please upgrade" + exit 2 +fi + +mkdir -p "@OUTPUT_DIR@" + +MAN_FILES="$(find "@INPUT_DIR@" -name '*.1' -type f)" + +for MAN_FILE in ${MAN_FILES} +do + BINARY_NAME="$(basename "${MAN_FILE}" | cut -d'.' -f1)" + HTML_FILE="@OUTPUT_DIR@/${BINARY_NAME}.html" + + echo "---" > "${HTML_FILE}" + echo "category: man" >> "${HTML_FILE}" + echo "group: @PACKAGE_NAME@ " >> "${HTML_FILE}" + echo "name: ${BINARY_NAME}" >> "${HTML_FILE}" + echo "version: @PROJECT_VERSION@" >> "${HTML_FILE}" + echo "---" >> "${HTML_FILE}" + + pandoc --from=man --to=html "${MAN_FILE}" >> "${HTML_FILE}" +done