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)
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")
239 if (XMLLINT_EXECUTABLE)
240 message(STATUS "Calling: " ${executable_} ${xmllint_params} " ${result_file_name}")
241 # check the created xhtml file
243 COMMAND ${executable_} ${xmllint_params} "${result_file_name}"
244 OUTPUT_VARIABLE xmlout
245 ERROR_VARIABLE xmlerr
246 RESULT_VARIABLE _err)
247 file(WRITE "${result_file_name}.sax_out" ${xmlout})
248 Summary(_err "Checking \"${result_file_name}\" with ${XMLLINT_EXECUTABLE}")
250 # check if sax-parser output contains error messages
251 message(STATUS "Check the output: ${PERL_EXECUTABLE} ${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl")
253 COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl" "${result_file_name}.sax_out"
254 OUTPUT_VARIABLE xmlout
255 RESULT_VARIABLE _err)
256 Summary(_err "Parse messages of ${XMLLINT_EXECUTABLE} for errors")
259 if (NOT "${xmlout}" STREQUAL "")
260 message(STATUS "${xmlout}")
262 Summary(_err "Non empty output of \"${XMLLINT_EXECUTABLE}\"")
272 string(COMPARE EQUAL ${_err} 0 _erg)
274 string(COMPARE NOTEQUAL ${_err} 0 _erg)
276 execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${TempDir}")
277 if(_TestResultMessage)
278 message(STATUS "Msg Summary:")
279 foreach(_l ${_TestResultMessage})
280 message(STATUS "\t${_l}")
284 message(STATUS "Exporting ${file}.lyx to ${format}")
285 message(FATAL_ERROR "Export failed")