diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 03:32:49 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 03:32:49 +0000 |
commit | 8053187731ae8e3eb368d8360989cf5fd6eed9f7 (patch) | |
tree | 32bada84ff5d7460cdf3934fcbdbe770d6afe4cd /cmake/Modules/AdocMan.cmake | |
parent | Initial commit. (diff) | |
download | rnp-8053187731ae8e3eb368d8360989cf5fd6eed9f7.tar.xz rnp-8053187731ae8e3eb368d8360989cf5fd6eed9f7.zip |
Adding upstream version 0.17.0.upstream/0.17.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'cmake/Modules/AdocMan.cmake')
-rw-r--r-- | cmake/Modules/AdocMan.cmake | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/cmake/Modules/AdocMan.cmake b/cmake/Modules/AdocMan.cmake new file mode 100644 index 0000000..96c5c93 --- /dev/null +++ b/cmake/Modules/AdocMan.cmake @@ -0,0 +1,135 @@ +# Copyright (c) 2021 Ribose Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +#.adoc: +# add_adoc_man +# ----------- +# +# Convert adoc manual page to troff and install it via the custom target. +# +# Parameters +# ^^^^^^^^^^ +# Required parameter is source with markdown file. Must have md extension with man category prepended, i.e. something like ${CMAKE_SOURCE_DIR}/src/utility.1.adoc +# DST - optional parameter, which overrides where generated man will be stored. +# If not specified then will be automatically set to ${CMAKE_BINARY_DIR}/src/utility.1 +# +# Generated man page will be installed via the target, named man_utility +# + +set(ADOCCOMMAND_FOUND 0) +find_program(ADOCCOMMAND_PATH + NAMES asciidoctor + DOC "Path to AsciiDoc processor. Used to generate man pages from AsciiDoc." +) + +if(NOT EXISTS ${ADOCCOMMAND_PATH}) + set(ADOC_MISSING_MSG "AsciiDoc processor not found, man pages will not be generated. Install asciidoctor or use the CMAKE_PROGRAM_PATH variable.") + + string(TOLOWER "${ENABLE_DOC}" ENABLE_DOC) + if (ENABLE_DOC STREQUAL "auto") + message(WARNING ${ADOC_MISSING_MSG}) + elseif(ENABLE_DOC) + message(FATAL_ERROR ${ADOC_MISSING_MSG}) + endif() +else() + set(ADOCCOMMAND_FOUND 1) +endif() + +function(add_adoc_man SRC COMPONENT_VERSION) + if (NOT ${ADOCCOMMAND_FOUND}) + return() + endif() + + cmake_parse_arguments( + ARGS + "" + "DST" + "" + ${ARGN} + ) + + set(ADOC_EXT ".adoc") + get_filename_component(FILE_NAME ${SRC} NAME) + + # The following procedures check against the expected file name + # pattern: "{name}.{man-number}.adoc", and builds to a + # destination file "{name}.{man-number}". + + # Check SRC extension + get_filename_component(END_EXT ${SRC} LAST_EXT) + string(COMPARE EQUAL ${END_EXT} ${ADOC_EXT} _equal) + if (NOT _equal) + message(FATAL_ERROR "SRC must have ${ADOC_EXT} extension.") + endif() + + # Check man number + get_filename_component(EXTS ${SRC} EXT) + string(REGEX MATCH "^\.([1-9])\.+$" _matches ${EXTS}) + set(MAN_NUM ${CMAKE_MATCH_1}) + if (NOT _matches) + message(FATAL_ERROR "Man file with wrong name pattern: ${FILE_NAME} must be in format {name}.[0-9]${ADOC_EXT}.") + endif() + + # Set target name + get_filename_component(TARGET_NAME ${SRC} NAME_WE) + string(PREPEND TARGET_NAME "man_") + + # Build output path if not specified. + if(NOT DST) + get_filename_component(SRC_PREFIX ${SRC} DIRECTORY) + + # Ensure that SRC_PREFIX is within CMAKE_SOURCE_DIR + if(NOT(SRC_PREFIX MATCHES "^${CMAKE_SOURCE_DIR}")) + message(FATAL_ERROR "Cannot build DST path as SRC is outside of the CMake sources dir.") + endif() + STRING(REGEX REPLACE "^${CMAKE_SOURCE_DIR}/" "" SUBDIR_PATH ${SRC}) + + # Strip '.adoc' from the output subpath + get_filename_component(SUBDIR_PATH_NAME_WLE ${SUBDIR_PATH} NAME_WLE) + get_filename_component(SUBDIR_PATH_DIRECTORY ${SUBDIR_PATH} DIRECTORY) + set(DST "${CMAKE_BINARY_DIR}/${SUBDIR_PATH_DIRECTORY}/${SUBDIR_PATH_NAME_WLE}") + endif() + + # Check conformance of destination file name to pattern + get_filename_component(FILE_NAME_WE ${SRC} NAME_WE) + get_filename_component(MAN_FILE_NAME ${DST} NAME) + if(NOT(MAN_FILE_NAME MATCHES "^${FILE_NAME_WE}.${MAN_NUM}$")) + message(FATAL_ERROR "File name of a man page must be in the format {name}.{man-number}${ADOC_EXT}.") + endif() + + add_custom_command( + OUTPUT ${DST} + COMMAND ${ADOCCOMMAND_PATH} -b manpage ${SRC} -o ${DST} -a component-version=${COMPONENT_VERSION} + DEPENDS ${SRC} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating man page ${SUBDIR_PATH_DIRECTORY}/${SUBDIR_PATH_NAME_WLE}" + VERBATIM + ) + + add_custom_target("${TARGET_NAME}" ALL DEPENDS ${DST}) + install(FILES ${DST} + DESTINATION "${CMAKE_INSTALL_FULL_MANDIR}/man${MAN_NUM}" + COMPONENT doc + ) +endfunction(add_adoc_man) |