]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
Check path of Qt tools if qtchooser is detected
[lyx.git] / lib / configure.py
index 9a817c8ea0600139f1cfdbdeacdef8c3bac57662..a8515f30e6ed5c4dccd2851becd2107b80414336 100644 (file)
@@ -8,6 +8,7 @@
 # \author Bo Peng
 # Full author contact details are available in file CREDITS.
 
+from __future__ import print_function
 import glob, logging, os, re, shutil, subprocess, sys, stat
 
 # set up logging
@@ -65,7 +66,10 @@ def cmdOutput(cmd, async = False):
     '''
     if os.name == 'nt':
         b = False
-        cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd
+        if sys.version_info[0] < 3:
+            cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd
+        else:
+            cmd = 'cmd /d /c pushd ' + shortPath(os.getcwd()) + '&' + cmd
     else:
         b = True
     pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, \
@@ -117,13 +121,12 @@ def copy_tree(src, dst, preserve_symlinks=False, level=0):
     '''
  
     if not os.path.isdir(src):
-        raise FileError, \
-              "cannot copy tree '%s': not a directory" % src
+        raise FileError("cannot copy tree '%s': not a directory" % src)
     try:
         names = os.listdir(src)
-    except os.error, (errno, errstr):
-        raise FileError, \
-              "error listing files in '%s': %s" % (src, errstr)
+    except os.error as oserror:
+        (errno, errstr) = oserror.args
+        raise FileError("error listing files in '%s': %s" % (src, errstr))
  
     if not os.path.isdir(dst):
         os.makedirs(dst)
@@ -166,7 +169,7 @@ def checkUpgrade():
             logger.debug('previous = ' + previous)
             if os.path.isdir( previous ):
                 logger.info('Found directory "%s".', previous)
-                copy_tree( previous, cwd )
+                copy_tree( previous, cwd, True )
                 logger.info('Content copied to directory "%s".', cwd)
                 return
 
@@ -197,7 +200,10 @@ def checkTeXPaths():
             language, encoding = getdefaultlocale()
             if encoding == None:
                 encoding = 'latin1'
-            inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
+            if sys.version_info[0] < 3:
+                inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
+            else:
+                inpname = shortPath(str(tmpfname, encoding)).replace('\\', '/')
         else:
             inpname = cmdOutput('cygpath -m ' + tmpfname)
         logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname))
@@ -229,7 +235,7 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
             for searching but the whole string is used to replace
             %% for a rc_entry. So, feel free to add '$$i' etc for programs.
 
-        path: additional pathes
+        path: additional paths (will be prepended to the program name)
 
         rc_entry: entry to outfile, can be
             1. emtpy: no rc entry will be added
@@ -250,6 +256,11 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
         sys.exit(2)
     logger.info('checking for ' + description + '...')
     ## print '(' + ','.join(progs) + ')',
+    additional_path = path
+    path = os.environ["PATH"].split(os.pathsep) + additional_path
+    extlist = ['']
+    if "PATHEXT" in os.environ:
+        extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
     global java, perl
     for idx in range(len(progs)):
         # ac_prog may have options, ac_word is the command name
@@ -260,10 +271,6 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
         if ac_word.endswith('.pl') and perl == '':
             continue
         msg = '+checking for "' + ac_word + '"... '
-        path = os.environ["PATH"].split(os.pathsep) + path
-        extlist = ['']
-        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
@@ -277,6 +284,8 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
                         ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, os.path.join(ac_dir, ac_word)))
                     elif ac_word.endswith('.pl'):
                         ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"' % (perl, os.path.join(ac_dir, ac_word)))
+                    elif ac_dir in additional_path:
+                        ac_prog = ac_prog.replace(ac_word, r'\"%s\"' % (os.path.join(ac_dir, ac_word)))
                     # write rc entries for this command
                     if len(rc_entry) == 1:
                         addToRC(rc_entry[0].replace('%%', ac_prog))
@@ -302,6 +311,11 @@ def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [],
         sys.exit(2)
     logger.info('checking for ' + description + '...')
     ## print '(' + ','.join(progs) + ')',
+    additional_path = path
+    path = os.environ["PATH"].split(os.pathsep) + additional_path
+    extlist = ['']
+    if "PATHEXT" in os.environ:
+        extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
     found_prime = False
     real_ac_dir = ''
     real_ac_word = not_found
@@ -315,10 +329,6 @@ def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [],
         if ac_word.endswith('.pl') and perl == '':
             continue
         msg = '+checking for "' + ac_word + '"... '
-        path = os.environ["PATH"].split(os.pathsep) + path
-        extlist = ['']
-        if "PATHEXT" in os.environ:
-            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):
@@ -335,6 +345,8 @@ def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [],
                         ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, os.path.join(ac_dir, ac_word)))
                     elif ac_word.endswith('.pl'):
                         ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"' % (perl, os.path.join(ac_dir, ac_word)))
+                    elif ac_dir in additional_path:
+                        ac_prog = ac_prog.replace(ac_word, r'\"%s\"' % (os.path.join(ac_dir, ac_word)))
                     # write rc entries for this command
                     if found_prime == False:
                         if len(rc_entry) == 1:
@@ -387,7 +399,7 @@ def addAlternatives(rcs, alt_type):
     if isinstance(alt_type, str):
         alt_tokens = [alt_token % alt_type]
     else:
-        alt_tokens = map(lambda s: alt_token % s, alt_type)
+        alt_tokens = [alt_token % s for s in alt_type]
     for idxx in range(len(rcs)):
         if len(rcs) == 1:
             m = r.match(rcs[0])
@@ -466,6 +478,26 @@ def checkDTLtools():
         dtl_tools = False
     return dtl_tools
 
+def checkInkscape():
+    ''' Check whether Inkscape is available and return the full path (Windows only) '''
+    if os.name != 'nt':
+        return 'inkscape'
+    if sys.version_info[0] < 3:
+        import _winreg as winreg
+    else:
+        import winreg
+    aReg = winreg.ConnectRegistry(None, winreg.HKEY_CLASSES_ROOT)
+    try:
+        aKey = winreg.OpenKey(aReg, r"inkscape.svg\DefaultIcon")
+        val = winreg.QueryValueEx(aKey, "")
+        return str(val[0]).split('"')[1].replace('.exe', '')
+    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', '')
+        except EnvironmentError:
+            return 'inkscape'
 
 def checkLatex(dtl_tools):
     ''' Check latex, return lyx_check_config '''
@@ -516,37 +548,13 @@ def checkLatex(dtl_tools):
 
 
 def checkLuatex():
-    ''' Check if luatex is there and usable '''
+    ''' Check if luatex is there '''
     path, LUATEX = checkProg('LuaTeX', ['lualatex $$i'])
     path, DVILUATEX = checkProg('LuaTeX (DVI)', ['dvilualatex $$i'])
     if LUATEX != '':
-    # luatex binary is there
-        msg = "checking if LuaTeX is usable ..."
-        # Check if luatex is usable
-        writeToFile('luatest.tex', r'''
-\nonstopmode
-\documentclass{minimal}
-\usepackage{fontspec}
-\begin{document}
-.
-\end{document}
-''')
-        # run lualatex on luatest.tex and check result
-        luatest = cmdOutput(LUATEX + ' luatest.tex')
-        if luatest.find('XeTeX is required to compile this document') != -1:
-            # fontspec/luatex too old! We do not support this version.
-            logger.info(msg + ' no (probably not recent enough)')
-        elif luatest.find('! LaTeX Error: File `fontspec.sty\' not found') != -1:
-            # fontspec missing
-            logger.info(msg + ' no (missing fontspec)')
-        else:
-            # working luatex
-            logger.info(msg + ' yes')
-            addToRC(r'\converter luatex      pdf5       "%s"   "latex=lualatex"' % LUATEX)
-            if DVILUATEX != '':
-                addToRC(r'\converter luatex      dvi3        "%s"      "latex=dvilualatex"' % DVILUATEX)
-        # remove temporary files
-        removeFiles(['luatest.tex', 'luatest.log', 'luatest.aux', 'luatest.pdf'])
+        addToRC(r'\converter luatex      pdf5       "%s"       "latex=lualatex"' % LUATEX)
+    if DVILUATEX != '':
+        addToRC(r'\converter dviluatex   dvi3        "%s"      "latex=dvilualatex"' % DVILUATEX)
 
 
 def checkModule(module):
@@ -581,8 +589,10 @@ 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'],
-        rc_entry = [r'\Format svg        "svg, svgz" SVG                "" "%%" "%%"   "vector,zipped=native"  "image/svg+xml"'])
+    checkViewerEditor('a SVG viewer and editor', [inkscape_name],
+        rc_entry = [r'''\Format svg        "svg" SVG                "" "%%" "%%"       "vector"        "image/svg+xml"
+\Format svgz       "svgz" "SVG (compressed)" "" "%%" "%%"      "vector,zipped=native"  ""'''],
+        path = [inkscape_path])
     #
     imageformats = r'''\Format bmp        bmp     BMP                    "" "%s"       "%s"    ""      "image/x-bmp"
 \Format gif        gif     GIF                    "" "%s"      "%s"    ""      "image/gif"
@@ -602,9 +612,6 @@ def checkFormatEntries(dtl_tools):
     checkViewerEditor('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
         '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)"   "" ""   "%%"    ""      ""
-\Format dateout    tmp    "date (output)"         "" ""        "%%"    ""      ""
 \Format docbook    sgml    DocBook                B  ""        "%%"    "document,menu=export"  ""
 \Format docbook-xml xml   "DocBook (XML)"         "" ""        "%%"    "document,menu=export"  "application/docbook+xml"
 \Format dot        dot    "Graphviz Dot"          "" ""        "%%"    "vector"        "text/vnd.graphviz"
@@ -678,16 +685,18 @@ def checkFormatEntries(dtl_tools):
         rc_entry = [r'\Format noteedit   not     Noteedit               "" "%%"        "%%"    "vector"        ""'])
     #
     checkViewerEditor('an OpenDocument viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
-        rc_entry = [r'''\Format odt        odt     "OpenDocument"  "" "%%"     "%%"    "document,vector,menu=export"   "application/vnd.oasis.opendocument.text"
+        rc_entry = [r'''\Format odt        odt     "OpenDocument (tex4ht)"  "" "%%"    "%%"    "document,vector,menu=export"   "application/vnd.oasis.opendocument.text"
+\Format odt2       odt    "OpenDocument (eLyXer)"  "" "%%"     "%%"    "document,vector,menu=export"   "application/vnd.oasis.opendocument.text"
+\Format odt3       odt    "OpenDocument (Pandoc)"  "" "%%"     "%%"    "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', '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"'''])
+\Format word       doc    "MS Word"               W  "%%"      "%%"    "document,vector,menu=export"   "application/msword"
+\Format word2      docx    "MS Word Office Open XML"               O  "%%"     "%%"    "document,vector,menu=export"   "application/vnd.openxmlformats-officedocument.wordprocessingml.document"'''])
     #
     # entries that do not need checkProg
-    addToRC(r'''\Format date       ""     "date command"          "" ""        ""      ""      ""
-\Format csv        csv    "Table (CSV)"           "" ""        ""      "document"      "text/csv"
+    addToRC(r'''\Format csv        csv    "Table (CSV)"           "" ""        ""      "document"      "text/csv"
 \Format fax        ""      Fax                    "" ""        ""      "document"      ""
 \Format lyx        lyx     LyX                    "" ""        ""      ""      "application/x-lyx"
 \Format lyx13x     13.lyx "LyX 1.3.x"             "" ""        ""      "document"      ""
@@ -695,7 +704,8 @@ def checkFormatEntries(dtl_tools):
 \Format lyx15x     15.lyx "LyX 1.5.x"             "" ""        ""      "document"      ""
 \Format lyx16x     16.lyx "LyX 1.6.x"             "" ""        ""      "document"      ""
 \Format lyx20x     20.lyx "LyX 2.0.x"             "" ""        ""      "document"      ""
-\Format lyx21x     21.lyx "LyX 2.1.x"             "" ""        ""      "document,menu=export"  ""
+\Format lyx21x     21.lyx "LyX 2.1.x"             "" ""        ""      "document"      ""
+\Format lyx22x     22.lyx "LyX 2.2.x"             "" ""        ""      "document,menu=export"  ""
 \Format clyx       cjklyx "CJK LyX 1.4.x (big5)"  "" ""        ""      "document"      ""
 \Format jlyx       cjklyx "CJK LyX 1.4.x (euc-jp)" "" ""       ""      "document"      ""
 \Format klyx       cjklyx "CJK LyX 1.4.x (euc-kr)" "" ""       ""      "document"      ""
@@ -779,11 +789,17 @@ def checkConverterEntries():
 
     # eLyXer: search as an executable (elyxer.py, elyxer)
     path, elyxer = checkProg('a LyX -> HTML converter',
-        ['elyxer.py --nofooter --directory $$r $$i $$o'],
+        ['elyxer.py --nofooter --directory $$r $$i $$o', 'elyxer --nofooter --directory $$r $$i $$o'],
         rc_entry = [ r'\converter lyx      html       "%%"     ""' ])
     path, elyxer = checkProg('a LyX -> HTML (MS Word) converter',
-        ['elyxer.py --nofooter --html --directory $$r $$i $$o'],
+        ['elyxer.py --nofooter --html --directory $$r $$i $$o', 'elyxer --nofooter --html --directory $$r $$i $$o'],
         rc_entry = [ r'\converter lyx      wordhtml       "%%" ""' ])
+    path, elyxer = checkProg('a LyX -> OpenDocument (eLyXer) converter',
+        ['elyxer.py --html --nofooter --unicode --directory $$r $$i $$o', 'elyxer --html --nofooter --unicode --directory $$r $$i $$o'],
+        rc_entry = [ r'\converter lyx      odt2       "%%"     ""' ])
+    path, elyxer = checkProg('a LyX -> Word converter',
+        ['elyxer.py --html --nofooter --unicode --directory $$r $$i $$o', 'elyxer --html --nofooter --unicode --directory $$r $$i $$o'],
+        rc_entry = [ r'\converter lyx      word      "%%"      ""' ])
     if elyxer.find('elyxer') >= 0:
       addToRC(r'''\copier    html       "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
       addToRC(r'''\copier    wordhtml       "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
@@ -820,6 +836,12 @@ def checkConverterEntries():
     #
     checkProg('an OpenDocument -> LaTeX converter', ['w2l -clean $$i'],
         rc_entry = [ r'\converter odt        latex      "%%"   ""' ])
+    #
+    checkProg('an Open Document (Pandoc) -> LaTeX converter', ['pandoc -s -f odt -o $$o -t latex $$i'],
+        rc_entry = [ r'\converter odt3        latex      "%%"  ""' ])
+    #
+    checkProg('a MS Word Office Open XML converter -> LaTeX', ['pandoc -s -f docx -o $$o -t latex $$i'],
+        rc_entry = [ r'\converter word2      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'],
@@ -830,7 +852,7 @@ def checkConverterEntries():
     # directly available as application.
     # On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/
     # Both SuSE and debian have oolatex
-    checkProg('a LaTeX -> Open Document converter', [
+    checkProg('a LaTeX -> Open Document (tex4ht) converter', [
         'oolatex $$i', 'mk4ht oolatex $$i', 'oolatex.sh $$i', '/usr/share/tex4ht/oolatex $$i',
         'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\''],
         rc_entry = [ r'\converter latex      odt        "%%"   "needaux"' ])
@@ -838,6 +860,12 @@ def checkConverterEntries():
     checkProg('a LaTeX -> RTF converter', ['latex2rtf -p -S -o $$o $$i', 'latex2rt -p -S -o $$o $$i'],
         rc_entry = [ r'\converter latex      rtf        "%%"   "needaux"' ])
     #
+    checkProg('a LaTeX -> Open Document (Pandoc) converter', ['pandoc -s -f latex -o $$o -t odt $$i'],
+        rc_entry = [ r'\converter latex      odt3        "%%"  ""' ])
+    #
+    checkProg('a LaTeX -> MS Word Office Open XML converter', ['pandoc -s -f latex -o $$o -t docx $$i'],
+        rc_entry = [ r'\converter latex      word2       "%%"  ""' ])
+    #
     checkProg('a RTF -> HTML converter', ['unrtf --html  $$i > $$o'],
         rc_entry = [ r'\converter rtf      html        "%%"    ""' ])
     # Do not define a converter to pdf6, ps is a pure export format 
@@ -859,7 +887,7 @@ def checkConverterEntries():
     checkProg('a PS to EPS converter', ['ps2eps -- < $$i > $$o'],
         rc_entry = [ r'\converter eps2       eps      "%%"     ""' ])
     #
-    checkProg('a PDF to PS converter', ['pdf2ps $$i $$o', 'pdftops $$i $$o'],
+    checkProg('a PDF to PS converter', ['pdftops $$i $$o', 'pdf2ps $$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'],
@@ -912,16 +940,22 @@ 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'],
+    checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
         rc_entry = [ r'\converter wmf        eps        "%%"   ""'])
     #
-    checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'],
+    checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
         rc_entry = [ r'\converter emf        eps        "%%"   ""'])
+    #
+    checkProg('a WMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
+        rc_entry = [ r'\converter wmf        pdf6        "%%"  ""'])
+    #
+    checkProg('an EMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
+        rc_entry = [ r'\converter emf        pdf6        "%%"  ""'])
     # Only define a converter to pdf6 for graphics
     checkProg('an EPS -> PDF converter', ['epstopdf'],
         rc_entry = [ r'\converter eps        pdf6       "epstopdf --outfile=$$o $$i"   ""'])
     #
-    checkProg('an EPS -> PNG converter', ['convert $$i $$o'],
+    checkProg('an EPS -> PNG converter', ['magick $$i $$o', 'convert $$i $$o'],
         rc_entry = [ r'\converter eps        png        "%%"   ""'])
     #
     # no agr -> pdf6 converter, since the pdf library used by gracebat is not
@@ -951,15 +985,28 @@ def checkConverterEntries():
     # 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'],
         rc_entry = [ r'\converter odg        eps2       "%%"   ""'])
+    #
+    checkProg('a SVG (compressed) -> SVG converter', ['gunzip -c $$i > $$o'],
+        rc_entry = [ r'\converter svgz       svg        "%%"   ""'])
+    #
+    checkProg('a SVG -> SVG (compressed) converter', ['gzip -c $$i > $$o'],
+        rc_entry = [ r'\converter svg        svgz       "%%"   ""'])
     # 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        pdf6       "%%"   ""'])
+    # 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'],
+        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 --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
-        rc_entry = [ r'\converter svg        eps        "%%"   ""'])
+    checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
+        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 --without-gui --file=$$i --export-png=$$o'],
-        rc_entry = [ r'\converter svg        png        "%%"   ""'])
+    checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', inkscape_name + ' --without-gui --file=$$i --export-png=$$o'],
+        rc_entry = [ r'''\converter svg        png        "%%"    "",
+\converter svgz       png        "%%"    ""'''],
+        path = ['', inkscape_path])
 
     #
     # gnumeric/xls/ods to tex
@@ -1037,21 +1084,21 @@ def checkConverterEntries():
     # Entries that do not need checkProg
     addToRC(r'''
 \converter csv        lyx        "python -tt $$s/scripts/csv2lyx.py $$i $$o"   ""
-\converter date       dateout    "python -tt $$s/scripts/date.py %d-%m-%Y > $$o"       ""
 \converter docbook    docbook-xml "cp $$i $$o" "xml"
 \converter fen        asciichess "python -tt $$s/scripts/fen2ascii.py $$i $$o" ""
-\converter lyx        lyx13x     "python -tt $$s/lyx2lyx/lyx2lyx -t 221 $$i > $$o"     ""
-\converter lyx        lyx14x     "python -tt $$s/lyx2lyx/lyx2lyx -t 245 $$i > $$o"     ""
-\converter lyx        lyx15x     "python -tt $$s/lyx2lyx/lyx2lyx -t 276 $$i > $$o"     ""
-\converter lyx        lyx16x     "python -tt $$s/lyx2lyx/lyx2lyx -t 345 $$i > $$o"     ""
-\converter lyx        lyx20x     "python -tt $$s/lyx2lyx/lyx2lyx -t 413 $$i > $$o"     ""
-\converter lyx        lyx21x     "python -tt $$s/lyx2lyx/lyx2lyx -t 474 $$i > $$o"     ""
-\converter lyx        clyx       "python -tt $$s/lyx2lyx/lyx2lyx -c big5 -t 245 $$i > $$o"     ""
-\converter lyx        jlyx       "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp -t 245 $$i > $$o"   ""
-\converter lyx        klyx       "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr -t 245 $$i > $$o"   ""
-\converter clyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c big5 $$i > $$o"    ""
-\converter jlyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp $$i > $$o"  ""
-\converter klyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr $$i > $$o"  ""
+\converter lyx        lyx13x     "python -tt $$s/lyx2lyx/lyx2lyx -V 1.3 -o $$o $$i"    ""
+\converter lyx        lyx14x     "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o $$i"    ""
+\converter lyx        lyx15x     "python -tt $$s/lyx2lyx/lyx2lyx -V 1.5 -o $$o $$i"    ""
+\converter lyx        lyx16x     "python -tt $$s/lyx2lyx/lyx2lyx -V 1.6 -o $$o $$i"    ""
+\converter lyx        lyx20x     "python -tt $$s/lyx2lyx/lyx2lyx -V 2.0 -o $$o $$i"    ""
+\converter lyx        lyx21x     "python -tt $$s/lyx2lyx/lyx2lyx -V 2.1 -o $$o $$i"    ""
+\converter lyx        lyx22x     "python -tt $$s/lyx2lyx/lyx2lyx -V 2.2 -o $$o $$i"    ""
+\converter lyx        clyx       "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c big5   $$i"  ""
+\converter lyx        jlyx       "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c euc_jp $$i"  ""
+\converter lyx        klyx       "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c euc_kr $$i"  ""
+\converter clyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c big5   -o $$o $$i" ""
+\converter jlyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp -o $$o $$i" ""
+\converter klyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr -o $$o $$i" ""
 \converter lyxpreview png        "python -tt $$s/scripts/lyxpreview2bitmap.py --png"   ""
 \converter lyxpreview ppm        "python -tt $$s/scripts/lyxpreview2bitmap.py --ppm"   ""
 ''')
@@ -1143,8 +1190,8 @@ def processLayoutFile(file, bool_docbook):
             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'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
-    q = re.compile(r'\DeclareCategory{(.*)}')
+    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():
@@ -1158,7 +1205,7 @@ def processLayoutFile(file, bool_docbook):
                 prereq_latex = checkForClassExtension(classname)
             else:
                 prereq_list = optAll[1:-1].split(',')
-                prereq_list = map(checkForClassExtension, prereq_list)
+                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]
@@ -1239,8 +1286,8 @@ 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'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
-    category = re.compile(r'\DeclareCategory{(.*)}')
+    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*$')
     testclasses = list()
     for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
@@ -1467,7 +1514,10 @@ def rescanTeXFiles():
     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') + '"')
+    interpreter = sys.executable
+    if interpreter == '':
+        interpreter = "python"
+    tfp = cmdOutput(interpreter + " -tt " + '"' + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"')
     logger.info(tfp)
     logger.info("\tdone")
 
@@ -1492,7 +1542,7 @@ if __name__ == '__main__':
     ## Parse the command line
     for op in sys.argv[1:]:   # default shell/for list is $*, the options
         if op in [ '-help', '--help', '-h' ]:
-            print '''Usage: configure [options]
+            print('''Usage: configure [options]
 Options:
     --help                   show this help lines
     --keep-temps             keep temporary files (for debug. purposes)
@@ -1500,7 +1550,7 @@ Options:
     --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
@@ -1513,7 +1563,7 @@ Options:
         elif op[0:13] == '--binary-dir=':
             lyx_binary_dir = op[13:]
         else:
-            print "Unknown option", op
+            print("Unknown option %s" % op)
             sys.exit(1)
     #
     # check if we run from the right directory
@@ -1544,6 +1594,7 @@ 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())
     checkFormatEntries(dtl_tools)
     checkConverterEntries()
     (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()