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