diff cmake/FindPandoc.cmake @ 624:01e01777ff50

CMake: initial import of CMake modules, closes #720
author David Demelier <markand@malikania.fr>
date Fri, 20 Oct 2017 14:18:37 +0200
parents
children 5bd9424a523a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/FindPandoc.cmake	Fri Oct 20 14:18:37 2017 +0200
@@ -0,0 +1,231 @@
+# FindPandoc
+# ----------
+#
+# Find Pandoc executable, this modules defines:
+#
+# Pandoc_EXECUTABLE, where to find pandoc's executable
+# Pandoc_FOUND, if it is found
+# Pandoc_VERSION, the version
+#
+# This module also defines the following macros:
+#
+# pandoc(
+#    SOURCES file1 [file2 ...]
+#    OUTPUT output
+#    [FROM format]
+#    [TO format]
+#    [TARGET target]
+#    [DEPENDS dependency ...]
+#    [ALL]
+#    [TOC]
+#    [STANDALONE]
+#    [MAKE_DIRECTORY]
+#    [TEMPLATE file]
+#    [FILTER filter]
+#    [HEADER header ...]
+#    [FOOTER footer ...]
+#    [BODY body ...]
+#    [VARIABLE var ...]
+#    [METADATA meta ...]
+#    [ARGS argument ...]
+#    [WORKING_DIRECTORY directory]
+# )
+#
+# The sources files are listed in the parameter SOURCES, all files are passed
+# in the same order they are passed to that variable.
+#
+# The OUTPUT file is set with OUTPUT. It is generated only if one of the file
+# has changed.
+#
+# The FROM (-f) and TO (-t) arguments specify respectively the source and
+# destinations formats.
+#
+# If the parameter TARGET is set, then a target named `target` will be added
+# with the OUTPUT file as the dependency but not listed as sources files.
+# But the SOURCES files will be added as the target sources in the IDE.
+#
+# Optional dependencies can be added to the output command (not the target) with
+# the DEPENDS parameter.
+#
+# If ALL is set and TARGET is also set, the target will be added to the ALL_BUILD.
+#
+# If TOC (--toc) is specified, a table of content will be automatically created.
+#
+# If STANDALONE (-s) is set, the compilation will assume that it is standalone
+# and adds the necessary of the output format.
+#
+# Optional MAKE_DIRECTORY can be set to create the output directory before
+# pandoc processes the file (recommended).
+#
+# The TEMPLATE parameter can be used to specify the formate template file.
+#
+# You can set a filter with the parameter FILTER. The filter will be added to
+# the output dependencies so you can safely use CMake's targets.
+#
+# The HEADER (-H), FOOTER (-A) and BODY (-B) are copied verbatim before, just
+# after and after the body respectively. They can be set more than once.
+#
+# You can pass variables (-V) and metadata (-M) to the parameters VARIABLE
+# and METADATA, be sure to pass the same syntax as pandoc.  (e.g VARIABLE foo=1)
+#
+# ARGS is an optional list of additional arguments to pass to pandoc.
+#
+# The parameter WORKING_DIRECTORY can be set to change the directory when pandoc
+# is invoked.
+#
+
+find_program(
+    Pandoc_EXECUTABLE
+    NAMES pandoc
+    DOC "Pandoc executable"
+)
+
+include(FindPackageHandleStandardArgs)
+include(CMakeParseArguments)
+
+# Extract the version
+if (Pandoc_EXECUTABLE)
+    execute_process(
+        COMMAND ${Pandoc_EXECUTABLE} --version
+        OUTPUT_VARIABLE _pandoc_version_tmp
+    )
+
+    if (_pandoc_version_tmp MATCHES "^pandoc[^ ]* ([0-9]+\\.[0-9]+\\.[0-9]+)")
+        set(Pandoc_VERSION "${CMAKE_MATCH_1}")
+    endif ()
+endif ()
+
+find_package_handle_standard_args(
+    Pandoc
+    FOUND_VAR Pandoc_FOUND
+    VERSION_VAR Pandoc_VERSION
+    REQUIRED_VARS Pandoc_EXECUTABLE
+)
+
+if (Pandoc_FOUND)
+    function(pandoc)
+        set(options MAKE_DIRECTORY STANDALONE TOC)
+        set(oneValueArgs FILTER FROM TARGET TEMPLATE TO OUTPUT WORKING_DIRECTORY)
+        set(multiValueArgs ARGS FOOTER HEADER METADATA SOURCES VARIABLE)
+
+        #
+        # The following variables will be set in that scope:
+        #   _pandoc_arguments        - List of all arguments that will passed to pandoc invocation.
+        #   _pandoc_depends        - List of all dependencies attached to the add_custom_command.
+        #   _pandoc_mkdir        - The mkdir command if MAKE_DIRECTORY is set
+        #   _pandoc_output_base        - The base output directory
+        #
+        cmake_parse_arguments(PANDOC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+        #
+        # Output and sources are mandatory
+        #
+        if (NOT PANDOC_OUTPUT)
+            message(FATAL_ERROR "Please define OUTPUT")
+        elseif (NOT PANDOC_SOURCES)
+            message(FATAL_ERROR "Please defines SOURCES")
+        endif ()
+
+        #
+        # Handle the filter with care.
+        #
+        # 1. If it is a target, depend on it and use a generator
+        #    expression to get its full path on the disk.
+        # 2. If it is not a target, just use the user provided path.
+        #
+        if (PANDOC_FILTER)
+            # If it is a target, add a dependency so that it is built
+            if (TARGET ${PANDOC_FILTER})
+                list(APPEND _pandoc_arguments --filter "$<TARGET_FILE:${PANDOC_FILTER}>")
+                list(APPEND _pandoc_depends ${PANDOC_FILTER})
+            else ()
+                list(APPEND _pandoc_arguments --filter ${PANDOC_FILTER})
+            endif ()
+        endif ()
+
+        if (PANDOC_TOC)
+            list(APPEND _pandoc_arguments --toc)
+        endif ()
+        if (PANDOC_STANDALONE)
+            list(APPEND _pandoc_arguments -s)
+        endif ()
+        if (PANDOC_FROM)
+            list(APPEND _pandoc_arguments -f ${PANDOC_FROM})
+        endif ()
+        if (PANDOC_TO)
+            list(APPEND _pandoc_arguments -t ${PANDOC_TO})
+        endif ()
+        if (PANDOC_TEMPLATE)
+            list(APPEND _pandoc_arguments --template ${PANDOC_TEMPLATE})
+            list(APPEND _pandoc_depends ${PANDOC_TEMPLATE})
+        endif ()
+
+        # Header, footers and body
+        foreach (h ${PANDOC_HEADER})
+            list(APPEND _pandoc_arguments -H ${h})
+            list(APPEND _pandoc_depends ${h})
+        endforeach ()
+        foreach (b ${PANDOC_BODY})
+            list(APPEND _pandoc_arguments -B ${b})
+            list(APPEND _pandoc_depends ${b})
+        endforeach ()
+        foreach (f ${PANDOC_FOOTER})
+            list(APPEND _pandoc_arguments -A ${f})
+            list(APPEND _pandoc_depends ${f})
+        endforeach ()
+
+        # Variables and metadata
+        foreach (var ${PANDOC_VARIABLE})
+            list(APPEND _pandoc_arguments -V ${var})
+        endforeach ()
+        foreach (meta ${PANDOC_METADATA})
+            list(APPEND _pandoc_arguments -M ${meta})
+        endforeach ()
+
+        # Optional list of arguments
+        foreach (arg ${PANDOC_ARGS})
+            list(APPEND _pandoc_arguments ${arg})
+        endforeach ()
+
+        # Output and sources
+        list(APPEND _pandoc_arguments -o ${PANDOC_OUTPUT})
+
+        #
+        # The following variables are set within the loop:
+        #
+        #   _pandoc_input           The absolute path to the input file.
+        #   _pandoc_output_base     The base output directory.
+        #
+        foreach (s ${PANDOC_SOURCES})
+            get_filename_component(_pandoc_input ${s} ABSOLUTE)
+            get_filename_component(_pandoc_output_base ${PANDOC_OUTPUT} DIRECTORY)
+            list(APPEND _pandoc_depends ${_pandoc_input})
+            list(APPEND _pandoc_arguments ${_pandoc_input})
+        endforeach ()
+
+        # Create the output directory if requested
+        if (PANDOC_MAKE_DIRECTORY)
+            set(_pandoc_mkdir ${CMAKE_COMMAND} -E make_directory ${_pandoc_output_base})
+        endif ()
+
+        add_custom_command(
+            OUTPUT ${PANDOC_OUTPUT}
+            COMMAND    ${_pandoc_mkdir}
+            COMMAND    ${Pandoc_EXECUTABLE} ${_pandoc_arguments}
+            DEPENDS ${_pandoc_depends} ${PANDOC_DEPENDS}
+            WORKING_DIRECTORY ${PANDOC_WORKING_DIRECTORY}
+            VERBATIM
+        )
+
+        if (PANDOC_TARGET)
+            add_custom_target(
+                ${PANDOC_TARGET} ${PANDOC_ALL}
+                SOURCES ${_pandoc_depends}
+                DEPENDS ${PANDOC_OUTPUT}
+                WORKING_DIRECTORY ${PANDOC_WORKING_DIRECTORY}
+            )
+        endif ()
+    endfunction()
+endif ()
+
+mark_as_advanced(Pandoc_EXECUTABLE)