view cmake/function/IrccdBuildHtml.cmake @ 818:49fa22f0b4b9

windows: support for VS2017
author David Demelier <markand@malikania.fr>
date Fri, 23 Nov 2018 21:50:20 +0100
parents ebe561276c33
children 06cc2f95f479
line wrap: on
line source

#
# IrccdBuildHtml.cmake -- CMake build system for irccd
#
# Copyright (c) 2013-2018 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.
#

#
# irccd_build_html
# ----------------
#
# irccd_build_html(
#   SOURCE              the source markdown file
#   TEMPLATE            specify template file
#   OUTPUT_DIR          the output directory (relative to base doc dir)
#   OUTPUT_VAR          (Optional) store the output file in the output variable
#   COMPONENT           (Optional) install the output as the given component
# )
#
# Create a rule to build the markdown file specified by SOURCE parameter.
#
# The SOURCE file will be written in
# ${CMAKE_BINARY_DIR}/html/${OUTPUT}/<basename>.html where basename is the file
# name taken from SOURCE with extension replaced with html.
#
# This macro does not create a target, just the output rule and the output file
# can be retrieved using the OUTPUT_VAR variable.
#
# If component is set, a CPack component is created for that output file and
# will be grouped together.
#
# Example:
#
# irccd_build_html(
#   SOURCE onMessage.md
#   TEMPLATE template.html
#   COMPONENT documentation
#   OUTPUT_DIR event
#   OUTPUT_VAR myvar
# )
#
# add_custom_target(mytarget DEPENDS ${myvar})
#
# It's perfectly safe to call this macro multiple times with the same COMPONENT.
#

option(IRCCD_WITH_HTML "Enable building of HTML documentation" On)

find_package(marker QUIET)

if (IRCCD_WITH_HTML)
	if (marker_FOUND)
		set(IRCCD_HAVE_HTML On)
		set(IRCCD_WITH_HTML_MSG "Yes")
	else ()
		set(IRCCD_WITH_HTML_MSG "No (marker not found)")
	endif ()
else ()
	set(IRCCD_WITH_HTML_MSG "No (disabled by user)")
endif ()

macro(irccd_build_html)
	if (IRCCD_HAVE_HTML)
		set(options "")
		set(oneValueArgs "COMPONENT;OUTPUT_DIR;OUTPUT_VAR;SOURCE;TEMPLATE")
		set(multiValueArgs "VARIABLES")

		cmake_parse_arguments(HTML "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

		if (NOT HTML_SOURCE)
			message(FATAL_ERROR "Missing SOURCE parameter")
		endif ()
		if (NOT HTML_TEMPLATE)
			message(FATAL_ERROR "Missing TEMPLATE parameter")
		endif ()
		if (IS_ABSOLUTE ${HTML_OUTPUT_DIR})
			message(FATAL_ERROR "OUTPUT_DIR variable must not be absolute")
		endif ()

		#
		# Get the basename, use string REGEX REPLACE because
		# get_filename_component will remove all extensions while we only want
		# to remove md. (e.g. irccd.conf.md becomes irccd.conf).
		#
		get_filename_component(filename ${HTML_SOURCE} NAME)
		string(REGEX REPLACE "^(.*)\\.md$" "\\1" filename ${filename})

		# Compute baseurl.
		file(
			RELATIVE_PATH
			baseurl
			${CMAKE_BINARY_DIR}/html/${HTML_OUTPUT_DIR}
			${CMAKE_BINARY_DIR}/html
		)

		if (baseurl STREQUAL "")
			set(baseurl "./")
		endif ()
		if (NOT HTML_OUTPUT_DIR OR HTML_OUTPUT_DIR STREQUAL "")
			set(HTML_OUTPUT_DIR ".")
		endif ()

		# Filname path to output directory and files.
		set(outputdir ${CMAKE_BINARY_DIR}/html/${HTML_OUTPUT_DIR})
		set(output ${outputdir}/${filename}.html)

		# Build arguments.
		if (HTML_TEMPLATE)
			set(args -t ${HTML_TEMPLATE} -v baseurl="${baseurl}")
		endif ()

		add_custom_command(
			OUTPUT ${output}
			COMMAND
				${CMAKE_COMMAND} -E make_directory ${outputdir}
			COMMAND
				$<TARGET_FILE:marker::marker> ${args} ${HTML_VARIABLES}
				$<TARGET_FILE:marker::libmarker-bulma> ${output} ${HTML_SOURCE}
			DEPENDS
				${HTML_SOURCE}
				${HTML_TEMPLATE}
		)

		# Install the documentation file as component if provided.
		if (HTML_COMPONENT)
			install(
				FILES ${output}
				COMPONENT ${HTML_COMPONENT}
				DESTINATION ${CMAKE_INSTALL_DOCDIR}/${HTML_OUTPUT_DIR}
			)
		endif ()

		if (HTML_OUTPUT_VAR)
			set(${HTML_OUTPUT_VAR} ${output})
		endif ()
	endif ()
endmacro ()