]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
* lib/lyx2lyx/lyx_1_4.py:
[lyx.git] / lib / configure.py
index 0ab15c7a800f69614f165bc8f2c2ee1c5fb068a2..7d9c3b91c812c6cf54136e0bb09d5c89affb31a3 100644 (file)
 import sys, os, re, shutil, glob
 
 
+class Tee:
+    ''' Writing to a Tee object will write to all file objects it keeps.
+        That is to say, writing to Tee(sys.stdout, open(logfile, 'w')) will
+        write to sys.stdout as well as a log file.
+    '''
+    def __init__(self, *args):
+        self.files = args
+
+    def write(self, data):
+        for f in self.files:
+            result = f.write(data)
+        return result
+
+    def writelines(self, seq):
+        for i in seq:
+            self.write(i)
+
+
 def writeToFile(filename, lines, append = False):
     " utility function: write or append lines to filename "
     if append:
@@ -165,12 +183,21 @@ def checkViewer(description, progs, rc_entry = [], path = []):
     return checkProg(description, progs, rc_entry, path, not_found = 'auto')
 
 
-def checkLatex():
-    ''' Check latex, return lyx_check_config '''
+def checkDTLtools():
+    ''' Check whether DTL tools are available (Windows only) '''
     # Find programs! Returned path is not used now
     if ((os.name == 'nt' or sys.platform == 'cygwin') and
             checkProg('DVI to DTL converter', ['dv2dt']) != ['', ''] and
             checkProg('DTL to DVI converter', ['dt2dv']) != ['', '']):
+        dtl_tools = True
+    else:
+        dtl_tools = False
+    return dtl_tools
+
+
+def checkLatex(dtl_tools):
+    ''' Check latex, return lyx_check_config '''
+    if dtl_tools:
         # Windows only: DraftDVI
         converter_entry = r'''\converter latex      dvi2       "%%"    "latex"
 \converter dvi2       dvi        "python -tt $$s/scripts/clean_dvi.py $$i $$o" ""'''
@@ -199,16 +226,16 @@ def checkLatex():
     return ''
 
 
-def checkFormatEntries():  
+def checkFormatEntries(dtl_tools):  
     ''' Check all formats (\Format entries) '''
     checkViewer('a Tgif viewer and editor', ['tgif'],
-        rc_entry = [r'\Format tgif       obj     Tgif                   "" "%%"        "%%"    ""'])
+        rc_entry = [r'\Format tgif       obj     Tgif                   "" "%%"        "%%"    "vector"'])
     #
     checkViewer('a FIG viewer and editor', ['xfig'],
-        rc_entry = [r'\Format fig        fig     FIG                    "" "%%"        "%%"    ""'])
+        rc_entry = [r'\Format fig        fig     FIG                    "" "%%"        "%%"    "vector"'])
     #
     checkViewer('a Grace viewer and editor', ['xmgrace'],
-        rc_entry = [r'\Format agr        agr     Grace                  "" "%%"        "%%"    ""'])
+        rc_entry = [r'\Format agr        agr     Grace                  "" "%%"        "%%"    "vector"'])
     #
     checkViewer('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
         rc_entry = [r'\Format fen        fen     FEN                    "" "%%"        "%%"    ""'])
@@ -236,6 +263,7 @@ def checkFormatEntries():
 \Format docbook    sgml    DocBook                B  ""        "%%"    "document"
 \Format docbook-xml xml   "Docbook (XML)"         "" ""        "%%"    "document"
 \Format literate   nw      NoWeb                  N  ""        "%%"    "document"
+\Format lilypond   ly     "LilyPond music"        "" ""        "%%"    "vector"
 \Format latex      tex    "LaTeX (plain)"         L  ""        "%%"    "document"
 \Format linuxdoc   sgml    LinuxDoc               x  ""        "%%"    "document"
 \Format pdflatex   tex    "LaTeX (pdflatex)"      "" ""        "%%"    "document"
@@ -248,22 +276,20 @@ def checkFormatEntries():
     #checkProg('a Postscript interpreter', ['gs'],
     #  rc_entry = [ r'\ps_command "%%"' ])
     checkViewer('a Postscript previewer', ['gv', 'ghostview -swap', 'kghostview'],
-        rc_entry = [r'''\Format eps        eps     EPS                    "" "%%"      ""      ""
-\Format ps         ps      Postscript             t  "%%"      ""      "document"'''])
+        rc_entry = [r'''\Format eps        eps     EPS                    "" "%%"      ""      "vector"
+\Format ps         ps      Postscript             t  "%%"      ""      "document,vector"'''])
     #
     checkViewer('a PDF previewer', ['acrobat', 'acroread', 'gv', 'ghostview', \
                             'xpdf', 'kpdf', 'kghostview'],
-        rc_entry = [r'''\Format pdf        pdf    "PDF (ps2pdf)"          P  "%%"      ""      "document"
-\Format pdf2       pdf    "PDF (pdflatex)"        F  "%%"      ""      "document"
-\Format pdf3       pdf    "PDF (dvipdfm)"         m  "%%"      ""      "document"'''])
+        rc_entry = [r'''\Format pdf        pdf    "PDF (ps2pdf)"          P  "%%"      ""      "document,vector"
+\Format pdf2       pdf    "PDF (pdflatex)"        F  "%%"      ""      "document,vector"
+\Format pdf3       pdf    "PDF (dvipdfm)"         m  "%%"      ""      "document,vector"'''])
     #
     checkViewer('a DVI previewer', ['xdvi', 'kdvi'],
-        rc_entry = [r'\Format dvi        dvi     DVI                    D  "%%"        ""      "document"'])
-    if ((os.name == 'nt' or sys.platform == 'cygwin') and
-            checkProg('DVI to DTL converter', ['dv2dt']) != ['', ''] and
-            checkProg('DTL to DVI converter', ['dt2dv']) != ['', '']):
+        rc_entry = [r'\Format dvi        dvi     DVI                    D  "%%"        ""      "document,vector"'])
+    if dtl_tools:
         # Windows only: DraftDVI
-        addToRC(r'\Format dvi2       dvi     DraftDVI               "" ""      "document"')
+        addToRC(r'\Format dvi2       dvi     DraftDVI               "" ""      "document,vector"')
     #
     checkViewer('a HTML previewer', ['mozilla file://$$p$$i', 'netscape'],
         rc_entry = [r'\Format html       html    HTML                   H  "%%"        ""      "document"'])
@@ -277,8 +303,10 @@ def checkFormatEntries():
 \Format pdftex     pdftex_t PDFTEX                "" ""        ""      ""
 \Format program    ""      Program                "" ""        ""      ""
 \Format pstex      pstex_t PSTEX                  "" ""        ""      ""
-\Format sxw        sxw    "OpenOffice.Org Writer" O  ""        ""      "document"
-\Format word       doc    "MS Word"               W  ""        ""      "document"
+\Format rtf        rtf    "Rich Text Format"      "" ""        ""      "document,vector"
+\Format sxw        sxw    "OpenOffice.Org Writer" O  ""        ""      "document,vector"
+\Format wmf        wmf    "Windows Meta File"     "" ""        ""      "vector"
+\Format word       doc    "MS Word"               W  ""        ""      "document,vector"
 \Format wordhtml   html   "MS Word (HTML)"        "" ""        ""      "document"
 ''')
 
@@ -297,15 +325,12 @@ def checkConverterEntries():
     os.environ["PATH"] = os.path.join('..', 'src', 'tex2lyx') + \
         os.pathsep + path_orig
 
-    checkProg('a LaTeX -> LyX converter', ['tex2lyx -f $$i $$o', \
-        'tex2lyx' +  version_suffix + ' -f $$i $$o' ],
-        rc_entry = [ r'\converter latex      lyx        "%%"   ""' ])
+    checkProg('a LaTeX/Noweb -> LyX converter', ['tex2lyx', 'tex2lyx' + version_suffix],
+        rc_entry = [r'''\converter latex      lyx        "%% -f $$i $$o"       ""
+\converter literate   lyx        "%% -n -f $$i $$o"    ""'''])
 
     os.environ["PATH"] = path_orig
 
-    #
-    checkProg('a Noweb -> LyX converter', ['noweb2lyx' + version_suffix + ' $$i $$o'], path = ['./reLyX'],
-        rc_entry = [ r'\converter literate   lyx        "%%"   ""' ])
     #
     checkProg('a Noweb -> LaTeX converter', ['noweave -delay -index $$i > $$o'],
         rc_entry = [ r'\converter literate   latex      "%%"   ""' ])
@@ -322,8 +347,11 @@ def checkConverterEntries():
     checkProg('an OpenOffice.org -> LaTeX converter', ['w2l -clean $$i'],
         rc_entry = [ r'\converter sxw        latex      "%%"   ""' ])
     #
-    checkProg('an LaTeX -> OpenOffice.org LaTeX converter', ['oolatex $$i', 'oolatex.sh $$i'],
+    checkProg('a LaTeX -> OpenOffice.org converter', ['oolatex $$i', 'oolatex.sh $$i'],
         rc_entry = [ r'\converter latex      sxw        "%%"   "latex"' ])
+    # On windows it is called latex2rt.exe
+    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 PS to PDF converter', ['ps2pdf13 $$i $$o'],
         rc_entry = [ r'\converter ps         pdf        "%%"   ""' ])
@@ -370,6 +398,9 @@ def checkConverterEntries():
 \converter tgif       pdf        "tgif -stdout -print -color -pdf $$i > $$o"   ""''',
             ''])
     #
+    checkProg('a WMF -> EPS converter', ['wmf2eps -o $$o $$i'],
+        rc_entry = [ r'\converter wmf        eps        "%%"   ""', ''])
+    #
     checkProg('a EPS -> PDF converter', ['epstopdf'],
         rc_entry = [ r'\converter eps        pdf        "epstopdf --outfile=$$o $$i"   ""', ''])
     #
@@ -385,6 +416,24 @@ def checkConverterEntries():
         'latex2html -no_subdir -split 0 -show_section_numbers $$i', 'hevea -s $$i'],
         rc_entry = [ r'\converter latex      html       "%%"   "originaldir,needaux"' ])
     #
+    path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
+    if (lilypond != ''):
+        version_string = cmdOutput("lilypond --version")
+        match = re.match('GNU LilyPond (\S+)', version_string)
+        if match:
+            version_number = match.groups()[0]
+            version = version_number.split('.')
+            if 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 $$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 $$i"     ""')
+                print '+  found LilyPond version %s.' % version_number
+            else:
+                print '+  found LilyPond, but version %s is too old.' % version_number
+        else:
+            print '+  found LilyPond, but could not extract version number.'
+    #
     # FIXME: no rc_entry? comment it out
     # checkProg('Image converter', ['convert $$i $$o'])
     #
@@ -481,7 +530,7 @@ def processLayoutFile(file, bool_docbook, bool_linuxdoc):
     '''
     classname = file.split(os.sep)[-1].split('.')[0]
     # return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclearLaTeXClass[a,b,c]{article}
-    p = re.compile(r'\Declare(LaTeX|DocBook|LinuxDoc)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
+    p = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
     for line in open(file).readlines():
         res = p.search(line)
         if res != None:
@@ -508,7 +557,7 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
 # 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
-# for some reason. Run ./configure if you need to update it after a
+# for some reason. Run ./configure.py if you need to update it after a
 # configuration change.
 ''')
         # build the list of available layout files and convert it to commands
@@ -543,7 +592,7 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
         # Construct the list of classes to test for.
         # build the list of available layout files and convert it to commands
         # for chkconfig.ltx
-        p1 = re.compile(r'\Declare(LaTeX|DocBook|LinuxDoc)Class')
+        p1 = re.compile(r'\Declare(LaTeX|DocBook)Class')
         testclasses = list()
         for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
             glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) :
@@ -603,7 +652,7 @@ def createLaTeXConfig():
         writeToFile('packages.lst', '''
 ### This file should contain the list of LaTeX packages that have been
 ### recognized by LyX. Unfortunately, since configure could not find
-### your LaTeX2e program, the tests have not been run. Run ./configure
+### your LaTeX2e program, the tests have not been run. Run ./configure.py
 ### if you need to update it after a configuration change.
 ''')
     print 'creating doc/LaTeXConfig.lyx'
@@ -678,6 +727,7 @@ if __name__ == '__main__':
     rc_entries = ''
     lyx_keep_temps = False
     version_suffix = ''
+    logfile = 'configure.log'
     ## Parse the command line
     for op in sys.argv[1:]:   # default shell/for list is $*, the options
         if op in [ '-help', '--help', '-h' ]:
@@ -698,7 +748,11 @@ Options:
         else:
             print "Unknown option", op
             sys.exit(1)
-    #    
+    #
+    # set up log file for stdout and stderr
+    log = open(logfile, 'w')
+    sys.stdout = Tee(sys.stdout, log)
+    sys.stderr = Tee(sys.stderr, log)
     # check if we run from the right directory
     srcdir = os.path.dirname(sys.argv[0])
     if srcdir == '':
@@ -709,17 +763,18 @@ Options:
     setEnviron()
     createDirectories()
     windows_style_tex_paths = checkTeXPaths()
+    dtl_tools = checkDTLtools()
     ## Write the first part of outfile
     writeToFile(outfile, '''# This file has been automatically generated by LyX' lib/configure.py
 # script. It contains default settings that have been determined by
 # examining your system. PLEASE DO NOT MODIFY ANYTHING HERE! If you
-# want to customize LyX, make a copy of the file LYXDIR/lyxrc as
-# ~/.lyx/lyxrc and edit this file instead. Any setting in lyxrc will
+# want to customize LyX, use LyX' Preferences dialog or modify directly 
+# the "preferences" file instead. Any setting in that file will
 # override the values given here.
 ''')
     # check latex
-    LATEX = checkLatex()
-    checkFormatEntries()
+    LATEX = checkLatex(dtl_tools)
+    checkFormatEntries(dtl_tools)
     checkConverterEntries()
     (chk_linuxdoc, bool_linuxdoc, linuxdoc_cmd) = checkLinuxDoc()
     (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()