]> git.lyx.org Git - features.git/blob - development/autotests/export.cmake
Cmake export tests: Export to docbook5
[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           set(executable_ ${XMLLINT_EXECUTABLE})
226         else()
227           set(xmllint_params)
228           set(executable_ ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/filterXml4Sax.pl")
229         endif()
230         if (XMLLINT_EXECUTABLE)
231           message(STATUS "Calling: ${XMLLINT_EXECUTABLE} " ${xmllint_params})
232           # check the created xhtml file
233           execute_process(
234             COMMAND ${executable_} ${xmllint_params}  "${result_file_name}"
235             OUTPUT_VARIABLE xmlout
236             ERROR_VARIABLE xmlerr
237             RESULT_VARIABLE _err)
238           file(WRITE "${result_file_name}.sax_out" ${xmlout})
239           Summary(_err "Checking \"${result_file_name}\" with ${XMLLINT_EXECUTABLE}")
240           if (NOT _err)
241             # check if sax-parser output contains error messages
242             message(STATUS "Check the output: ${PERL_EXECUTABLE} ${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl")
243             execute_process(
244               COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl" "${result_file_name}.sax_out"
245               OUTPUT_VARIABLE xmlout
246               RESULT_VARIABLE _err)
247             Summary(_err "Parse messages of ${XMLLINT_EXECUTABLE} for errors")
248           endif()
249           if (NOT _err)
250             if (NOT "${xmlout}" STREQUAL "")
251               message(STATUS "${xmlout}")
252               set(_err -1)
253               Summary(_err "Non empty output of \"${XMLLINT_EXECUTABLE}\"")
254             endif()
255           endif()
256         endif()
257       endif()
258     endif()
259   endif()
260 endif()
261
262 if(inverted)
263   string(COMPARE EQUAL  ${_err} 0 _erg)
264 else()
265   string(COMPARE NOTEQUAL  ${_err} 0 _erg)
266 endif()
267 execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${TempDir}")
268 if(_TestResultMessage)
269   message(STATUS "Msg Summary:")
270   foreach(_l ${_TestResultMessage})
271     message(STATUS "\t${_l}")
272   endforeach()
273 endif()
274 if(_erg)
275   message(STATUS "Exporting ${file}.lyx to ${format}")
276   message(FATAL_ERROR "Export failed")
277 endif()