X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=95203fcb6ea0628474806abc3d13090cfdab750d;hb=0984e113171297e402c88ce048e9ccf1fb3d3619;hp=e43e1b5774e83f6eb61aa464ea240eb0a4cba99a;hpb=a53847964dc44d15f7c83cc65dbc16fef88d54c9;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index e43e1b5774..95203fcb6e 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -196,19 +196,16 @@ def checkTeXPaths(): from tempfile import mkstemp fd, tmpfname = mkstemp(suffix='.ltx') if os.name == 'nt': - from locale import getdefaultlocale - language, encoding = getdefaultlocale() - if encoding == None: - encoding = 'latin1' + encoding = sys.getfilesystemencoding() if sys.version_info[0] < 3: inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/') else: - inpname = shortPath(str(tmpfname, encoding)).replace('\\', '/') + inpname = shortPath(tmpfname).replace('\\', '/') else: inpname = cmdOutput('cygpath -m ' + tmpfname) logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname)) inpname = inpname.replace('~', '\\string~') - os.write(fd, r'\relax') + os.write(fd, b'\\relax') os.close(fd) latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}\makeatletter\@@end"' % inpname) @@ -497,7 +494,16 @@ def checkDTLtools(): def checkInkscape(): ''' Check whether Inkscape is available and return the full path (Windows only) ''' - if os.name != 'nt': + ''' On Mac OS (darwin) a wrapper is used - therefore the version is checked ''' + ''' The answer of the real inkscape is validated and a fake binary used if this fails ''' + if sys.platform == 'darwin': + version_string = cmdOutput("inkscape --version") + match = re.match('^Inkscape', version_string) + if match: + return 'inkscape' + else: + return 'inkscape-binary' + elif os.name != 'nt': return 'inkscape' if sys.version_info[0] < 3: import _winreg as winreg @@ -507,12 +513,12 @@ def checkInkscape(): try: aKey = winreg.OpenKey(aReg, r"inkscape.svg\DefaultIcon") val = winreg.QueryValueEx(aKey, "") - return str(val[0]).split('"')[1].replace('.exe', '') + return str(val[0]).split('"')[1] except EnvironmentError: try: aKey = winreg.OpenKey(aReg, r"Applications\inkscape.exe\shell\open\command") val = winreg.QueryValueEx(aKey, "") - return str(val[0]).split('"')[1].replace('.exe', '') + return str(val[0]).split('"')[1] except EnvironmentError: return 'inkscape' @@ -606,7 +612,7 @@ def checkFormatEntries(dtl_tools): checkViewerEditor('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'], rc_entry = [r'\Format fen fen FEN "" "%%" "%%" "" ""']) # - checkViewerEditor('a SVG viewer and editor', [inkscape_name], + checkViewerEditor('a SVG viewer and editor', [inkscape_gui], rc_entry = [r'''\Format svg "svg" SVG "" "%%" "%%" "vector" "image/svg+xml" \Format svgz "svgz" "SVG (compressed)" "" "%%" "%%" "vector,zipped=native" ""'''], path = [inkscape_path]) @@ -641,10 +647,12 @@ def checkFormatEntries(dtl_tools): \Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document,menu=export" "" \Format literate nw NoWeb N "" "%%" "document,menu=export" "" \Format sweave Rnw "Sweave" S "" "%%" "document,menu=export" "" +\Format sweave-ja Rnw "Sweave (Japanese)" S "" "%%" "document,menu=export" "" \Format r R "R/S code" "" "" "%%" "document,menu=export" "" \Format knitr Rnw "Rnw (knitr)" "" "" "%%" "document,menu=export" "" -\Format lilypond ly "LilyPond music" "" "" "%%" "vector" "text/x-lilypond" +\Format knitr-ja Rnw "Rnw (knitr, Japanese)" "" "" "%%" "document,menu=export" "" \Format lilypond-book lytex "LilyPond book (LaTeX)" "" "" "%%" "document,menu=export" "" +\Format lilypond-book-ja lytex "LilyPond book (pLaTeX)" "" "" "%%" "document,menu=export" "" \Format latex tex "LaTeX (plain)" L "" "%%" "document,menu=export" "text/x-tex" \Format luatex tex "LaTeX (LuaTeX)" "" "" "%%" "document,menu=export" "" \Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document,menu=export" "" @@ -656,6 +664,11 @@ def checkFormatEntries(dtl_tools): \Format text4 txt "Plain text (catdvi)" "" "" "%%" "document" "" \Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document" "" \Format beamer.info pdf.info "Info (Beamer)" "" "" "%%" "document,menu=export" ""''' ]) + #Lilypond files have special editors, but fall back to plain text editors + checkViewerEditor('a lilypond editor', + ['frescobaldi', 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', + 'nedit', 'gedit', 'geany', 'leafpad', 'mousepad', 'xed', 'notepad'], + rc_entry = [r'''\Format lilypond ly "LilyPond music" "" "" "%%" "vector" "text/x-lilypond"''' ]) #Spreadsheets using ssconvert from gnumeric checkViewer('gnumeric spreadsheet software', ['gnumeric'], rc_entry = [r'''\Format gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document" "application/x-gnumeric" @@ -796,6 +809,7 @@ def checkConverterEntries(): 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 "%%" "needauth" \converter sweave pdflatex "%%" "needauth" +\converter sweave-ja platex "%%" "needauth" \converter sweave xetex "%%" "needauth" \converter sweave luatex "%%" "needauth" \converter sweave dviluatex "%%" "needauth"''']) @@ -803,15 +817,18 @@ def checkConverterEntries(): checkProg('a knitr -> LaTeX converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxknitr.R $$p$$i $$p$$o $$e $$r'], rc_entry = [r'''\converter knitr latex "%%" "needauth" \converter knitr pdflatex "%%" "needauth" +\converter knitr-ja platex "%%" "needauth" \converter knitr xetex "%%" "needauth" \converter knitr luatex "%%" "needauth" \converter knitr dviluatex "%%" "needauth"''']) # 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 "%%" "needauth"' ]) + rc_entry = [ r'\converter sweave r "%%" "needauth"', + r'\converter sweave-ja r "%%" "needauth"' ]) # 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 "%%" "needauth"' ]) + rc_entry = [ r'\converter knitr r "%%" "needauth"', + r'\converter knitr-ja r "%%" "needauth"' ]) # checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex', 'htmltolatex -input $$i -output $$o', 'htmltolatex.jar -input $$i -output $$o'], @@ -928,6 +945,14 @@ def checkConverterEntries(): # 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 pdf6 eps "%%" ""' ]) + # Define a converter from pdf6 to png for Macs where pdftops is missing. + # The converter utility sips allows to force the dimensions of the resulting + # png image. The value of 800 pixel for the width is arbitrary and not + # related to the current screen resolution or width. + # There is no converter parameter for this information. + checkProg('a PDF to PNG converter', + ['sips --resampleWidth 800 --setProperty format png $$i --out $$o'], + rc_entry = [ r'\converter pdf6 png "%%" ""' ]) # Create one converter for a PDF produced using TeX fonts and one for a # PDF produced using non-TeX fonts. This does not produce non-unique # conversion paths, since a given document either uses TeX fonts or not. @@ -965,11 +990,17 @@ def checkConverterEntries(): \converter fig ppm "fig2dev -L ppm $$i $$o" "" \converter fig svg "fig2dev -L svg $$i $$o" "" \converter fig png "fig2dev -L png $$i $$o" "" -\converter svg pdftex "python -tt $$s/scripts/svg2pdftex.py $$i $$o" "" -\converter svg pstex "python -tt $$s/scripts/svg2pstex.py $$i $$o" "" \converter fig pdftex "python -tt $$s/scripts/fig2pdftex.py $$i $$o" "" \converter fig pstex "python -tt $$s/scripts/fig2pstex.py $$i $$o" ""''') # + checkProg('a SVG -> PDFTeX converter', [inkscape_cl], + rc_entry = [ r'\converter svg pdftex "python -tt $$s/scripts/svg2pdftex.py %% $$p$$i $$p$$o" ""'], + path = [inkscape_path]) + # + checkProg('a SVG -> PSTeX converter', [inkscape_cl], + rc_entry = [ r'\converter svg pstex "python -tt $$s/scripts/svg2pstex.py %% $$p$$i $$p$$o" ""'], + path = [inkscape_path]) + # checkProg('a TIFF -> PS converter', ['tiff2ps $$i > $$o'], rc_entry = [ r'\converter tiff eps "%%" ""']) # @@ -979,16 +1010,18 @@ def checkConverterEntries(): \converter tgif png "tgif -print -color -png -o $$d $$i" "" \converter tgif pdf6 "tgif -print -color -pdf -stdout $$i > $$o" ""''']) # - checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'], + checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o' + % (inkscape_fileprefix, inkscape_fileprefix)], rc_entry = [ r'\converter wmf eps "%%" ""']) # - checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'], + checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o' + % (inkscape_fileprefix, inkscape_fileprefix)], rc_entry = [ r'\converter emf eps "%%" ""']) # - checkProg('a WMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'], + checkProg('a WMF -> PDF converter', [inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o' % (inkscape_fileprefix, inkscape_fileprefix)], rc_entry = [ r'\converter wmf pdf6 "%%" ""']) # - checkProg('an EMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'], + checkProg('an EMF -> PDF converter', [inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o' % (inkscape_fileprefix, inkscape_fileprefix)], rc_entry = [ r'\converter emf pdf6 "%%" ""']) # Only define a converter to pdf6 for graphics checkProg('an EPS -> PDF converter', ['epstopdf'], @@ -1024,7 +1057,7 @@ def checkConverterEntries(): # The eps2->eps converter then fixes the bounding box by cropping. # Although unoconv can convert to png and pdf as well, do not define # odg->png and odg->pdf converters, since the bb would be too large as well. - checkProg('an OpenDocument -> EPS converter', ['libreoffice -headless -nologo -convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'], + checkProg('an OpenDocument -> EPS converter', ['libreoffice --headless --nologo --convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'], rc_entry = [ r'\converter odg eps2 "%%" ""']) # checkProg('a SVG (compressed) -> SVG converter', ['gunzip -c $$i > $$o'], @@ -1034,21 +1067,27 @@ def checkConverterEntries(): rc_entry = [ r'\converter svg svgz "%%" ""']) # Only define a converter to pdf6 for graphics # Prefer rsvg-convert over inkscape since it is faster (see http://www.lyx.org/trac/ticket/9891) - checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'], + checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o' + % (inkscape_fileprefix, inkscape_fileprefix)], rc_entry = [ r'''\converter svg pdf6 "%%" "" \converter svgz pdf6 "%%" ""'''], path = ['', inkscape_path]) # - checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'], + checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o' + % (inkscape_fileprefix, inkscape_fileprefix)], rc_entry = [ r'''\converter svg eps "%%" "" \converter svgz eps "%%" ""'''], path = ['', inkscape_path]) # - checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', inkscape_name + ' --without-gui --file=$$i --export-png=$$o'], + checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', inkscape_cl + ' --without-gui --file=%s$$i --export-png=%s$$o' + % (inkscape_fileprefix, inkscape_fileprefix)], rc_entry = [ r'''\converter svg png "%%" "", \converter svgz png "%%" ""'''], path = ['', inkscape_path]) - + # + checkProg('Gnuplot', ['gnuplot'], + rc_entry = [ r'''\Format gnuplot "gp, gnuplot" "Gnuplot" "" "" "" "vector" "text/plain" +\converter gnuplot pdf6 "python -tt $$s/scripts/gnuplot2pdf.py $$i $$o" "needauth"''' ]) # # gnumeric/xls/ods to tex checkProg('a spreadsheet -> latex converter', ['ssconvert'], @@ -1102,6 +1141,7 @@ def checkConverterEntries(): # this, use different output folders for eps and pdf outputs. addToRC(r'\converter lilypond-book latex "lilypond-book --safe --lily-output-dir=ly-eps $$i" ""') addToRC(r'\converter lilypond-book pdflatex "lilypond-book --safe --pdf --latex-program=pdflatex --lily-output-dir=ly-pdf $$i" ""') + addToRC(r'\converter lilypond-book-ja platex "lilypond-book --safe --pdf --latex-program=platex --lily-output-dir=ly-pdf $$i" ""') addToRC(r'\converter lilypond-book xetex "lilypond-book --safe --pdf --latex-program=xelatex --lily-output-dir=ly-pdf $$i" ""') addToRC(r'\converter lilypond-book luatex "lilypond-book --safe --pdf --latex-program=lualatex --lily-output-dir=ly-pdf $$i" ""') addToRC(r'\converter lilypond-book dviluatex "lilypond-book --safe --latex-program=dvilualatex --lily-output-dir=ly-eps $$i" ""') @@ -1195,6 +1235,8 @@ def checkOtherEntries(): 'splitindex.class'], rc_entry = [ r'\splitindex_command "%%"' ]) checkProg('a nomenclature processor', ['makeindex'], rc_entry = [ r'\nomencl_command "makeindex -s nomencl.ist"' ]) + checkProg('a python-pygments driver command', ['pygmentize'], + rc_entry = [ r'\pygmentize_command "%%"' ]) ## FIXME: OCTAVE is not used anywhere # path, OCTAVE = checkProg('Octave', ['octave']) ## FIXME: MAPLE is not used anywhere @@ -1237,43 +1279,43 @@ def processLayoutFile(file, bool_docbook): def checkForClassExtension(x): '''if the extension for a latex class is not provided, add .cls to the classname''' - if not '.' in x: - return x.strip() + '.cls' + if not b'.' in x: + return x.strip() + b'.cls' else: return x.strip() 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'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$') - q = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$') - classdeclaration = "" - categorydeclaration = '""' - for line in open(file).readlines(): + p = re.compile(b'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$') + q = re.compile(b'^\s*#\s*\\DeclareCategory{(.*)}\s*$') + classdeclaration = b"" + categorydeclaration = b'""' + for line in open(file, 'rb').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] + avai = {b'LaTeX':b'false', b'DocBook':bool_docbook.encode('ascii')}[classtype] if opt == None: - opt = classname - prereq_latex = checkForClassExtension(classname) + opt = classname.encode('ascii') + prereq_latex = checkForClassExtension(classname.encode('ascii')) else: - prereq_list = optAll[1:-1].split(',') + prereq_list = optAll[1:-1].split(b',') prereq_list = list(map(checkForClassExtension, prereq_list)) - prereq_latex = ','.join(prereq_list) - prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook] - prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype] - classdeclaration = ('"%s" "%s" "%s" "%s" "%s"' + prereq_latex = b','.join(prereq_list) + prereq_docbook = {'true':b'', 'false':b'docbook'}[bool_docbook] + prereq = {b'LaTeX':prereq_latex, b'DocBook':prereq_docbook}[classtype] + classdeclaration = (b'"%s" "%s" "%s" "%s" "%s"' % (classname, opt, desc, avai, prereq)) - if categorydeclaration != '""': - return classdeclaration + " " + categorydeclaration + if categorydeclaration != b'""': + return classdeclaration + b" " + categorydeclaration if qres != None: - categorydeclaration = '"%s"' % (qres.groups()[0]) - if classdeclaration != "": - return classdeclaration + " " + categorydeclaration - if classdeclaration != "": - return classdeclaration + " " + categorydeclaration + categorydeclaration = b'"%s"' % (qres.groups()[0]) + if classdeclaration != b"": + return classdeclaration + b" " + categorydeclaration + if classdeclaration != b"": + return classdeclaration + b" " + categorydeclaration logger.warning("Layout file " + file + " has no \DeclareXXClass line. ") - return "" + return b"" def checkLatexConfig(check_config, bool_docbook): @@ -1291,8 +1333,8 @@ def checkLatexConfig(check_config, bool_docbook): # fails, we still have something to start lyx. logger.info(msg + ' default values') logger.info('+checking list of textclasses... ') - tx = open('textclass.lst', 'w') - tx.write(''' + tx = open('textclass.lst', 'wb') + tx.write(b''' # This file declares layouts and their associated definition files # (include dir. relative to the place where this file is). # It contains only default values, since chkconfig.ltx could not be run @@ -1316,7 +1358,7 @@ def checkLatexConfig(check_config, bool_docbook): if foundClasses.count(cleanclass) == 0: # not found before foundClasses.append(cleanclass) retval = processLayoutFile(file, bool_docbook) - if retval != "": + if retval != b"": tx.write(retval) tx.close() logger.info('\tdone') @@ -1340,9 +1382,9 @@ def checkLatexConfig(check_config, bool_docbook): # Construct the list of classes to test for. # build the list of available layout files and convert it to commands # for chkconfig.ltx - declare = re.compile(r'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$') - category = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$') - empty = re.compile(r'^\s*$') + declare = re.compile(b'^\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$') + category = re.compile(b'^\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$') + empty = re.compile(b'^\\s*$') testclasses = list() for file in (glob.glob( os.path.join('layouts', '*.layout') ) + glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ): @@ -1350,32 +1392,34 @@ 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] != '#': - if decline == "": + decline = b"" + catline = b"" + for line in open(file, 'rb').readlines(): + if not empty.match(line) and line[0] != b'#'[0]: + if decline == b"": logger.warning("Failed to find valid \Declare line " "for layout file `%s'.\n\t=> Skipping this file!" % file) nodeclaration = True # A class, but no category declaration. Just break. break if declare.search(line) != None: - decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()) + decline = b"\\TestDocClass{%s}{%s}" \ + % (classname.encode('ascii'), line[1:].strip()) testclasses.append(decline) elif category.search(line) != None: - catline = ("\\DeclareCategory{%s}{%s}" - % (classname, category.search(line).groups()[0])) + catline = (b"\\DeclareCategory{%s}{%s}" + % (classname.encode('ascii'), + category.search(line).groups()[0])) testclasses.append(catline) - if catline == "" or decline == "": + if catline == b"" or decline == b"": continue break if nodeclaration: continue testclasses.sort() - cl = open('chklayouts.tex', 'w') + cl = open('chklayouts.tex', 'wb') for line in testclasses: - cl.write(line + '\n') + cl.write(line + b'\n') cl.close() # # we have chklayouts.tex, then process it @@ -1420,8 +1464,8 @@ def checkModulesConfig(): removeFiles(['lyxmodules.lst', 'chkmodules.tex']) logger.info('+checking list of modules... ') - tx = open('lyxmodules.lst', 'w') - tx.write('''## This file declares modules and their associated definition files. + tx = open('lyxmodules.lst', 'wb') + tx.write(b'''## This file declares modules and their associated definition files. ## It has been automatically generated by configure ## Use "Options/Reconfigure" if you need to update it after a ## configuration change. @@ -1445,8 +1489,8 @@ def checkModulesConfig(): continue seen.append(filename) - retval = processModuleFile(file, filename, bool_docbook) - if retval != "": + retval = processModuleFile(file, filename.encode('ascii'), bool_docbook) + if retval != b"": tx.write(retval) tx.close() logger.info('\tdone') @@ -1467,25 +1511,25 @@ def processModuleFile(file, filename, bool_docbook): We expect output: "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category" ''' - remods = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') - rereqs = re.compile(r'#+\s*Requires: (.*)') - reexcs = re.compile(r'#+\s*Excludes: (.*)') - recaty = re.compile(r'#+\s*Category: (.*)') - redbeg = re.compile(r'#+\s*DescriptionBegin\s*$') - redend = re.compile(r'#+\s*DescriptionEnd\s*$') - - modname = desc = pkgs = req = excl = catgy = "" + remods = re.compile(b'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') + rereqs = re.compile(b'#+\s*Requires: (.*)') + reexcs = re.compile(b'#+\s*Excludes: (.*)') + recaty = re.compile(b'#+\s*Category: (.*)') + redbeg = re.compile(b'#+\s*DescriptionBegin\s*$') + redend = re.compile(b'#+\s*DescriptionEnd\s*$') + + modname = desc = pkgs = req = excl = catgy = b"" readingDescription = False descLines = [] - for line in open(file).readlines(): + for line in open(file, 'rb').readlines(): if readingDescription: res = redend.search(line) if res != None: readingDescription = False - desc = " ".join(descLines) + desc = b" ".join(descLines) # Escape quotes. - desc = desc.replace('"', '\\"') + desc = desc.replace(b'"', b'\\"') continue descLines.append(line[1:].strip()) continue @@ -1497,50 +1541,50 @@ def processModuleFile(file, filename, bool_docbook): if res != None: (pkgs, modname) = res.groups() if pkgs == None: - pkgs = "" + pkgs = b"" else: - tmp = [s.strip() for s in pkgs.split(",")] - pkgs = ",".join(tmp) + tmp = [s.strip() for s in pkgs.split(b",")] + pkgs = b",".join(tmp) continue res = rereqs.search(line) if res != None: req = res.group(1) - tmp = [s.strip() for s in req.split("|")] - req = "|".join(tmp) + tmp = [s.strip() for s in req.split(b"|")] + req = b"|".join(tmp) continue res = reexcs.search(line) if res != None: excl = res.group(1) - tmp = [s.strip() for s in excl.split("|")] - excl = "|".join(tmp) + tmp = [s.strip() for s in excl.split(b"|")] + excl = b"|".join(tmp) continue res = recaty.search(line) if res != None: catgy = res.group(1) continue - if modname == "": + if modname == b"": logger.warning("Module file without \DeclareLyXModule line. ") - return "" + return b"" - if pkgs != "": + if pkgs != b"": # this module has some latex dependencies: # append the dependencies to chkmodules.tex, # which is \input'ed by chkconfig.ltx testpackages = list() - for pkg in pkgs.split(","): - if "->" in pkg: + for pkg in pkgs.split(b","): + if b"->" in pkg: # this is a converter dependency: skip continue - if pkg.endswith(".sty"): + if pkg.endswith(b".sty"): pkg = pkg[:-4] - testpackages.append("\\TestPackage{%s}" % (pkg,)) + testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),)) cm = open('chkmodules.tex', 'a') for line in testpackages: cm.write(line + '\n') cm.close() - return ('"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' + return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy)) @@ -1548,8 +1592,8 @@ def checkCiteEnginesConfig(): removeFiles(['lyxciteengines.lst', 'chkciteengines.tex']) logger.info('+checking list of cite engines... ') - tx = open('lyxciteengines.lst', 'w') - tx.write('''## This file declares cite engines and their associated definition files. + tx = open('lyxciteengines.lst', 'wb') + tx.write(b'''## This file declares cite engines and their associated definition files. ## It has been automatically generated by configure ## Use "Options/Reconfigure" if you need to update it after a ## configuration change. @@ -1573,8 +1617,8 @@ def checkCiteEnginesConfig(): continue seen.append(filename) - retval = processCiteEngineFile(file, filename, bool_docbook) - if retval != "": + retval = processCiteEngineFile(file, filename.encode('ascii'), bool_docbook) + if retval != b"": tx.write(retval) tx.close() logger.info('\tdone') @@ -1591,25 +1635,25 @@ def processCiteEngineFile(file, filename, bool_docbook): We expect output: "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages" ''' - remods = re.compile(r'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}') - redbeg = re.compile(r'#+\s*DescriptionBegin\s*$') - redend = re.compile(r'#+\s*DescriptionEnd\s*$') - recet = re.compile(r'\s*CiteEngineType\s*(.*)') - redb = re.compile(r'\s*DefaultBiblio\s*(.*)') - resfm = re.compile(r'\s*CiteFramework\s*(.*)') + remods = re.compile(b'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}') + redbeg = re.compile(b'#+\s*DescriptionBegin\s*$') + redend = re.compile(b'#+\s*DescriptionEnd\s*$') + recet = re.compile(b'\s*CiteEngineType\s*(.*)') + redb = re.compile(b'\s*DefaultBiblio\s*(.*)') + resfm = re.compile(b'\s*CiteFramework\s*(.*)') modname = desc = pkgs = cet = db = cfm = "" readingDescription = False descLines = [] - for line in open(file).readlines(): + for line in open(file, 'rb').readlines(): if readingDescription: res = redend.search(line) if res != None: readingDescription = False - desc = " ".join(descLines) + desc = b" ".join(descLines) # Escape quotes. - desc = desc.replace('"', '\\"') + desc = desc.replace(b'"', b'\\"') continue descLines.append(line[1:].strip()) continue @@ -1621,10 +1665,10 @@ def processCiteEngineFile(file, filename, bool_docbook): if res != None: (pkgs, modname) = res.groups() if pkgs == None: - pkgs = "" + pkgs = b"" else: - tmp = [s.strip() for s in pkgs.split(",")] - pkgs = ",".join(tmp) + tmp = [s.strip() for s in pkgs.split(b",")] + pkgs = b",".join(tmp) continue res = recet.search(line) if res != None: @@ -1639,28 +1683,61 @@ def processCiteEngineFile(file, filename, bool_docbook): cfm = res.group(1) continue - if modname == "": + if modname == b"": logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ") - return "" + return b"" - if pkgs != "": + if pkgs != b"": # this cite engine has some latex dependencies: # append the dependencies to chkciteengines.tex, # which is \input'ed by chkconfig.ltx testpackages = list() - for pkg in pkgs.split(","): - if "->" in pkg: + for pkg in pkgs.split(b","): + if b"->" in pkg: # this is a converter dependency: skip continue - if pkg.endswith(".sty"): + if pkg.endswith(b".sty"): pkg = pkg[:-4] - testpackages.append("\\TestPackage{%s}" % (pkg,)) + testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),)) cm = open('chkciteengines.tex', 'a') for line in testpackages: cm.write(line + '\n') cm.close() - return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, db, desc, pkgs) + return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, db, desc, pkgs)) + + +def checkXTemplates(): + removeFiles(['xtemplates.lst']) + + logger.info('+checking list of external templates... ') + tx = open('xtemplates.lst', 'w') + tx.write('''## This file lists external templates. +## It has been automatically generated by configure +## Use "Options/Reconfigure" if you need to update it after a +## configuration change. +''') + + # build the list of available templates + seen = [] + # note that this searches the local directory first, then the + # system directory. that way, we pick up the user's version first. + for file in glob.glob( os.path.join('xtemplates', '*.xtemplate') ) + \ + glob.glob( os.path.join(srcdir, 'xtemplates', '*.xtemplate' ) ) : + # valid file? + logger.info(file) + if not os.path.isfile(file): + continue + + filename = file.split(os.sep)[-1] + if seen.count(filename): + continue + + seen.append(filename) + if filename != "": + tx.write(filename + "\n") + tx.close() + logger.info('\tdone') def checkTeXAllowSpaces(): @@ -1713,7 +1790,7 @@ if __name__ == '__main__': lyx_check_config = True lyx_kpsewhich = True outfile = 'lyxrc.defaults' - lyxrc_fileformat = 21 + lyxrc_fileformat = 24 rc_entries = '' lyx_keep_temps = False version_suffix = '' @@ -1773,7 +1850,17 @@ Format %i # check java and perl before any checkProg that may require them java = checkProg('a java interpreter', ['java'])[1] perl = checkProg('a perl interpreter', ['perl'])[1] - (inkscape_path, inkscape_name) = os.path.split(checkInkscape()) + (inkscape_path, inkscape_gui) = os.path.split(checkInkscape()) + # On Windows, we need to call the "inkscape.com" wrapper + # for command line purposes. Other OSes do not differentiate. + inkscape_cl = inkscape_gui + if os.name == 'nt': + inkscape_cl = inkscape_gui.replace('.exe', '.com') + # On MacOSX, Inkscape requires full path file arguments. This + # is not needed on Linux and Win and even breaks the latter. + inkscape_fileprefix = "" + if sys.platform == 'darwin': + inkscape_fileprefix = "$$p" checkFormatEntries(dtl_tools) checkConverterEntries() (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook() @@ -1786,6 +1873,7 @@ Format %i rescanTeXFiles() checkModulesConfig() checkCiteEnginesConfig() + checkXTemplates() # --without-latex-config can disable lyx_check_config ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook) removeTempFiles()