X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=95203fcb6ea0628474806abc3d13090cfdab750d;hb=8ad7b0caead9f58b5ab40626af144adb3d059f01;hp=bda55ddbfe22589278249347d07e6d995e455c1e;hpb=30eb6dfaebe1df2b38bcc4e69302a5ad2c2d1952;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index bda55ddbfe..95203fcb6e 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -494,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 @@ -504,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' @@ -603,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]) @@ -642,7 +651,6 @@ def checkFormatEntries(dtl_tools): \Format r R "R/S code" "" "" "%%" "document,menu=export" "" \Format knitr Rnw "Rnw (knitr)" "" "" "%%" "document,menu=export" "" \Format knitr-ja Rnw "Rnw (knitr, Japanese)" "" "" "%%" "document,menu=export" "" -\Format lilypond ly "LilyPond music" "" "" "%%" "vector" "text/x-lilypond" \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" @@ -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" @@ -980,12 +993,12 @@ def checkConverterEntries(): \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_name], - rc_entry = [ r'\converter svg pdftex "python -tt $$s/scripts/svg2pdftex.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_name], - rc_entry = [ r'\converter svg pstex "python -tt $$s/scripts/svg2pstex.py %% $$i $$o" ""'], + 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'], @@ -997,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'], @@ -1052,17 +1067,20 @@ 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]) @@ -1261,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): @@ -1315,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 @@ -1340,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') @@ -1446,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. @@ -1471,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') @@ -1493,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 @@ -1523,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)) @@ -1574,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. @@ -1599,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') @@ -1617,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 @@ -1647,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: @@ -1665,28 +1683,28 @@ 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(): @@ -1772,7 +1790,7 @@ if __name__ == '__main__': lyx_check_config = True lyx_kpsewhich = True outfile = 'lyxrc.defaults' - lyxrc_fileformat = 22 + lyxrc_fileformat = 24 rc_entries = '' lyx_keep_temps = False version_suffix = '' @@ -1832,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()