]> git.lyx.org Git - lyx.git/blob - development/autotests/export.cmake
d2a03565ff296b99239f0b4dce13dd34eed25511
[lyx.git] / development / autotests / export.cmake
1 # This file is part of LyX, the document processor.
2 # Licence details can be found in the file COPYING.
3 #
4 # Copyright (c) 2012 Kornel Benko kornel@lyx.org
5 #
6 #
7 # LYX_ROOT  = ${TOP_SRC_DIR}/lib/{doc,examples,templates,tabletemplates}
8 # LYX_USERDIR_VER = Name of environment variable for the user directory
9 # lyx       =
10 # format    = lyx16x|lyx20x|lyx21x|lyx22x|xhtml|docbook5
11 # extension = 16.lyx|20.lyx|21.lyx|22.lyx|xhtml|xml
12 # file      = xxx
13 #
14 # Script should be called like:
15 # cmake -DLYX_ROOT=xxx \
16 #       -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR} \
17 #       -DWORKDIR=${BUILD_DIR}/autotests/out-home \
18 #       -DLYX_USERDIR_VER=${LYX_USERDIR_VER} \
19 #       -Dlyx=xxx \
20 #       -Dformat=xxx \
21 #       -Dfonttype=xxx \
22 #       -Dextension=xxx \
23 #       -DLYX_FORMAT_NUM=${_lyx_format_num} \
24 #       -Dfile=xxx \
25 #       -Dinverted=[01] \
26 #       -DTOP_SRC_DIR=${TOP_SRC_DIR} \
27 #       -DIgnoreErrorMessage=(ON/OFF) \
28 #       -DPERL_EXECUTABLE=${PERL_EXECUTABLE} \
29 #       -DXMLLINT_EXECUTABLE=${XMLLINT_EXECUTABLE} \
30 #       -DJAVA_EXECUTABLE=${JAVA_EXECUTABLE} \
31 #       -DENCODING=xxx \
32 #       -P "${TOP_SRC_DIR}/development/autotests/export.cmake"
33 #
34
35 set(_TestResultMessage "")
36 message(STATUS "IgnoreErrorMessage = \"${IgnoreErrorMessage}\"")
37 set(Perl_Script "${TOP_SRC_DIR}/development/autotests/useSystemFonts.pl")
38 set(Structure_Script "${TOP_SRC_DIR}/development/autotests/beginEndStructureCheck.pl")
39 set(LanguageFile "${TOP_SRC_DIR}/lib/languages")
40 set(GetTempDir "${TOP_SRC_DIR}/development/autotests/getTempDir.pl")
41 set(_ft ${fonttype})
42 execute_process(COMMAND ${PERL_EXECUTABLE} "${GetTempDir}" "${WORKDIR}" OUTPUT_VARIABLE TempDir)
43 message(STATUS "using fonttype = ${_ft}")
44 if(NOT ENCODING)
45   set(ENCODING "default")
46 endif()
47 if(ENCODING STREQUAL "default")
48   set(_enc)
49 else()
50   set(_enc "_${ENCODING}")
51 endif()
52
53 # move the the last directory part of LYX_ROOT to filename
54 # to make the destination unique for otherwise identical
55 # filenames
56 get_filename_component(updir_ "${LYX_ROOT}" DIRECTORY)
57 get_filename_component(updir2_ "${LYX_ROOT}" NAME)
58 set(file "${updir2_}/${file}")
59 set(LYX_ROOT "${updir_}")
60
61 if(format MATCHES "dvi|pdf")
62   message(STATUS "LYX_TESTS_USERDIR = ${LYX_TESTS_USERDIR}")
63   message(STATUS "Converting with perl ${Perl_Script}")
64   set(LYX_SOURCE "${TempDir}/${file}_${format}_${_ft}${_enc}.lyx")
65   message(STATUS "Using source \"${LYX_ROOT}/${file}.lyx\"")
66   message(STATUS "Using dest \"${LYX_SOURCE}\"")
67   if(NOT "${ENCODING}" STREQUAL "default")
68     # message(STATUS "ENCODING = ${ENCODING}")
69   endif()
70   message(STATUS "Executing ${PERL_EXECUTABLE} \"${Perl_Script}\" \"${LYX_ROOT}/${file}.lyx\" \"${LYX_SOURCE}\" ${format} ${_ft} ${ENCODING} ${LanguageFile}")
71   execute_process(COMMAND ${PERL_EXECUTABLE} "${Perl_Script}" "${LYX_ROOT}/${file}.lyx" "${LYX_SOURCE}" ${format} ${_ft} ${ENCODING} ${LanguageFile}
72     RESULT_VARIABLE _err)
73   string(COMPARE EQUAL  ${_err} 0 _erg)
74   if(NOT _erg)
75     message(FATAL_ERROR "Export failed while converting")
76   endif()
77   set(result_file_name ${file}_${_ft}.${extension})
78 else()
79   message(STATUS "Converting with perl ${Perl_Script}")
80   set(LYX_SOURCE "${TempDir}/${file}.lyx")
81   message(STATUS "Using source \"${LYX_ROOT}/${file}.lyx\"")
82   message(STATUS "Using dest \"${LYX_SOURCE}\"")
83   execute_process(COMMAND ${PERL_EXECUTABLE} "${Perl_Script}" "${LYX_ROOT}/${file}.lyx" "${LYX_SOURCE}" ${format} "dontChange" "default" ${LanguageFile}
84     RESULT_VARIABLE _err)
85   string(COMPARE EQUAL  ${_err} 0 _erg)
86   if(NOT _erg)
87     message(FATAL_ERROR "Export failed while converting")
88     endif()
89   if(extension MATCHES "\\.lyx$")
90     # Font-type not relevant for lyx16/lyx2[0123] exports
91     set(result_file_base "${TempDir}/${file}")
92   else()
93     set(result_file_name ${file}.${extension})
94   endif()
95 endif()
96
97 function(get_md5sum msource mresult mreserr)
98   execute_process(
99     COMMAND ${CMAKE_COMMAND} -E md5sum ${${msource}}
100     OUTPUT_VARIABLE msource_md5sum_x
101     RESULT_VARIABLE mres_err)
102   if (NOT mres_err)
103     string(REGEX REPLACE " .*" "" msource_md5sum ${msource_md5sum_x})
104     set(${mresult} ${msource_md5sum} PARENT_SCOPE)
105     message(STATUS "MD5SUM of \"${${msource}}\" is ${msource_md5sum}")
106   else()
107     set(${mresult} "xx" PARENT_SCOPE)
108     message(STATUS "Error getting MD5SUM of \"${${msource}}\"")
109   endif()
110   set(${mreserr} ${mres_err} PARENT_SCOPE)
111 endfunction()
112
113 macro(Summary _err _msg)
114   if (${_err})
115     list(APPEND _TestResultMessage "Error: ${_msg}")
116   else()
117     list(APPEND _TestResultMessage "OK: ${_msg}")
118   endif()
119 endmacro()
120
121 set(ENV{${LYX_USERDIR_VER}} "${LYX_TESTS_USERDIR}")
122 set(ENV{LANG} "en_US.UTF-8") # to get all error-messages in english
123 set(ENV{LANGUAGE} "US:en")
124 #set(ENV{LC_ALL} "C")
125 if (extension MATCHES "\\.lyx$")
126   include(${TOP_SRC_DIR}/development/autotests/CheckLoadErrors.cmake)
127   get_md5sum(LYX_SOURCE source_md5sum _err)
128   foreach(_lv RANGE 1 20)
129     set(used_tex_file "${result_file_base}.tex")
130     set(result_file_base "${result_file_base}.${LYX_FORMAT_NUM}")
131     set(result_file_name "${result_file_base}.lyx")
132     file(REMOVE "${result_file_name}" "${result_file_name}.emergency" )
133     message(STATUS "Executing ${lyx} -userdir \"${LYX_TESTS_USERDIR}\" -E ${format} ${result_file_name} \"${LYX_SOURCE}\"")
134     message(STATUS "This implicitly checks load of ${LYX_SOURCE}")
135     execute_process(
136       COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
137       RESULT_VARIABLE _err
138       ERROR_VARIABLE lyxerr)
139     Summary(_err "Converting \"${LYX_SOURCE}\" to format ${format}")
140     if(_err)
141       break()
142     else()
143       if(NOT EXISTS "${result_file_name}")
144         set(_err -1)
145         Summary(_err "Expected result file \"${result_file_name}\" does not exist")
146         break()
147       else()
148         message(STATUS "Expected result file \"${result_file_name}\" exists")
149         execute_process(
150           COMMAND ${PERL_EXECUTABLE} ${Structure_Script} "${result_file_name}"
151           RESULT_VARIABLE _err)
152         Summary(_err "Structure of the intermediate file \"${result_file_name}\"")
153         if(_err)
154           break()
155         endif()
156         checkLoadErrors(lyxerr "${TOP_SRC_DIR}/development/autotests" _err)
157         Summary(_err "Examination of error/warning messages of the conversion of \"${LYX_SOURCE}\" to format ${format}")
158         if(_err)
159           break()
160         endif()
161         message(STATUS "Create the corresponding .tex file \"${used_tex_file}\"")
162         execute_process(
163           COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E pdflatex ${used_tex_file} "${LYX_SOURCE}"
164           RESULT_VARIABLE _errx)
165       endif()
166     endif()
167     get_md5sum(result_file_name result_md5sum _err)
168     Summary(_err "Getting md5sum of \"${result_file_name}\"")
169     if(_err)
170       # Somehow the created file is not readable?
171       break()
172     endif()
173     # Check if result file identical to source file
174     if(result_md5sum STREQUAL ${source_md5sum})
175       if (format MATCHES "lyx(1[0-9]|2[01])x")
176         # Do not compile, missing \origin statement prevents inclusion of
177         # files with relative path
178         message(STATUS "Not exporting due to missing \\origin statement")
179         break()
180       elseif(format MATCHES "lyx22x" AND file MATCHES "Minted")
181         message(STATUS "Not exporting due to missing minted support")
182         break()
183       endif()
184       message(STATUS "Source(${LYX_SOURCE}) and dest(${result_file_name}) are equal")
185       message(STATUS "Now try to export the lyx2lyx created file")
186       message(STATUS "Executing ${lyx} -userdir \"${LYX_TESTS_USERDIR}\" -E default \"${result_file_name}.default\" \"${result_file_name}\"")
187       execute_process(
188         COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E default "${result_file_name}.default" "${result_file_name}"
189         RESULT_VARIABLE _err
190         ERROR_VARIABLE lyxerr)
191       Summary(_err "Test-compilation of \"${result_file_name}\" to format default")
192       break()
193     else()
194       list(APPEND _TestResultMessage "Warning: \"${LYX_SOURCE}\" and \"${result_file_name}\" differ")
195       message(STATUS "Source(${LYX_SOURCE}) and dest(${result_file_name}) are still different")
196       if (_lv GREATER 10)
197         set(_err 1)
198         message(STATUS "Possible endless loop encountered")
199         Summary(_err "Test-Loop exceeded the count of 10, Possible endless loop")
200         break()
201       endif()
202     endif()
203     set(source_md5sum ${result_md5sum})
204     set(LYX_SOURCE ${result_file_name})
205   endforeach()
206 else()
207   if ($ENV{LYX_DEBUG_LATEX})
208     set(LyXExtraParams -dbg latex)
209   else()
210     set(LyXExtraParams -dbg info)
211   endif()
212   if(IgnoreErrorMessage)
213     foreach (_em ${IgnoreErrorMessage})
214       list(APPEND LyXExtraParams --ignore-error-message ${_em})
215     endforeach()
216   endif()
217   string(REGEX REPLACE ";" " " _LyXExtraParams "${LyXExtraParams}")
218   message(STATUS "Executing ${lyx} ${_LyXExtraParams} -userdir \"${LYX_TESTS_USERDIR}\" -E ${format} ${result_file_name} \"${LYX_SOURCE}\"")
219   file(REMOVE ${result_file_name})
220   execute_process(
221     COMMAND ${lyx} ${LyXExtraParams} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
222     RESULT_VARIABLE _err)
223   Summary(_err "Exporting \"${LYX_SOURCE}\" to format ${format}")
224   if (NOT _err)
225     #check if result file created
226     if (NOT EXISTS "${result_file_name}")
227       message(STATUS "Expected result file \"${result_file_name}\" does not exist")
228       set(_err -1)
229       Summary(_err "Expected result file \"${result_file_name}\" does not exists")
230     else()
231       message(STATUS "Expected result file \"${result_file_name}\" exists")
232       if (extension MATCHES "^x(ht)?ml$")
233         if (format MATCHES "xhtml")
234           set(xmllint_params --loaddtd --noout)
235           set(executable_ ${XMLLINT_EXECUTABLE})
236         else()
237           set(xmllint_params)
238           set(executable_ ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/filterXml4Sax.pl")
239           # Check with perl xml-parser
240           # needs XML::Parser module
241           message(STATUS "Calling ${PERL_EXECUTABLE} \"${TOP_SRC_DIR}/development/autotests/xmlParser.pl\" \"${result_file_name}\"")
242           execute_process(
243             COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/xmlParser.pl" "${result_file_name}"
244             OUTPUT_VARIABLE parserout
245             ERROR_VARIABLE parsererr
246             RESULT_VARIABLE _err
247           )
248           if (_err)
249             message(STATUS "${parsererr}")
250           endif()
251           Summary(_err "Checking \"${result_file_name}\" with xmlParser.pl")
252         endif()
253         if (XMLLINT_EXECUTABLE)
254           string(REPLACE ";" " " xmllint_params2 " ${xmllint_params}")
255           message(STATUS "Calling: " ${executable_} ${xmllint_params2} " ${WORKDIR}/${result_file_name}")
256           # check the created xhtml file
257           execute_process(
258             COMMAND ${executable_} ${xmllint_params}  "${result_file_name}"
259             OUTPUT_VARIABLE xmlout
260             ERROR_VARIABLE xmlerr
261             RESULT_VARIABLE _err)
262           file(WRITE "${result_file_name}.sax_out" ${xmlout})
263           Summary(_err "Checking \"${result_file_name}\" with ${XMLLINT_EXECUTABLE}")
264           if (NOT _err)
265             # check if parser output contains error messages
266             message(STATUS "Check the output: ${PERL_EXECUTABLE} ${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl")
267             execute_process(
268               COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl" "${result_file_name}.sax_out"
269               OUTPUT_VARIABLE xmlout
270               RESULT_VARIABLE _err)
271             Summary(_err "Parse messages of ${XMLLINT_EXECUTABLE} for errors")
272           else()
273             message(STATUS "Errors from xmllint: ${xmlerr}")
274           endif()
275           if (NOT _err)
276             if (NOT "${xmlout}" STREQUAL "")
277               message(STATUS "${xmlout}")
278               set(_err -1)
279               Summary(_err "Non empty output of \"${XMLLINT_EXECUTABLE}\"")
280             endif()
281           endif()
282         endif()
283         if (NOT _err AND format MATCHES "docbook5" AND JAVA_EXECUTABLE)
284           # check with jing
285           message(STATUS "Calling: ${JAVA_EXECUTABLE} -jar \"${TOP_SRC_DIR}/development/tools/jing.jar\" https://docbook.org/xml/5.2b09/rng/docbook.rng \"${WORKDIR}/${result_file_name}\"")
286           execute_process(
287             COMMAND ${JAVA_EXECUTABLE} -jar "${TOP_SRC_DIR}/development/tools/jing.jar" "https://docbook.org/xml/5.2b09/rng/docbook.rng" "${WORKDIR}/${result_file_name}"
288             OUTPUT_VARIABLE jingout
289             RESULT_VARIABLE _err)
290           message(STATUS "_err = ${_err}, jingout = ${jingout}")
291           Summary(_err "Checking for empty output of ${JAVA_EXECUTABLE} -jar \"${TOP_SRC_DIR}/development/tools/jing.jar\"")
292         endif()
293       endif()
294     endif()
295   endif()
296 endif()
297
298 if(inverted)
299   string(COMPARE EQUAL  ${_err} 0 _erg)
300 else()
301   string(COMPARE NOTEQUAL  ${_err} 0 _erg)
302 endif()
303
304 if ($ENV{LYX_DEBUG_LATEX})
305   # Do not remove temporary files if one wants to examine them
306   # for example if setting the env-var LYX_DEBUG_LATEX
307   # This needs a remove all temp-dirs from time to time
308   # $ cd build-dir
309   # $ find autotests/out-home -name AbC_\* | xargs rm -rf
310 else()
311   execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${TempDir}")
312 endif()
313 if(_TestResultMessage)
314   message(STATUS "Msg Summary:")
315   foreach(_l ${_TestResultMessage})
316     message(STATUS "\t${_l}")
317   endforeach()
318 endif()
319 if(_erg)
320   message(STATUS "Exporting ${file}.lyx to ${format}")
321   message(FATAL_ERROR "Export failed")
322 endif()