1 # This file is part of LyX, the document processor.
2 # Licence details can be found in the file COPYING.
4 # Copyright (c) 2012 Kornel Benko kornel@lyx.org
7 # LYX_ROOT = ${TOP_SRC_DIR}/lib/{doc,examples,templates,tabletemplates}
8 # LYX_USERDIR_VER = Name of environment variable for the user directory
10 # format = lyx16x|lyx20x|lyx21x|lyx22x|xhtml|docbook5
11 # extension = 16.lyx|20.lyx|21.lyx|22.lyx|xhtml|xml
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} \
23 # -DLYX_FORMAT_NUM=${_lyx_format_num} \
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} \
32 # -P "${TOP_SRC_DIR}/development/autotests/export.cmake"
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")
42 execute_process(COMMAND ${PERL_EXECUTABLE} "${GetTempDir}" "${WORKDIR}" OUTPUT_VARIABLE TempDir)
43 message(STATUS "using fonttype = ${_ft}")
45 set(ENCODING "default")
47 if(ENCODING STREQUAL "default")
50 set(_enc "_${ENCODING}")
53 # move the the last directory part of LYX_ROOT to filename
54 # to make the destination unique for otherwise identical
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_}")
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}")
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}
73 string(COMPARE EQUAL ${_err} 0 _erg)
75 message(FATAL_ERROR "Export failed while converting")
77 set(result_file_name ${file}_${_ft}.${extension})
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}
85 string(COMPARE EQUAL ${_err} 0 _erg)
87 message(FATAL_ERROR "Export failed while converting")
89 if(extension MATCHES "\\.lyx$")
90 # Font-type not relevant for lyx16/lyx2[0123] exports
91 set(result_file_base "${TempDir}/${file}")
93 set(result_file_name ${file}.${extension})
97 function(get_md5sum msource mresult mreserr)
99 COMMAND ${CMAKE_COMMAND} -E md5sum ${${msource}}
100 OUTPUT_VARIABLE msource_md5sum_x
101 RESULT_VARIABLE 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}")
107 set(${mresult} "xx" PARENT_SCOPE)
108 message(STATUS "Error getting MD5SUM of \"${${msource}}\"")
110 set(${mreserr} ${mres_err} PARENT_SCOPE)
113 macro(Summary _err _msg)
115 list(APPEND _TestResultMessage "Error: ${_msg}")
117 list(APPEND _TestResultMessage "OK: ${_msg}")
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}")
136 COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
138 ERROR_VARIABLE lyxerr)
139 Summary(_err "Converting \"${LYX_SOURCE}\" to format ${format}")
143 if(NOT EXISTS "${result_file_name}")
145 Summary(_err "Expected result file \"${result_file_name}\" does not exist")
148 message(STATUS "Expected result file \"${result_file_name}\" exists")
150 COMMAND ${PERL_EXECUTABLE} ${Structure_Script} "${result_file_name}"
151 RESULT_VARIABLE _err)
152 Summary(_err "Structure of the intermediate file \"${result_file_name}\"")
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}")
161 message(STATUS "Create the corresponding .tex file \"${used_tex_file}\"")
163 COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E pdflatex ${used_tex_file} "${LYX_SOURCE}"
164 RESULT_VARIABLE _errx)
167 get_md5sum(result_file_name result_md5sum _err)
168 Summary(_err "Getting md5sum of \"${result_file_name}\"")
170 # Somehow the created file is not readable?
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")
180 elseif(format MATCHES "lyx22x" AND file MATCHES "Minted")
181 message(STATUS "Not exporting due to missing minted support")
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}\"")
188 COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E default "${result_file_name}.default" "${result_file_name}"
190 ERROR_VARIABLE lyxerr)
191 Summary(_err "Test-compilation of \"${result_file_name}\" to format default")
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")
198 message(STATUS "Possible endless loop encountered")
199 Summary(_err "Test-Loop exceeded the count of 10, Possible endless loop")
203 set(source_md5sum ${result_md5sum})
204 set(LYX_SOURCE ${result_file_name})
207 if ($ENV{LYX_DEBUG_LATEX})
208 set(LyXExtraParams -dbg latex)
210 set(LyXExtraParams -dbg info)
212 if(IgnoreErrorMessage)
213 foreach (_em ${IgnoreErrorMessage})
214 list(APPEND LyXExtraParams --ignore-error-message ${_em})
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})
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}")
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")
229 Summary(_err "Expected result file \"${result_file_name}\" does not exists")
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})
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}\"")
243 COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/xmlParser.pl" "${result_file_name}"
244 OUTPUT_VARIABLE parserout
245 ERROR_VARIABLE parsererr
249 message(STATUS "${parsererr}")
251 Summary(_err "Checking \"${result_file_name}\" with xmlParser.pl")
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
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}")
265 # check if parser output contains error messages
266 message(STATUS "Check the output: ${PERL_EXECUTABLE} ${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl")
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")
273 message(STATUS "Errors from xmllint: ${xmlerr}")
276 if (NOT "${xmlout}" STREQUAL "")
277 message(STATUS "${xmlout}")
279 Summary(_err "Non empty output of \"${XMLLINT_EXECUTABLE}\"")
283 if (NOT _err AND format MATCHES "docbook5" AND JAVA_EXECUTABLE)
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}\"")
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\"")
299 string(COMPARE EQUAL ${_err} 0 _erg)
301 string(COMPARE NOTEQUAL ${_err} 0 _erg)
303 execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${TempDir}")
304 if(_TestResultMessage)
305 message(STATUS "Msg Summary:")
306 foreach(_l ${_TestResultMessage})
307 message(STATUS "\t${_l}")
311 message(STATUS "Exporting ${file}.lyx to ${format}")
312 message(FATAL_ERROR "Export failed")