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} \
31 # -P "${TOP_SRC_DIR}/development/autotests/export.cmake"
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")
41 execute_process(COMMAND ${PERL_EXECUTABLE} "${GetTempDir}" "${WORKDIR}" OUTPUT_VARIABLE TempDir)
42 message(STATUS "using fonttype = ${_ft}")
44 set(ENCODING "default")
46 if(ENCODING STREQUAL "default")
49 set(_enc "_${ENCODING}")
52 # move the the last directory part of LYX_ROOT to filename
53 # to make the destination unique for otherwise identical
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_}")
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}")
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}
72 string(COMPARE EQUAL ${_err} 0 _erg)
74 message(FATAL_ERROR "Export failed while converting")
76 set(result_file_name ${file}_${_ft}.${extension})
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}
84 string(COMPARE EQUAL ${_err} 0 _erg)
86 message(FATAL_ERROR "Export failed while converting")
88 if(extension MATCHES "\\.lyx$")
89 # Font-type not relevant for lyx16/lyx2[0123] exports
90 set(result_file_base "${TempDir}/${file}")
92 set(result_file_name ${file}.${extension})
96 function(get_md5sum msource mresult mreserr)
98 COMMAND ${CMAKE_COMMAND} -E md5sum ${${msource}}
99 OUTPUT_VARIABLE msource_md5sum_x
100 RESULT_VARIABLE 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}")
106 set(${mresult} "xx" PARENT_SCOPE)
107 message(STATUS "Error getting MD5SUM of \"${${msource}}\"")
109 set(${mreserr} ${mres_err} PARENT_SCOPE)
112 macro(Summary _err _msg)
114 list(APPEND _TestResultMessage "Error: ${_msg}")
116 list(APPEND _TestResultMessage "OK: ${_msg}")
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}")
135 COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
137 ERROR_VARIABLE lyxerr)
138 Summary(_err "Converting \"${LYX_SOURCE}\" to format ${format}")
142 if(NOT EXISTS "${result_file_name}")
144 Summary(_err "Expected result file \"${result_file_name}\" does not exist")
147 message(STATUS "Expected result file \"${result_file_name}\" exists")
149 COMMAND ${PERL_EXECUTABLE} ${Structure_Script} "${result_file_name}"
150 RESULT_VARIABLE _err)
151 Summary(_err "Structure of the intermediate file \"${result_file_name}\"")
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}")
160 message(STATUS "Create the corresponding .tex file \"${used_tex_file}\"")
162 COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E pdflatex ${used_tex_file} "${LYX_SOURCE}"
163 RESULT_VARIABLE _errx)
166 get_md5sum(result_file_name result_md5sum _err)
167 Summary(_err "Getting md5sum of \"${result_file_name}\"")
169 # Somehow the created file is not readable?
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")
179 elseif(format MATCHES "lyx22x" AND file MATCHES "Minted")
180 message(STATUS "Not exporting due to missing minted support")
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}\"")
187 COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E default "${result_file_name}.default" "${result_file_name}"
189 ERROR_VARIABLE lyxerr)
190 Summary(_err "Test-compilation of \"${result_file_name}\" to format default")
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")
197 message(STATUS "Possible endless loop encountered")
198 Summary(_err "Test-Loop exceeded the count of 10, Possible endless loop")
202 set(source_md5sum ${result_md5sum})
203 set(LYX_SOURCE ${result_file_name})
206 if ($ENV{LYX_DEBUG_LATEX})
207 set(LyXExtraParams -dbg latex)
209 set(LyXExtraParams -dbg info)
211 if(IgnoreErrorMessage)
212 foreach (_em ${IgnoreErrorMessage})
213 list(APPEND LyXExtraParams --ignore-error-message ${_em})
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})
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}")
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")
228 Summary(_err "Expected result file \"${result_file_name}\" does not exists")
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 --sax --html --valid)
234 set(executable_ ${XMLLINT_EXECUTABLE})
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}\"")
242 COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/xmlParser.pl" "${result_file_name}"
243 OUTPUT_VARIABLE parserout
244 ERROR_VARIABLE parsererr
248 message(STATUS "${parsererr}")
250 Summary(_err "Checking \"${result_file_name}\" with xmlParser.pl")
252 if (XMLLINT_EXECUTABLE)
253 message(STATUS "Calling: " ${executable_} ${xmllint_params} " ${result_file_name}")
254 # check the created xhtml file
256 COMMAND ${executable_} ${xmllint_params} "${result_file_name}"
257 OUTPUT_VARIABLE xmlout
258 ERROR_VARIABLE xmlerr
259 RESULT_VARIABLE _err)
260 file(WRITE "${result_file_name}.sax_out" ${xmlout})
261 Summary(_err "Checking \"${result_file_name}\" with ${XMLLINT_EXECUTABLE}")
263 # check if sax-parser output contains error messages
264 message(STATUS "Check the output: ${PERL_EXECUTABLE} ${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl")
266 COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl" "${result_file_name}.sax_out"
267 OUTPUT_VARIABLE xmlout
268 RESULT_VARIABLE _err)
269 Summary(_err "Parse messages of ${XMLLINT_EXECUTABLE} for errors")
272 if (NOT "${xmlout}" STREQUAL "")
273 message(STATUS "${xmlout}")
275 Summary(_err "Non empty output of \"${XMLLINT_EXECUTABLE}\"")
285 string(COMPARE EQUAL ${_err} 0 _erg)
287 string(COMPARE NOTEQUAL ${_err} 0 _erg)
289 execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${TempDir}")
290 if(_TestResultMessage)
291 message(STATUS "Msg Summary:")
292 foreach(_l ${_TestResultMessage})
293 message(STATUS "\t${_l}")
297 message(STATUS "Exporting ${file}.lyx to ${format}")
298 message(FATAL_ERROR "Export failed")