X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=f2197131110e0f64e138a15ac98eed281cdd9570;hb=483e0f61e71d0633644f5d00d6176daea819462e;hp=e9c83ee27649e9863329199111066b5c03c84858;hpb=8995a8387a03361b6a7ff44b447a90a6187b1a14;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index e9c83ee276..f219713111 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -56,23 +56,40 @@ def removeFiles(filenames): pass -def cmdOutput(cmd): +def cmdOutput(cmd, async = False): '''utility function: run a command and get its output as a string cmd: command to run + async: if False, return whole output as a string, otherwise + return the stdout handle from which the output can be + read (the caller is then responsible for closing it) ''' if os.name == 'nt': b = False - cmd = 'cmd /d /c pushd ' + os.getcwd() + '&' + cmd + cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd else: b = True pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, \ stdout=subprocess.PIPE, universal_newlines=True) pipe.stdin.close() + if async: + return pipe.stdout output = pipe.stdout.read() pipe.stdout.close() return output.strip() +def shortPath(path): + ''' On Windows, return the short version of "path" if possible ''' + if os.name == 'nt': + from ctypes import windll, create_unicode_buffer + GetShortPathName = windll.kernel32.GetShortPathNameW + shortlen = GetShortPathName(path, 0, 0) + shortpath = create_unicode_buffer(shortlen) + if GetShortPathName(path, shortpath, shortlen): + return shortpath.value + return path + + def setEnviron(): ''' I do not really know why this is useful, but we might as well keep it. NLS nuisances. @@ -110,21 +127,13 @@ def checkTeXPaths(): fd, tmpfname = mkstemp(suffix='.ltx') if os.name == 'nt': from locale import getdefaultlocale - from ctypes import windll, create_unicode_buffer - GetShortPathName = windll.kernel32.GetShortPathNameW language, encoding = getdefaultlocale() if encoding == None: encoding = 'latin1' - longname = unicode(tmpfname, encoding) - shortlen = GetShortPathName(longname, 0, 0) - shortname = create_unicode_buffer(shortlen) - if GetShortPathName(longname, shortname, shortlen): - inpname = shortname.value.replace('\\', '/') - else: - inpname = tmpfname.replace('\\', '/') + inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/') else: inpname = cmdOutput('cygpath -m ' + tmpfname) - logname = os.path.basename(inpname.replace('.ltx', '.log')) + logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname)) inpname = inpname.replace('~', '\\string~') os.write(fd, r'\relax') os.close(fd) @@ -189,6 +198,8 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''): if "PATHEXT" in os.environ: extlist = extlist + os.environ["PATHEXT"].split(os.pathsep) for ac_dir in path: + if hasattr(os, "access") and not os.access(ac_dir, os.F_OK): + continue for ext in extlist: if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ): logger.info(msg + ' yes') @@ -243,6 +254,8 @@ def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [], extlist = extlist + os.environ["PATHEXT"].split(os.pathsep) found_alt = False for ac_dir in path: + if hasattr(os, "access") and not os.access(ac_dir, os.F_OK): + continue for ext in extlist: if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ): logger.info(msg + ' yes') @@ -520,7 +533,7 @@ def checkFormatEntries(dtl_tools): (iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie) ) # checkViewerEditor('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \ - 'nedit', 'gedit', 'notepad'], + 'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'], rc_entry = [r'''\Format asciichess asc "Plain text (chess output)" "" "" "%%" "" "" \Format asciiimage asc "Plain text (image)" "" "" "%%" "" "" \Format asciixfig asc "Plain text (Xfig output)" "" "" "%%" "" "" @@ -544,7 +557,8 @@ def checkFormatEntries(dtl_tools): \Format text2 txt "Plain text (pstotext)" "" "" "%%" "document" "" \Format text3 txt "Plain text (ps2ascii)" "" "" "%%" "document" "" \Format text4 txt "Plain text (catdvi)" "" "" "%%" "document" "" -\Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document" ""''' ]) +\Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document" "" +\Format beamer.info pdf.info "Info (Beamer)" "" "" "%%" "document,menu=export" ""''' ]) #Spreadsheets using ssconvert from gnumeric checkViewer('gnumeric spreadsheet software', ['gnumeric'], rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document" "application/x-gnumeric" @@ -558,7 +572,8 @@ def checkFormatEntries(dtl_tools): 'pybliographic', 'bibdesk', 'gbib', 'kbib', \ 'kbibtex', 'sixpack', 'bibedit', 'tkbibtex' \ 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \ - 'nedit', 'gedit', 'notepad'], + 'jedit', 'TeXnicCenter', 'WinEdt', 'WinShell', 'PSPad', \ + 'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'], rc_entry = [r'''\Format bibtex bib "BibTeX" "" "" "%%" "" "text/x-bibtex"''' ]) # #checkProg('a Postscript interpreter', ['gs'], @@ -568,13 +583,15 @@ def checkFormatEntries(dtl_tools): \Format eps2 eps "EPS (uncropped)" "" "%%" "" "vector" "" \Format ps ps Postscript t "%%" "" "document,vector,menu=export" "application/postscript"''']) # for xdg-open issues look here: http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg151818.html - checkViewer('a PDF previewer', ['kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \ + # the MIME type is set for pdf6, because that one needs to be autodetectable by libmime + checkViewer('a PDF previewer', ['pdfview', 'kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', 'mupdf', \ 'gv', 'ghostview'], - rc_entry = [r'''\Format pdf pdf "PDF (ps2pdf)" P "%%" "" "document,vector,menu=export" "application/pdf" + rc_entry = [r'''\Format pdf pdf "PDF (ps2pdf)" P "%%" "" "document,vector,menu=export" "" \Format pdf2 pdf "PDF (pdflatex)" F "%%" "" "document,vector,menu=export" "" \Format pdf3 pdf "PDF (dvipdfm)" m "%%" "" "document,vector,menu=export" "" \Format pdf4 pdf "PDF (XeTeX)" X "%%" "" "document,vector,menu=export" "" -\Format pdf5 pdf "PDF (LuaTeX)" u "%%" "" "document,vector,menu=export" ""''']) +\Format pdf5 pdf "PDF (LuaTeX)" u "%%" "" "document,vector,menu=export" "" +\Format pdf6 pdf "PDF (graphics)" "" "%%" "" "vector" "application/pdf"''']) # checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular', 'yap', 'dviout -Set=!m'], rc_entry = [r'''\Format dvi dvi DVI D "%%" "" "document,vector,menu=export" "application/x-dvi" @@ -589,11 +606,11 @@ def checkFormatEntries(dtl_tools): checkViewerEditor('Noteedit', ['noteedit'], rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector" ""']) # - checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', 'abiword'], + checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'], rc_entry = [r'''\Format odt odt OpenDocument "" "%%" "%%" "document,vector,menu=export" "application/vnd.oasis.opendocument.text" \Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector" "application/vnd.sun.xml.writer"''']) # - checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', 'abiword'], + checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'], rc_entry = [r'''\Format rtf rtf "Rich Text Format" "" "%%" "%%" "document,vector,menu=export" "application/rtf" \Format word doc "MS Word" W "%%" "%%" "document,vector,menu=export" "application/msword"''']) # @@ -631,24 +648,30 @@ def checkConverterEntries(): checkLuatex() # Look for tex2lyx in this order (see bugs #3308 and #6986): - # 1) If we're running LyX in-place then tex2lyx will be found - # in ../src/tex2lyx with respect to the srcdir. - # 2) If LyX was configured with a version suffix then tex2lyx + # 1) If we're building LyX with autotools then tex2lyx is found + # in the subdirectory tex2lyx with respect to the binary dir. + # 2) If we're building LyX with cmake then tex2lyx is found + # in the binary dir. + # 3) If LyX was configured with a version suffix then tex2lyx # will also have this version suffix. - # 3) Otherwise always use tex2lyx. - in_place = os.path.join(srcdir, '..', 'src', 'tex2lyx', 'tex2lyx') - in_place = os.path.abspath(in_place) + # 4) Otherwise always use tex2lyx. + in_binary_subdir = os.path.join(lyx_binary_dir, 'tex2lyx', 'tex2lyx') + in_binary_subdir = os.path.abspath(in_binary_subdir) - path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [in_place, 'tex2lyx' + version_suffix, 'tex2lyx'], + in_binary_dir = os.path.join(lyx_binary_dir, 'tex2lyx') + in_binary_dir = os.path.abspath(in_binary_dir) + + path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [in_binary_subdir, in_binary_subdir + version_suffix, in_binary_dir, in_binary_dir + version_suffix, 'tex2lyx' + version_suffix, 'tex2lyx'], rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" "" -\converter literate lyx "%% -n -f $$i $$o" ""'''], not_found = 'tex2lyx') +\converter literate lyx "%% -n -m noweb -f $$i $$o" ""'''], not_found = 'tex2lyx') if path == '': logger.warning("Failed to find tex2lyx on your system.") # checkProg('a Noweb -> LaTeX converter', ['noweave -delay -index $$i > $$o'], rc_entry = [r'''\converter literate latex "%%" "" -\converter literate pdflatex "%%" ""''']) +\converter literate pdflatex "%%" "" +\converter literate luatex "%%" ""''']) # checkProg('a Sweave -> LaTeX converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxsweave.R $$p$$i $$p$$o $$e $$r'], rc_entry = [r'''\converter sweave latex "%%" "" @@ -665,12 +688,15 @@ def checkConverterEntries(): checkProg('a Sweave -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxstangle.R $$i $$e $$r'], rc_entry = [ r'\converter sweave r "%%" ""' ]) # - checkProg('a knitr -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxknitr.R $$p$$i $$p$$o $$e $$r tangle'], + checkProg('a knitr -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxknitr.R $$p$$i $$p$$o $$e $$r tangle'], rc_entry = [ r'\converter knitr r "%%" ""' ]) # - checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex $$i', + checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex', 'htmltolatex -input $$i -output $$o', 'htmltolatex.jar -input $$i -output $$o'], - rc_entry = [ r'\converter html latex "%%" ""' ]) + rc_entry = [ r'\converter html latex "%%" ""', \ + r'\converter html latex "python -tt $$s/scripts/html2latexwrapper.py %% $$i $$o" ""', \ + r'\converter html latex "%%" ""', \ + r'\converter html latex "%%" ""', '' ]) # checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'], rc_entry = [ r'\converter word latex "%%" ""' ]) @@ -709,7 +735,7 @@ def checkConverterEntries(): # Check if LyXBlogger is installed lyxblogger_found = checkModule('lyxblogger') if lyxblogger_found: - addToRC(r'\Format blog blog "LyXBlogger" "" "" "" "document"') + addToRC(r'\Format blog blog "LyXBlogger" "" "" "" "document" ""') addToRC(r'\converter xhtml blog "python -m lyxblogger $$i" ""') # @@ -718,9 +744,10 @@ def checkConverterEntries(): # checkProg('an OpenDocument -> LaTeX converter', ['w2l -clean $$i'], rc_entry = [ r'\converter odt latex "%%" ""' ]) - # + # Only define a converter to pdf6, otherwise the odt format could be + # used as an intermediate step for export to pdf, which is not wanted. checkProg('an OpenDocument -> PDF converter', ['unoconv -f pdf --stdout $$i > $$o'], - rc_entry = [ r'\converter odt pdf "%%" ""' ]) + rc_entry = [ r'\converter odt pdf6 "%%" ""' ]) # According to http://www.tug.org/applications/tex4ht/mn-commands.html # the command mk4ht oolatex $$i has to be used as default, # but as this would require to have Perl installed, in MiKTeX oolatex is @@ -737,8 +764,8 @@ def checkConverterEntries(): # checkProg('a RTF -> HTML converter', ['unrtf --html $$i > $$o'], rc_entry = [ r'\converter rtf html "%%" ""' ]) - # - checkProg('a PS to PDF converter', ['ps2pdf13 $$i $$o'], + # Do not define a converter to pdf6, ps is a pure export format + checkProg('a PS to PDF converter', ['ps2pdf $$i $$o'], rc_entry = [ r'\converter ps pdf "%%" ""' ]) # checkProg('a PS to TXT converter', ['pstotext $$i > $$o'], @@ -758,9 +785,12 @@ def checkConverterEntries(): # checkProg('a PDF to PS converter', ['pdf2ps $$i $$o', 'pdftops $$i $$o'], rc_entry = [ r'\converter pdf ps "%%" ""' ]) - # + # Only define a converter from pdf6 for graphics checkProg('a PDF to EPS converter', ['pdftops -eps -f 1 -l 1 $$i $$o'], - rc_entry = [ r'\converter pdf eps "%%" ""' ]) + rc_entry = [ r'\converter pdf6 eps "%%" ""' ]) + # + checkProg('a Beamer info extractor', ['makebeamerinfo -p $$i'], + rc_entry = [ r'\converter pdf2 beamer.info "%%" ""' ]) # checkProg('a DVI to TXT converter', ['catdvi $$i > $$o'], rc_entry = [ r'\converter dvi text4 "%%" ""' ]) @@ -783,44 +813,41 @@ def checkConverterEntries(): \converter fig pstex "python -tt $$s/scripts/fig2pstex.py $$i $$o" ""''') # checkProg('a TIFF -> PS converter', ['tiff2ps $$i > $$o'], - rc_entry = [ r'\converter tiff eps "%%" ""', '']) + rc_entry = [ r'\converter tiff eps "%%" ""']) # checkProg('a TGIF -> EPS/PPM converter', ['tgif'], rc_entry = [ r'''\converter tgif eps "tgif -print -color -eps -stdout $$i > $$o" "" \converter tgif png "tgif -print -color -png -o $$d $$i" "" -\converter tgif pdf "tgif -print -color -pdf -stdout $$i > $$o" ""''', - '']) +\converter tgif pdf6 "tgif -print -color -pdf -stdout $$i > $$o" ""''']) # checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'], rc_entry = [ r'\converter wmf eps "%%" ""']) # checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'], rc_entry = [ r'\converter emf eps "%%" ""']) - # + # Only define a converter to pdf6 for graphics checkProg('an EPS -> PDF converter', ['epstopdf'], - rc_entry = [ r'\converter eps pdf "epstopdf --outfile=$$o $$i" ""', '']) + rc_entry = [ r'\converter eps pdf6 "epstopdf --outfile=$$o $$i" ""']) # checkProg('an EPS -> PNG converter', ['convert $$i $$o'], - rc_entry = [ r'\converter eps png "%%" ""', '']) + rc_entry = [ r'\converter eps png "%%" ""']) # - # no agr -> pdf converter, since the pdf library used by gracebat is not + # no agr -> pdf6 converter, since the pdf library used by gracebat is not # free software and therefore not compiled in in many installations. # Fortunately, this is not a big problem, because we will use epstopdf to - # convert from agr to pdf via eps without loss of quality. + # convert from agr to pdf6 via eps without loss of quality. checkProg('a Grace -> Image converter', ['gracebat'], rc_entry = [ r'''\converter agr eps "gracebat -hardcopy -printfile $$o -hdevice EPS $$i 2>/dev/null" "" \converter agr png "gracebat -hardcopy -printfile $$o -hdevice PNG $$i 2>/dev/null" "" \converter agr jpg "gracebat -hardcopy -printfile $$o -hdevice JPEG $$i 2>/dev/null" "" -\converter agr ppm "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 2>/dev/null" ""''', - '']) +\converter agr ppm "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 2>/dev/null" ""''']) # checkProg('a Dot -> Image converter', ['dot'], rc_entry = [ r'''\converter dot eps "dot -Teps $$i -o $$o" "" -\converter dot png "dot -Tpng $$i -o $$o" ""''', - '']) +\converter dot png "dot -Tpng $$i -o $$o" ""''']) # checkProg('a Dia -> PNG converter', ['dia -e $$o -t png $$i'], rc_entry = [ r'\converter dia png "%%" ""']) @@ -833,9 +860,9 @@ def checkConverterEntries(): # odg->png and odg->pdf converters, since the bb would be too large as well. checkProg('an OpenOffice -> EPS converter', ['libreoffice -headless -nologo -convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'], rc_entry = [ r'\converter odg eps2 "%%" ""']) - # + # Only define a converter to pdf6 for graphics checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', 'inkscape --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'], - rc_entry = [ r'\converter svg pdf "%%" ""']) + rc_entry = [ r'\converter svg pdf6 "%%" ""']) # checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', 'inkscape --file=$$i --export-area-drawing --without-gui --export-eps=$$o'], rc_entry = [ r'\converter svg eps "%%" ""']) @@ -848,8 +875,7 @@ def checkConverterEntries(): checkProg('a spreadsheet -> latex converter', ['ssconvert'], rc_entry = [ r'''\converter gnumeric latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" "" \converter oocalc latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" "" -\converter excel latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""''', -'']) +\converter excel latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""''']) path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond']) if (lilypond != ''): @@ -861,13 +887,13 @@ def checkConverterEntries(): if int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 11): addToRC(r'''\converter lilypond eps "lilypond -dbackend=eps -dsafe --ps $$i" "" \converter lilypond png "lilypond -dbackend=eps -dsafe --png $$i" ""''') - addToRC(r'\converter lilypond pdf "lilypond -dbackend=eps -dsafe --pdf $$i" ""') + addToRC(r'\converter lilypond pdf6 "lilypond -dbackend=eps -dsafe --pdf $$i" ""') logger.info('+ found LilyPond version %s.' % version_number) elif int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 6): addToRC(r'''\converter lilypond eps "lilypond -b eps --ps --safe $$i" "" \converter lilypond png "lilypond -b eps --png $$i" ""''') if int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 9): - addToRC(r'\converter lilypond pdf "lilypond -b eps --pdf --safe $$i" ""') + addToRC(r'\converter lilypond pdf6 "lilypond -b eps --pdf --safe $$i" ""') logger.info('+ found LilyPond version %s.' % version_number) else: logger.info('+ found LilyPond, but version %s is too old.' % version_number) @@ -900,7 +926,7 @@ def checkConverterEntries(): logger.info('+ found LilyPond-book, but could not extract version number.') # checkProg('a Noteedit -> LilyPond converter', ['noteedit --export-lilypond $$i'], - rc_entry = [ r'\converter noteedit lilypond "%%" ""', '']) + rc_entry = [ r'\converter noteedit lilypond "%%" ""' ]) # # Currently, lyxpak outputs a gzip compressed tar archive on *nix # and a zip archive on Windows. @@ -944,7 +970,8 @@ def checkDocBook(): path, DOCBOOK = checkProg('SGML-tools 2.x (DocBook), db2x scripts or xsltproc', ['sgmltools', 'db2dvi', 'xsltproc'], rc_entry = [ r'''\converter docbook dvi "sgmltools -b dvi $$i" "" -\converter docbook html "sgmltools -b html $$i" ""''', +\converter docbook html "sgmltools -b html $$i" "" +\converter docbook ps "sgmltools -b ps $$i" ""''', r'''\converter docbook dvi "db2dvi $$i" "" \converter docbook html "db2html $$i" ""''', r'''\converter docbook dvi "" "" @@ -998,17 +1025,29 @@ def checkOtherEntries(): def processLayoutFile(file, bool_docbook): ''' process layout file and get a line of result - Declare lines look like this: (article.layout, scrbook.layout, svjog.layout) + Declare lines look like this: + \DeclareLaTeXClass[]{} + + Optionally, a \DeclareCategory line follows: + + \DeclareCategory{} + + So for example (article.layout, scrbook.layout, svjog.layout) + \DeclareLaTeXClass{article} + \DeclareCategory{Articles} + \DeclareLaTeXClass[scrbook]{book (koma-script)} + \DeclareCategory{Books} + \DeclareLaTeXClass[svjour,svjog.clo]{article (Springer - svjour/jog)} - we expect output: + we'd expect this output: - "article" "article" "article" "false" "article.cls" - "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" - "svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo" + "article" "article" "article" "false" "article.cls" "Articles" + "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" "Books" + "svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo" "" ''' def checkForClassExtension(x): '''if the extension for a latex class is not @@ -1020,8 +1059,12 @@ def processLayoutFile(file, bool_docbook): classname = file.split(os.sep)[-1].split('.')[0] # return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclareLaTeXClass[a,b,c]{article} p = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}') + q = re.compile(r'\DeclareCategory{(.*)}') + classdeclaration = "" + categorydeclaration = '""' for line in open(file).readlines(): res = p.search(line) + qres = q.search(line) if res != None: (classtype, optAll, opt, opt1, desc) = res.groups() avai = {'LaTeX':'false', 'DocBook':bool_docbook}[classtype] @@ -1034,7 +1077,15 @@ def processLayoutFile(file, bool_docbook): prereq_latex = ','.join(prereq_list) prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook] prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype] - return '"%s" "%s" "%s" "%s" "%s"\n' % (classname, opt, desc, avai, prereq) + classdeclaration = '"%s" "%s" "%s" "%s" "%s"' % (classname, opt, desc, avai, prereq) + if categorydeclaration != '""': + return classdeclaration + " " + categorydeclaration + if qres != None: + categorydeclaration = '"%s"' % (qres.groups()[0]) + if classdeclaration != "": + return classdeclaration + " " + categorydeclaration + if classdeclaration != "": + return classdeclaration + " " + categorydeclaration logger.warning("Layout file " + file + " has no \DeclareXXClass line. ") return "" @@ -1083,6 +1134,12 @@ def checkLatexConfig(check_config, bool_docbook): tx.write(retval) tx.close() logger.info('\tdone') + if not os.path.isfile('packages.lst') or not check_config: + logger.info('+generating default list of packages... ') + removeFiles(['packages.lst']) + tx = open('packages.lst', 'w') + tx.close() + logger.info('\tdone') if not check_config: return None # the following will generate textclass.lst.tmp, and packages.lst.tmp @@ -1098,6 +1155,7 @@ def checkLatexConfig(check_config, bool_docbook): # build the list of available layout files and convert it to commands # for chkconfig.ltx declare = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}') + category = re.compile(r'\DeclareCategory{(.*)}') empty = re.compile(r'^\s*$') testclasses = list() for file in glob.glob( os.path.join('layouts', '*.layout') ) + \ @@ -1106,14 +1164,23 @@ def checkLatexConfig(check_config, bool_docbook): if not os.path.isfile(file): continue classname = file.split(os.sep)[-1].split('.')[0] + decline = "" + catline = "" for line in open(file).readlines(): if not empty.match(line) and line[0] != '#': - logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!") - nodeclaration = True + if decline == "": + logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!") + nodeclaration = True + # A class, but no category declaration. Just break. break - if declare.search(line) == None: + if declare.search(line) != None: + decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()) + testclasses.append(decline) + elif category.search(line) != None: + catline = "\\DeclareCategory{%s}{%s}" % (classname, category.search(line).groups()[0]) + testclasses.append(catline) + if catline == "" or decline == "": continue - testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())) break if nodeclaration: continue @@ -1124,20 +1191,21 @@ def checkLatexConfig(check_config, bool_docbook): cl.close() # # we have chklayouts.tex, then process it - ret = 1 - latex_out = cmdOutput(LATEX + ' wrap_chkconfig.ltx') - for line in latex_out.splitlines(): + latex_out = cmdOutput(LATEX + ' wrap_chkconfig.ltx', True) + while True: + line = latex_out.readline() + if not line: + break; if re.match('^\+', line): logger.info(line.strip()) - # return None if the command succeeds - if line == "+Inspection done.": - ret = None + # if the command succeeds, None will be returned + ret = latex_out.close() # # remove the copied file if rmcopy: removeFiles( [ 'chkconfig.ltx' ] ) # - # currently, values in chhkconfig are only used to set + # currently, values in chkconfig are only used to set # \font_encoding values = {} for line in open('chkconfig.vars').readlines(): @@ -1308,6 +1376,17 @@ def checkTeXAllowSpaces(): removeFiles( [ 'a b.tex', 'a b.log', 'texput.log' ]) +def rescanTeXFiles(): + ''' Run kpsewhich to update information about TeX files ''' + logger.info("+Indexing TeX files... ") + if not os.path.isfile( os.path.join(srcdir, 'scripts', 'TeXFiles.py') ): + logger.error("configure: error: cannot find TeXFiles.py script") + sys.exit(1) + tfp = cmdOutput("python -tt " + os.path.join(srcdir, 'scripts', 'TeXFiles.py')) + logger.info(tfp) + logger.info("\tdone") + + def removeTempFiles(): # Final clean-up if not lyx_keep_temps: @@ -1318,11 +1397,13 @@ def removeTempFiles(): if __name__ == '__main__': lyx_check_config = True + lyx_kpsewhich = True outfile = 'lyxrc.defaults' - lyxrc_fileformat = 7 + lyxrc_fileformat = 11 rc_entries = '' lyx_keep_temps = False version_suffix = '' + lyx_binary_dir = '' ## Parse the command line for op in sys.argv[1:]: # default shell/for list is $*, the options if op in [ '-help', '--help', '-h' ]: @@ -1330,16 +1411,22 @@ if __name__ == '__main__': Options: --help show this help lines --keep-temps keep temporary files (for debug. purposes) + --without-kpsewhich do not update TeX files information via kpsewhich --without-latex-config do not run LaTeX to determine configuration --with-version-suffix=suffix suffix of binary installed files + --binary-dir=directory directory of binary installed files ''' sys.exit(0) + elif op == '--without-kpsewhich': + lyx_kpsewhich = False elif op == '--without-latex-config': lyx_check_config = False elif op == '--keep-temps': lyx_keep_temps = True elif op[0:22] == '--with-version-suffix=': # never mind if op is not long enough version_suffix = op[22:] + elif op[0:13] == '--binary-dir=': + lyx_binary_dir = op[13:] else: print "Unknown option", op sys.exit(1) @@ -1378,6 +1465,8 @@ Format %i if windows_style_tex_paths != '': addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths) checkOtherEntries() + if lyx_kpsewhich: + rescanTeXFiles() checkModulesConfig() # --without-latex-config can disable lyx_check_config ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook)