]> git.lyx.org Git - lyx.git/blob - development/autotests/export.cmake
Typo in message
[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   # We only need "_${ENCODING}" for unicode tests (because multiple encodings
78   # are tested with the same format), but doesn't hurt to include for all.
79   set(result_file_name ${file}_${_ft}_${ENCODING}.${extension})
80 else()
81   message(STATUS "Converting with perl ${Perl_Script}")
82   set(LYX_SOURCE "${TempDir}/${file}.lyx")
83   message(STATUS "Using source \"${LYX_ROOT}/${file}.lyx\"")
84   message(STATUS "Using dest \"${LYX_SOURCE}\"")
85   execute_process(COMMAND ${PERL_EXECUTABLE} "${Perl_Script}" "${LYX_ROOT}/${file}.lyx" "${LYX_SOURCE}" ${format} "dontChange" "default" ${LanguageFile}
86     RESULT_VARIABLE _err)
87   string(COMPARE EQUAL  ${_err} 0 _erg)
88   if(NOT _erg)
89     message(FATAL_ERROR "Export failed while converting")
90     endif()
91   if(extension MATCHES "\\.lyx$")
92     # Font-type not relevant for lyx16/lyx2[0123] exports
93     set(result_file_base "${TempDir}/${file}")
94   else()
95     set(result_file_name ${file}.${extension})
96   endif()
97 endif()
98
99 function(get_md5sum msource mresult mreserr)
100   execute_process(
101     COMMAND ${CMAKE_COMMAND} -E md5sum ${${msource}}
102     OUTPUT_VARIABLE msource_md5sum_x
103     RESULT_VARIABLE mres_err)
104   if (NOT mres_err)
105     string(REGEX REPLACE " .*" "" msource_md5sum ${msource_md5sum_x})
106     set(${mresult} ${msource_md5sum} PARENT_SCOPE)
107     message(STATUS "MD5SUM of \"${${msource}}\" is ${msource_md5sum}")
108   else()
109     set(${mresult} "xx" PARENT_SCOPE)
110     message(STATUS "Error getting MD5SUM of \"${${msource}}\"")
111   endif()
112   set(${mreserr} ${mres_err} PARENT_SCOPE)
113 endfunction()
114
115 macro(Summary _err _msg)
116   if (${_err})
117     list(APPEND _TestResultMessage "Error: ${_msg}")
118   else()
119     list(APPEND _TestResultMessage "OK: ${_msg}")
120   endif()
121 endmacro()
122
123 set(ENV{${LYX_USERDIR_VER}} "${LYX_TESTS_USERDIR}")
124 set(ENV{LANG} "en_US.UTF-8") # to get all error-messages in english
125 set(ENV{LANGUAGE} "US:en")
126 #set(ENV{LC_ALL} "C")
127 if (extension MATCHES "\\.lyx$")
128   include(${TOP_SRC_DIR}/development/autotests/CheckLoadErrors.cmake)
129   get_md5sum(LYX_SOURCE source_md5sum _err)
130   foreach(_lv RANGE 1 20)
131     set(used_tex_file "${result_file_base}.tex")
132     set(result_file_base "${result_file_base}.${LYX_FORMAT_NUM}")
133     set(result_file_name "${result_file_base}.lyx")
134     file(REMOVE "${result_file_name}" "${result_file_name}.emergency" )
135     message(STATUS "Executing ${lyx} -userdir \"${LYX_TESTS_USERDIR}\" -E ${format} ${result_file_name} \"${LYX_SOURCE}\"")
136     message(STATUS "This implicitly checks load of ${LYX_SOURCE}")
137     execute_process(
138       COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
139       RESULT_VARIABLE _err
140       ERROR_VARIABLE lyxerr)
141     Summary(_err "Converting \"${LYX_SOURCE}\" to format ${format}")
142     if(_err)
143       break()
144     else()
145       if(NOT EXISTS "${result_file_name}")
146         set(_err -1)
147         Summary(_err "Expected result file \"${result_file_name}\" does not exist")
148         break()
149       else()
150         message(STATUS "Expected result file \"${result_file_name}\" exists")
151         execute_process(
152           COMMAND ${PERL_EXECUTABLE} ${Structure_Script} "${result_file_name}"
153           RESULT_VARIABLE _err)
154         Summary(_err "Structure of the intermediate file \"${result_file_name}\"")
155         if(_err)
156           break()
157         endif()
158         checkLoadErrors(lyxerr "${TOP_SRC_DIR}/development/autotests" _err)
159         Summary(_err "Examination of error/warning messages of the conversion of \"${LYX_SOURCE}\" to format ${format}")
160         if(_err)
161           break()
162         endif()
163         message(STATUS "Create the corresponding .tex file \"${used_tex_file}\"")
164         execute_process(
165           COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E pdflatex ${used_tex_file} "${LYX_SOURCE}"
166           RESULT_VARIABLE _errx)
167       endif()
168     endif()
169     get_md5sum(result_file_name result_md5sum _err)
170     Summary(_err "Getting md5sum of \"${result_file_name}\"")
171     if(_err)
172       # Somehow the created file is not readable?
173       break()
174     endif()
175     # Check if result file identical to source file
176     if(result_md5sum STREQUAL ${source_md5sum})
177       if (format MATCHES "lyx(1[0-9]|2[01])x")
178         # Do not compile, missing \origin statement prevents inclusion of
179         # files with relative path
180         message(STATUS "Not exporting due to missing \\origin statement")
181         break()
182       elseif(format MATCHES "lyx22x" AND file MATCHES "Minted")
183         message(STATUS "Not exporting due to missing minted support")
184         break()
185       endif()
186       message(STATUS "Source(${LYX_SOURCE}) and dest(${result_file_name}) are equal")
187       message(STATUS "Now try to export the lyx2lyx created file")
188       message(STATUS "Executing ${lyx} -userdir \"${LYX_TESTS_USERDIR}\" -E default \"${result_file_name}.default\" \"${result_file_name}\"")
189       execute_process(
190         COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E default "${result_file_name}.default" "${result_file_name}"
191         RESULT_VARIABLE _err
192         ERROR_VARIABLE lyxerr)
193       Summary(_err "Test-compilation of \"${result_file_name}\" to format default")
194       break()
195     else()
196       list(APPEND _TestResultMessage "Warning: \"${LYX_SOURCE}\" and \"${result_file_name}\" differ")
197       message(STATUS "Source(${LYX_SOURCE}) and dest(${result_file_name}) are still different")
198       if (_lv GREATER 10)
199         set(_err 1)
200         message(STATUS "Possible endless loop encountered")
201         Summary(_err "Test-Loop exceeded the count of 10, Possible endless loop")
202         break()
203       endif()
204     endif()
205     set(source_md5sum ${result_md5sum})
206     set(LYX_SOURCE ${result_file_name})
207   endforeach()
208 else()
209   if ($ENV{LYX_DEBUG_LATEX})
210     set(LyXExtraParams -dbg latex)
211   else()
212     set(LyXExtraParams -dbg info)
213   endif()
214   if(IgnoreErrorMessage)
215     foreach (_em ${IgnoreErrorMessage})
216       list(APPEND LyXExtraParams --ignore-error-message ${_em})
217     endforeach()
218   endif()
219   string(REGEX REPLACE ";" " " _LyXExtraParams "${LyXExtraParams}")
220   message(STATUS "Executing in working dir ${TempDir}")
221   message(STATUS "Executing ${lyx} ${_LyXExtraParams} -userdir \"${LYX_TESTS_USERDIR}\" -E ${format} ${result_file_name} \"${LYX_SOURCE}\"")
222   file(REMOVE "${TempDir}/${result_file_name}")
223   execute_process(
224     COMMAND ${lyx} ${LyXExtraParams} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
225     WORKING_DIRECTORY "${TempDir}"
226     RESULT_VARIABLE _err)
227   Summary(_err "Exporting \"${LYX_SOURCE}\" to format ${format}")
228   if (NOT _err)
229     #check if result file created
230     if (NOT EXISTS "${TempDir}/${result_file_name}")
231       message(STATUS "Expected result file \"${TempDir}/${result_file_name}\" does not exist")
232       set(_err -1)
233       Summary(_err "Expected result file \"${TempDir}/${result_file_name}\" does not exists")
234     else()
235       message(STATUS "Expected result file \"${TempDir}/${result_file_name}\" exists")
236       if (extension MATCHES "^x(ht)?ml$")
237         if (format MATCHES "xhtml")
238           set(xmllint_params --loaddtd --noout)
239           set(executable_ ${XMLLINT_EXECUTABLE})
240         else()
241           set(xmllint_params)
242           set(executable_ ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/filterXml4Sax.pl")
243           # Check with perl xml-parser
244           # needs XML::Parser module
245           message(STATUS "Calling ${PERL_EXECUTABLE} \"${TOP_SRC_DIR}/development/autotests/xmlParser.pl\" \"${result_file_name}\"")
246           execute_process(
247             COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/xmlParser.pl" "${result_file_name}"
248             WORKING_DIRECTORY "${TempDir}"
249             OUTPUT_VARIABLE parserout
250             ERROR_VARIABLE parsererr
251             RESULT_VARIABLE _err
252           )
253           if (_err)
254             message(STATUS "${parsererr}")
255           endif()
256           Summary(_err "Checking \"${TempDir}/${result_file_name}\" with xmlParser.pl")
257         endif()
258         if (XMLLINT_EXECUTABLE)
259           string(REPLACE ";" " " xmllint_params2 " ${xmllint_params}")
260           message(STATUS "Calling: " ${executable_} ${xmllint_params2} " ${WORKDIR}/${result_file_name}")
261           # check the created xhtml file
262           execute_process(
263             COMMAND ${executable_} ${xmllint_params}  "${result_file_name}"
264             WORKING_DIRECTORY "${TempDir}"
265             OUTPUT_VARIABLE xmlout
266             ERROR_VARIABLE xmlerr
267             RESULT_VARIABLE _err)
268           file(WRITE "${TempDir}/${result_file_name}.sax_out" ${xmlout})
269           Summary(_err "Checking \"${TempDir}/${result_file_name}\" with ${XMLLINT_EXECUTABLE}")
270           if (NOT _err)
271             # check if parser output contains error messages
272             message(STATUS "Check the output: ${PERL_EXECUTABLE} ${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl")
273             execute_process(
274               COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl" "${result_file_name}.sax_out"
275               WORKING_DIRECTORY "${TempDir}"
276               OUTPUT_VARIABLE xmlout
277               RESULT_VARIABLE _err)
278             Summary(_err "Parse messages of ${XMLLINT_EXECUTABLE} for errors")
279           else()
280             message(STATUS "Errors from xmllint: ${xmlerr}")
281           endif()
282           if (NOT _err)
283             if (NOT "${xmlout}" STREQUAL "")
284               message(STATUS "${xmlout}")
285               set(_err -1)
286               Summary(_err "Non empty output of \"${XMLLINT_EXECUTABLE}\"")
287             endif()
288           endif()
289         endif()
290         if (NOT _err AND format MATCHES "docbook5" AND JAVA_EXECUTABLE)
291           # check with jing
292           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}\"")
293           execute_process(
294             COMMAND ${JAVA_EXECUTABLE} -jar "${TOP_SRC_DIR}/development/tools/jing.jar" "https://docbook.org/xml/5.2b09/rng/docbook.rng" "${result_file_name}"
295             WORKING_DIRECTORY "${TempDir}"
296             OUTPUT_VARIABLE jingout
297             RESULT_VARIABLE _err)
298           message(STATUS "_err = ${_err}, jingout = ${jingout}")
299           Summary(_err "Checking for empty output of ${JAVA_EXECUTABLE} -jar \"${TOP_SRC_DIR}/development/tools/jing.jar\"")
300         endif()
301       endif()
302     endif()
303   endif()
304 endif()
305
306 if(inverted)
307   string(COMPARE EQUAL  ${_err} 0 _erg)
308 else()
309   string(COMPARE NOTEQUAL  ${_err} 0 _erg)
310 endif()
311
312 if ($ENV{LYX_DEBUG_LATEX})
313   # Do not remove temporary files if one wants to examine them
314   # for example if setting the env-var LYX_DEBUG_LATEX
315   # This needs a remove all temp-dirs from time to time
316   # $ cd build-dir
317   # $ find autotests/out-home -name AbC_\* | xargs rm -rf
318 else()
319   execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${TempDir}")
320 endif()
321 if(_TestResultMessage)
322   message(STATUS "Msg Summary:")
323   foreach(_l ${_TestResultMessage})
324     message(STATUS "\t${_l}")
325   endforeach()
326 endif()
327 if(_erg)
328   message(STATUS "Exporting ${file}.lyx to ${format}")
329   message(FATAL_ERROR "Export failed")
330 endif()