0
|
1 # FindPandoc |
|
2 # ---------- |
|
3 # |
|
4 # Find Pandoc executable, this modules defines: |
|
5 # |
|
6 # Pandoc_EXECUTABLE, where to find pandoc's executable |
|
7 # Pandoc_FOUND, if it is found |
|
8 # Pandoc_VERSION, the version |
|
9 # |
|
10 # This module also defines the following macros: |
|
11 # |
|
12 # pandoc( |
|
13 # SOURCES file1 [file2 ...] |
|
14 # OUTPUT output |
|
15 # [FROM format] |
|
16 # [TO format] |
|
17 # [TARGET target] |
|
18 # [DEPENDS dependency ...] |
|
19 # [ALL] |
|
20 # [TOC] |
|
21 # [STANDALONE] |
|
22 # [MAKE_DIRECTORY] |
|
23 # [TEMPLATE file] |
|
24 # [FILTER filter] |
|
25 # [HEADER header ...] |
|
26 # [FOOTER footer ...] |
|
27 # [BODY body ...] |
|
28 # [VARIABLE var ...] |
|
29 # [METADATA meta ...] |
|
30 # [ARGS argument ...] |
|
31 # [WORKING_DIRECTORY directory] |
|
32 # ) |
|
33 # |
|
34 # The sources files are listed in the parameter SOURCES, all files are passed |
|
35 # in the same order they are passed to that variable. |
|
36 # |
|
37 # The OUTPUT file is set with OUTPUT. It is generated only if one of the file |
|
38 # has changed. |
|
39 # |
|
40 # The FROM (-f) and TO (-t) arguments specify respectively the source and |
|
41 # destinations formats. |
|
42 # |
|
43 # If the parameter TARGET is set, then a target named `target` will be added |
|
44 # with the OUTPUT file as the dependency but not listed as sources files. |
|
45 # But the SOURCES files will be added as the target sources in the IDE. |
|
46 # |
|
47 # Optional dependencies can be added to the output command (not the target) with |
|
48 # the DEPENDS parameter. |
|
49 # |
|
50 # If ALL is set and TARGET is also set, the target will be added to the ALL_BUILD. |
|
51 # |
|
52 # If TOC (--toc) is specified, a table of content will be automatically created. |
|
53 # |
|
54 # If STANDALONE (-s) is set, the compilation will assume that it is standalone |
|
55 # and adds the necessary of the output format. |
|
56 # |
|
57 # Optional MAKE_DIRECTORY can be set to create the output directory before |
|
58 # pandoc processes the file (recommended). |
|
59 # |
|
60 # The TEMPLATE parameter can be used to specify the formate template file. |
|
61 # |
|
62 # You can set a filter with the parameter FILTER. The filter will be added to |
|
63 # the output dependencies so you can safely use CMake's targets. |
|
64 # |
|
65 # The HEADER (-H), FOOTER (-A) and BODY (-B) are copied verbatim before, just |
|
66 # after and after the body respectively. They can be set more than once. |
|
67 # |
|
68 # You can pass variables (-V) and metadata (-M) to the parameters VARIABLE |
|
69 # and METADATA, be sure to pass the same syntax as pandoc. (e.g VARIABLE foo=1) |
|
70 # |
|
71 # ARGS is an optional list of additional arguments to pass to pandoc. |
|
72 # |
|
73 # The parameter WORKING_DIRECTORY can be set to change the directory when pandoc |
|
74 # is invoked. |
|
75 # |
|
76 |
|
77 find_program( |
|
78 Pandoc_EXECUTABLE |
|
79 NAMES pandoc |
|
80 DOC "Pandoc executable" |
|
81 ) |
|
82 |
|
83 include(FindPackageHandleStandardArgs) |
|
84 include(CMakeParseArguments) |
|
85 |
|
86 # Extract the version |
|
87 if (Pandoc_EXECUTABLE) |
|
88 execute_process( |
|
89 COMMAND pandoc --version |
|
90 OUTPUT_VARIABLE _pandoc_version_tmp |
|
91 ) |
|
92 |
|
93 string(REGEX REPLACE "^pandoc ([0-9]*\\.[0-9]*\\.[0-9]*).*$" "\\1" Pandoc_VERSION ${_pandoc_version_tmp}) |
|
94 endif () |
|
95 |
|
96 find_package_handle_standard_args( |
|
97 Pandoc |
|
98 FOUND_VAR Pandoc_FOUND |
|
99 VERSION_VAR Pandoc_VERSION |
|
100 REQUIRED_VARS Pandoc_EXECUTABLE |
|
101 ) |
|
102 |
|
103 if (Pandoc_FOUND) |
|
104 function(pandoc) |
|
105 set(options MAKE_DIRECTORY STANDALONE TOC) |
|
106 set(oneValueArgs FILTER FROM TARGET TEMPLATE TO OUTPUT WORKING_DIRECTORY) |
|
107 set(multiValueArgs ARGS FOOTER HEADER METADATA SOURCES VARIABLE DEPENDS) |
|
108 |
|
109 # |
|
110 # The following variables will be set in that scope: |
|
111 # _pandoc_arguments - List of all arguments that will passed to pandoc invocation. |
|
112 # _pandoc_depends - List of all dependencies attached to the add_custom_command. |
|
113 # _pandoc_mkdir - The mkdir command if MAKE_DIRECTORY is set |
|
114 # _pandoc_output_base - The base output directory |
|
115 # |
|
116 cmake_parse_arguments(PANDOC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) |
|
117 |
|
118 # |
|
119 # Output and sources are mandatory |
|
120 # |
|
121 if (NOT PANDOC_OUTPUT) |
|
122 message(FATAL_ERROR "Please define OUTPUT") |
|
123 elseif (NOT PANDOC_SOURCES) |
|
124 message(FATAL_ERROR "Please defines SOURCES") |
|
125 endif () |
|
126 |
|
127 # |
|
128 # Handle the filter with care. |
|
129 # |
|
130 # 1. If it is a target, depend on it and use a generator |
|
131 # expression to get its full path on the disk. |
|
132 # 2. If it is not a target, just use the user provided path. |
|
133 # |
|
134 if (PANDOC_FILTER) |
|
135 # If it is a target, add a dependency so that it is built |
|
136 if (TARGET ${PANDOC_FILTER}) |
|
137 list(APPEND _pandoc_arguments --filter "$<TARGET_FILE:${PANDOC_FILTER}>") |
|
138 list(APPEND _pandoc_depends ${PANDOC_FILTER}) |
|
139 else () |
|
140 list(APPEND _pandoc_arguments --filter ${PANDOC_FILTER}) |
|
141 endif () |
|
142 endif () |
|
143 |
|
144 if (PANDOC_TOC) |
|
145 list(APPEND _pandoc_arguments --toc) |
|
146 endif () |
|
147 if (PANDOC_STANDALONE) |
|
148 list(APPEND _pandoc_arguments -s) |
|
149 endif () |
|
150 if (PANDOC_FROM) |
|
151 list(APPEND _pandoc_arguments -f ${PANDOC_FROM}) |
|
152 endif () |
|
153 if (PANDOC_TO) |
|
154 list(APPEND _pandoc_arguments -t ${PANDOC_TO}) |
|
155 endif () |
|
156 if (PANDOC_TEMPLATE) |
|
157 list(APPEND _pandoc_arguments --template ${PANDOC_TEMPLATE}) |
|
158 list(APPEND _pandoc_depends ${PANDOC_TEMPLATE}) |
|
159 endif () |
|
160 |
|
161 # Header, footers and body |
|
162 foreach (h ${PANDOC_HEADER}) |
|
163 list(APPEND _pandoc_arguments -H ${h}) |
|
164 list(APPEND _pandoc_depends ${h}) |
|
165 endforeach () |
|
166 foreach (b ${PANDOC_BODY}) |
|
167 list(APPEND _pandoc_arguments -B ${b}) |
|
168 list(APPEND _pandoc_depends ${b}) |
|
169 endforeach () |
|
170 foreach (f ${PANDOC_FOOTER}) |
|
171 list(APPEND _pandoc_arguments -A ${f}) |
|
172 list(APPEND _pandoc_depends ${f}) |
|
173 endforeach () |
|
174 |
|
175 # Variables and metadata |
|
176 foreach (var ${PANDOC_VARIABLE}) |
|
177 list(APPEND _pandoc_arguments -V ${var}) |
|
178 endforeach () |
|
179 foreach (meta ${PANDOC_METADATA}) |
|
180 list(APPEND _pandoc_arguments -M ${meta}) |
|
181 endforeach () |
|
182 |
|
183 # Optional list of arguments |
|
184 foreach (arg ${PANDOC_ARGS}) |
|
185 list(APPEND _pandoc_arguments ${arg}) |
|
186 endforeach () |
|
187 |
|
188 # Output and sources |
|
189 list(APPEND _pandoc_arguments -o ${PANDOC_OUTPUT}) |
|
190 |
|
191 # |
|
192 # The following variables are set within the loop: |
|
193 # |
|
194 # _pandoc_input - The absolute path to the input file. |
|
195 # _pandoc_output_base - The base output directory. |
|
196 # |
|
197 foreach (s ${PANDOC_SOURCES}) |
|
198 get_filename_component(_pandoc_input ${s} ABSOLUTE) |
|
199 get_filename_component(_pandoc_output_base ${PANDOC_OUTPUT} DIRECTORY) |
|
200 list(APPEND _pandoc_depends ${_pandoc_input}) |
|
201 list(APPEND _pandoc_arguments ${_pandoc_input}) |
|
202 endforeach () |
|
203 |
|
204 # Create the output directory if requested |
|
205 if (PANDOC_MAKE_DIRECTORY) |
|
206 set(_pandoc_mkdir ${CMAKE_COMMAND} -E make_directory ${_pandoc_output_base}) |
|
207 endif () |
|
208 |
|
209 add_custom_command( |
|
210 OUTPUT ${PANDOC_OUTPUT} |
|
211 COMMAND ${_pandoc_mkdir} |
|
212 COMMAND ${Pandoc_EXECUTABLE} ${_pandoc_arguments} |
|
213 DEPENDS ${_pandoc_depends} ${PANDOC_DEPENDS} |
|
214 WORKING_DIRECTORY ${PANDOC_WORKING_DIRECTORY} |
|
215 VERBATIM |
|
216 ) |
|
217 |
|
218 if (PANDOC_TARGET) |
|
219 add_custom_target( |
|
220 ${PANDOC_TARGET} ${PANDOC_ALL} |
|
221 SOURCES ${_pandoc_depends} |
|
222 DEPENDS ${PANDOC_OUTPUT} |
|
223 WORKING_DIRECTORY ${PANDOC_WORKING_DIRECTORY} |
|
224 ) |
|
225 endif () |
|
226 endfunction() |
|
227 endif () |
|
228 |
|
229 mark_as_advanced(Pandoc_EXECUTABLE) |