diff cmake/function/IrccdBuildHtml.cmake @ 275:c143682678b9

CMake: improve documentation related to plugins
author David Demelier <markand@malikania.fr>
date Thu, 29 Sep 2016 12:41:19 +0200
parents
children e9adab218027
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/function/IrccdBuildHtml.cmake	Thu Sep 29 12:41:19 2016 +0200
@@ -0,0 +1,159 @@
+#
+# IrccdBuildHtml.cmake -- CMake build system for irccd
+#
+# Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+include(CMakeParseArguments)
+
+#
+# irccd_build_html
+# -------------------------------------------------------------------
+#
+# irccd_build_html(
+#   COMPONENT (Optional) install the output documentation as the given component
+#   OUTPUT (Optional) override output path
+#   OUTPUT_VAR (Optional) store the output file in the output variable
+#   SOURCE the source markdown file
+# )
+#
+# Create a rule to build the markdown file specified by SOURCE parameter.
+#
+# By default, the output file is built in the same directory relative to the
+# current project. Specifying /foo/bar/baz/foo.md as SOURCE from the
+# directory /foo/var ends in an output file baz/foo.html.
+#
+# The output file path can be overriden with the OUTPUT variable which must be
+# relative and must contain the filename without extension (e.g. api/misc/Foo).
+#
+# This macro does not create a target, just the output rule and the output file
+# can be retrieved using the OUTPUT_VAR variable.
+#
+# Example:
+#
+# irccd_build_html(
+#   COMPONENT documentation
+#   OUTPUT dev/howto-create-a-plugin
+#   SOURCE myfile.md
+#   OUTPUT_VAR output
+# )
+#
+# add_custom_target(mytarget DEPENDS ${output})
+#
+# It's perfectly safe to call this macro multiple times with the same COMPONENT.
+#
+
+macro(irccd_build_html)
+    set(oneValueArgs COMPONENT OUTPUT OUTPUT_VAR SOURCE)
+
+    cmake_parse_arguments(HTML "" "${oneValueArgs}" "" ${ARGN})
+
+    if (NOT HTML_SOURCE)
+        message(FATAL_ERROR "Missing SOURCE parameter")
+    endif ()
+
+    #
+    # Example with SOURCES set to CMAKE_CURRENT_SOURCE_DIR/api/event/onMessage.md
+    #
+    # Extract the following variables:
+    #
+    # dirname:      api/event
+    # basename:     onMessage
+    # baseurl:      ../../
+    #
+    if (HTML_OUTPUT)
+        if (IS_ABSOLUTE ${HTML_OUTPUT})
+            message(FATAL_ERROR "OUTPUT variable must not be absolute")
+        endif ()
+
+        get_filename_component(dirname ${HTML_OUTPUT} DIRECTORY)
+        get_filename_component(basename ${HTML_OUTPUT} NAME)
+    else()
+        get_filename_component(dirname ${HTML_SOURCE} DIRECTORY)
+        file(RELATIVE_PATH dirname ${CMAKE_CURRENT_SOURCE_DIR} ${dirname})
+        get_filename_component(basename ${HTML_SOURCE} NAME)
+    endif ()
+
+    # Remove extension from basename.
+    string(REGEX REPLACE "^(.*)\\.md$" "\\1" basename ${basename})
+
+    file(
+            RELATIVE_PATH
+            baseurl
+            ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}/${dirname}
+            ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}
+    )
+
+    if (baseurl STREQUAL "")
+        set(baseurl "./")
+    endif ()
+
+#    message("==> dumping ${HTML_SOURCE} <==")
+#    message("  -> basename: ${basename}")
+#    message("  -> dirname: ${dirname}")
+#    message("  -> baseurl: ${baseurl}")
+
+    # Replace CMake variables.
+    configure_file(
+        ${HTML_SOURCE}
+        ${CMAKE_CURRENT_BINARY_DIR}/${dirname}/${basename}.md
+        @ONLY
+    )
+
+    # Create a list of parents for the breadcrumb widget.
+    string(REPLACE "/" ";" parentlist "${dirname}")
+    set(parents "  -\n")
+    set(parents "${parents}    name: \"index\"\n")
+    set(parents "${parents}    path: \"${baseurl}index.html\"\n")
+
+    set(path "${baseurl}")
+    foreach (p ${parentlist})
+        set(path "${path}${p}/")
+        set(parents "${parents}  -\n")
+        set(parents "${parents}    name: \"${p}\"\n")
+        set(parents "${parents}    path: \"${path}index.html\"\n")
+    endforeach ()
+
+    configure_file(
+        ${html_SOURCE_DIR}/resources/metadata.yml
+        ${CMAKE_CURRENT_BINARY_DIR}/${dirname}/${basename}.yml
+    )
+
+    # Pandoc the file.
+    pandoc(
+        OUTPUT ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}/${dirname}/${basename}.html
+        SOURCES
+            ${CMAKE_CURRENT_BINARY_DIR}/${dirname}/${basename}.yml
+            ${CMAKE_CURRENT_BINARY_DIR}/${dirname}/${basename}.md
+        DEPENDS ${HTML_SOURCE}
+        TEMPLATE ${html_SOURCE_DIR}/resources/template.html
+        FROM markdown
+        TO html5
+        STANDALONE TOC MAKE_DIRECTORY
+    )
+
+    # Install the documentation file as component if provided.
+    if (HTML_COMPONENT)
+        install(
+            FILES ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}/${dirname}/${basename}.html
+            COMPONENT ${HTML_COMPONENT}
+            DESTINATION ${WITH_DOCDIR}/${dirname}
+        )
+    endif ()
+
+    if (HTML_OUTPUT_VAR)
+        set(${HTML_OUTPUT_VAR} ${IRCCD_FAKEROOTDIR}/${WITH_DOCDIR}/${dirname}/${basename}.html)
+    endif ()
+endmacro ()