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