]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
start XeTeX support.
[lyx.git] / lib / configure.py
index 86bb78a5279ec751b971f03b6d763832a92cc50b..aff725605a23a322831e7ffe0bf269df52045cc5 100644 (file)
@@ -8,26 +8,21 @@
 # \author Bo Peng
 # Full author contact details are available in file CREDITS.
 
-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)
+import sys, os, re, shutil, glob, logging
 
+# set up logging
+logging.basicConfig(level = logging.DEBUG,
+    format = '%(levelname)s: %(message)s', # ignore application name
+    filename = 'configure.log',
+    filemode = 'w')
+#
+# Add a handler to log to console
+console = logging.StreamHandler()
+console.setLevel(logging.INFO) # the console only print out general information
+formatter = logging.Formatter('%(message)s') # only print out the message itself
+console.setFormatter(formatter)
+logger = logging.getLogger('LyX')
+logger.addHandler(console)
 
 def writeToFile(filename, lines, append = False):
     " utility function: write or append lines to filename "
@@ -45,6 +40,7 @@ def addToRC(lines):
     '''
     if lines.strip() != '':
         writeToFile(outfile, lines + '\n', append = True)
+        logger.debug('Add to RC:\n' + lines + '\n\n')
 
 
 def removeFiles(filenames):
@@ -54,7 +50,9 @@ def removeFiles(filenames):
     for file in filenames:
         try:
             os.remove(file)
+            logger.debug('Removing file %s' % file)
         except:
+            logger.debug('Failed to remove file %s' % file)
             pass
 
 
@@ -73,7 +71,7 @@ def setEnviron():
         NLS nuisances.
         Only set these to C if already set.  These must not be set unconditionally
         because not all systems understand e.g. LANG=C (notably SCO).
-        Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+        Fixing LC_MESSAGES prevents Solaris sh from translating var values in set!
         Non-C LC_CTYPE values break the ctype check.
     '''
     os.environ['LANG'] = os.getenv('LANG', 'C')
@@ -89,8 +87,9 @@ def createDirectories():
         if not os.path.isdir( dir ):
             try:
                 os.mkdir( dir)
+                logger.debug('Create directory %s.' % dir)
             except:
-                print "Failed to create directory ", dir
+                logger.error('Failed to create directory %s.' % dir)
                 sys.exit(1)
 
 
@@ -110,10 +109,10 @@ def checkTeXPaths():
         os.close(fd)
         latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}"' % inpname)
         if 'Error' in latex_out:
-            print "configure: TeX engine needs posix-style paths in latex files"
+            logger.warning("configure: TeX engine needs posix-style paths in latex files")
             windows_style_tex_paths = 'false'
         else:
-            print "configure: TeX engine needs windows-style paths in latex files"
+            logger.info("configure: TeX engine needs windows-style paths in latex files")
             windows_style_tex_paths = 'true'
         removeFiles([tmpfname, logname, 'texput.log'])
     return windows_style_tex_paths
@@ -148,15 +147,15 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
     '''
     # one rc entry for each progs plus not_found entry
     if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
-        print "rc entry should have one item or item for each prog and not_found."
+        logger.error("rc entry should have one item or item for each prog and not_found.")
         sys.exit(2)
-    print 'checking for ' + description + '...'
+    logger.info('checking for ' + description + '...')
     ## print '(' + ','.join(progs) + ')',
     for idx in range(len(progs)):
         # ac_prog may have options, ac_word is the command name
         ac_prog = progs[idx]
         ac_word = ac_prog.split(' ')[0]
-        print '+checking for "' + ac_word + '"... ',
+        msg = '+checking for "' + ac_word + '"... '
         path = os.environ["PATH"].split(os.pathsep) + path
         extlist = ['']
         if os.environ.has_key("PATHEXT"):
@@ -164,7 +163,7 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
         for ac_dir in path:
             for ext in extlist:
                 if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
-                    print ' yes'
+                    logger.info(msg + ' yes')
                     # write rc entries for this command
                     if len(rc_entry) == 1:
                         addToRC(rc_entry[0].replace('%%', ac_prog))
@@ -172,7 +171,7 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
                         addToRC(rc_entry[idx].replace('%%', ac_prog))
                     return [ac_dir, ac_word]
         # if not successful
-        print ' no'
+        logger.info(msg + ' no')
     # write rc entries for 'not found'
     if len(rc_entry) > 0:  # the last one.
         addToRC(rc_entry[-1].replace('%%', not_found))
@@ -202,19 +201,20 @@ def checkLatex(dtl_tools):
     path, PPLATEX = checkProg('a DVI postprocessing program', ['pplatex $$i'])
     #-----------------------------------------------------------------
     path, PLATEX = checkProg('pLaTeX, the Japanese LaTeX', ['platex $$i'])
-    # check if PLATEX is pLaTeX2e
-    writeToFile('chklatex.ltx', '''
+    if PLATEX != '':
+        # check if PLATEX is pLaTeX2e
+        writeToFile('chklatex.ltx', '''
 \\nonstopmode
 \\@@end
 ''')
-    # run platex on chklatex.ltx and check result
-    if cmdOutput(PLATEX + ' chklatex.ltx').find('pLaTeX2e') != -1:
-        # We have the Japanese pLaTeX2e
-        addToRC(r'\converter platex   dvi       "%s"   "latex"' % PLATEX)
-        LATEX = PLATEX
-    else:
-        PLATEX = ''
-    removeFiles(['chklatex.ltx', 'chklatex.log'])
+        # run platex on chklatex.ltx and check result
+        if cmdOutput(PLATEX + ' chklatex.ltx').find('pLaTeX2e') != -1:
+            # We have the Japanese pLaTeX2e
+            addToRC(r'\converter platex   dvi       "%s"   "latex"' % PLATEX)
+            LATEX = PLATEX
+        else:
+            PLATEX = ''
+            removeFiles(['chklatex.ltx', 'chklatex.log'])
     #-----------------------------------------------------------------
     # use LATEX to convert from latex to dvi if PPLATEX is not available    
     if PPLATEX == '':
@@ -240,7 +240,7 @@ def checkLatex(dtl_tools):
             # valid latex2e
             return LATEX
         else:
-            print "Latex not usable (not LaTeX2e) "
+            logger.warning("Latex not usable (not LaTeX2e) ")
         # remove temporary files
         removeFiles(['chklatex.ltx', 'chklatex.log'])
     return ''
@@ -254,6 +254,9 @@ def checkFormatEntries(dtl_tools):
     checkViewer('a FIG viewer and editor', ['xfig', 'jfig3-itext.jar', 'jfig3.jar'],
         rc_entry = [r'\Format fig        fig     FIG                    "" "%%"        "%%"    "vector"'])
     #
+    checkViewer('a Dia viewer and editor', ['dia'],
+        rc_entry = [r'\Format dia        dia     DIA                    "" "%%"        "%%"    "vector"'])
+    #
     checkViewer('a Grace viewer and editor', ['xmgrace'],
         rc_entry = [r'\Format agr        agr     Grace                  "" "%%"        "%%"    "vector"'])
     #
@@ -287,8 +290,8 @@ def checkFormatEntries(dtl_tools):
 \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"
+\Format xetex      tex    "LaTeX (XeTeX)"         "" ""        "%%"    "document"
 \Format text       txt    "Plain text"            a  ""        "%%"    "document"
 \Format text2      txt    "Plain text (pstotext)" "" ""        "%%"    "document"
 \Format text3      txt    "Plain text (ps2ascii)" "" ""        "%%"    "document"
@@ -312,7 +315,8 @@ def checkFormatEntries(dtl_tools):
                    'gv', 'ghostview'],
         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"'''])
+\Format pdf3       pdf    "PDF (dvipdfm)"         m  "%%"      ""      "document,vector"
+\Format pdf4       pdf    "PDF (XeTeX)"           X  "%%"      ""      "document,vector"'''])
     #
     checkViewer('a DVI previewer', ['xdvi', 'kdvi'],
         rc_entry = [r'\Format dvi        dvi     DVI                    D  "%%"        ""      "document,vector"'])
@@ -337,6 +341,7 @@ def checkFormatEntries(dtl_tools):
 \Format lyx13x     lyx13  "LyX 1.3.x"             "" ""        ""      "document"
 \Format lyx14x     lyx14  "LyX 1.4.x"             "" ""        ""      "document"
 \Format lyx15x     lyx15  "LyX 1.5.x"             "" ""        ""      "document"
+\Format lyx16x     lyx16  "LyX 1.6.x"             "" ""        ""      "document"
 \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"
@@ -358,6 +363,9 @@ def checkConverterEntries():
     ''' Check all converters (\converter entries) '''
     checkProg('the pdflatex program', ['pdflatex $$i'],
         rc_entry = [ r'\converter pdflatex   pdf2       "%%"   "latex"' ])
+
+    checkProg('XeTeX', ['xelatex $$i'],
+        rc_entry = [ r'\converter xetex      pdf4       "%%"   "latex"' ])
     
     ''' If we're running LyX in-place then tex2lyx will be found in
             ../src/tex2lyx. Add this directory to the PATH temporarily and
@@ -408,10 +416,15 @@ def checkConverterEntries():
     #
     checkProg('an OpenDocument -> LaTeX converter', ['w2l -clean $$i'],
         rc_entry = [ r'\converter odt        latex      "%%"   ""' ])
+    # According to http://www.tug.org/applications/tex4ht/mn-commands.html
+    # the command mk4ht oolatex $$i has to be used as default,
+    # but as this would require to have Perl installed, in MiKTeX oolatex is
+    # 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', [
-        'oolatex $$i', 'oolatex.sh $$i', '/usr/share/tex4ht/oolatex $$i'],
+        '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"' ])
     # On windows it is called latex2rt.exe
     checkProg('a LaTeX -> RTF converter', ['latex2rtf -p -S -o $$o $$i', 'latex2rt -p -S -o $$o $$i'],
@@ -468,10 +481,9 @@ def checkConverterEntries():
     #
     checkProg('a TGIF -> EPS/PPM converter', ['tgif'],
         rc_entry = [
-            r'''\converter tgif       eps        "tgif -stdout -print -color -eps $$i > $$o"   ""
-\converter tgif       ppm        "tgif -stdout -print -color -ppm $$i > $$o"   ""
-\converter tgif       png        "tgif -stdout -print -color -png $$i > $$o"   ""
-\converter tgif       pdf        "tgif -stdout -print -color -pdf $$i > $$o"   ""''',
+            r'''\converter tgif       eps        "tgif -print -color -eps -stdout $$i > $$o"   ""
+\converter tgif       png        "tgif -print -color -png -o $$d $$i"  ""
+\converter tgif       pdf        "tgif -print -color -pdf -stdout $$i > $$o"   ""''',
             ''])
     #
     checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'],
@@ -498,6 +510,12 @@ def checkConverterEntries():
     checkProg('a Dot -> PDF converter', ['dot -Tpdf $$i -o $$o'],
         rc_entry = [ r'\converter dot        pdf        "%%"   ""'])
     #
+    checkProg('a Dia -> PNG converter', ['dia -e $$o -t png $$i'],
+        rc_entry = [ r'\converter dia        png        "%%"   ""'])
+    #
+    checkProg('a Dia -> EPS converter', ['dia -e $$o -t eps $$i'],
+        rc_entry = [ r'\converter dia        eps        "%%"   ""'])
+    #
     #
     path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond'])
     if (lilypond != ''):
@@ -506,16 +524,21 @@ def checkConverterEntries():
         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):
+            if int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 11):
+                addToRC(r'''\converter lilypond   eps        "lilypond -dbackend=eps --ps $$i" ""
+\converter lilypond   png        "lilypond -dbackend=eps --png $$i"    ""''')
+                addToRC(r'\converter lilypond   pdf        "lilypond -dbackend=eps --pdf $$i"  ""')
+                print '+  found LilyPond version %s.' % version_number
+            elif int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 6):
                 addToRC(r'''\converter lilypond   eps        "lilypond -b eps --ps $$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
+                logger.info('+  found LilyPond version %s.' % version_number)
             else:
-                print '+  found LilyPond, but version %s is too old.' % version_number
+                logger.info('+  found LilyPond, but version %s is too old.' % version_number)
         else:
-            print '+  found LilyPond, but could not extract version number.'
+            logger.info('+  found LilyPond, but could not extract version number.')
     #
     checkProg('a Noteedit -> LilyPond converter', ['noteedit --export-lilypond $$i'],
         rc_entry = [ r'\converter noteedit   lilypond   "%%"   ""', ''])
@@ -535,6 +558,7 @@ def checkConverterEntries():
 \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        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"   ""
@@ -544,34 +568,17 @@ def checkConverterEntries():
 ''')
 
 
-def checkLinuxDoc():
-    ''' Check linuxdoc '''
-    #
-    path, LINUXDOC = checkProg('SGML-tools 1.x (LinuxDoc)', ['sgml2lyx'],
-        rc_entry = [
-        r'''\converter linuxdoc   lyx        "sgml2lyx $$i"    ""
-\converter linuxdoc   latex      "sgml2latex $$i"      ""
-\converter linuxdoc   dvi        "sgml2latex -o dvi $$i"       ""
-\converter linuxdoc   html       "sgml2html $$i"       ""''',
-        r'''\converter linuxdoc   lyx        ""        ""
-\converter linuxdoc   latex      ""    ""
-\converter linuxdoc   dvi        ""    ""
-\converter linuxdoc   html       ""    ""''' ])
-    if LINUXDOC != '':
-        return ('yes', 'true', '\\def\\haslinuxdoc{yes}')
-    else:
-        return ('no', 'false', '')
-
-
 def checkDocBook():
     ''' Check docbook '''
-    path, DOCBOOK = checkProg('SGML-tools 2.x (DocBook) or db2x scripts', ['sgmltools', 'db2dvi'],
+    path, DOCBOOK = checkProg('SGML-tools 2.x (DocBook), db2x scripts or xsltproc', ['sgmltools', 'db2dvi', 'xsltproc'],
         rc_entry = [
             r'''\converter docbook    dvi        "sgmltools -b dvi $$i"        ""
 \converter docbook    html       "sgmltools -b html $$i"       ""''',
             r'''\converter docbook    dvi        "db2dvi $$i"  ""
 \converter docbook    html       "db2html $$i" ""''',
             r'''\converter docbook    dvi        ""    ""
+\converter docbook    html       "" ""''',
+            r'''\converter docbook    dvi        ""    ""
 \converter docbook    html       ""    ""'''])
     #
     if DOCBOOK != '':
@@ -582,11 +589,6 @@ def checkDocBook():
 
 def checkOtherEntries():
     ''' entries other than Format and Converter '''
-    checkProg('a *roff formatter', ['groff', 'nroff'],
-        rc_entry = [
-            r'\plaintext_roff_command "groff -t -Tlatin1 $$FName"',
-            r'\plaintext_roff_command "tbl $$FName | nroff"',
-            r'\plaintext_roff_command ""' ])
     checkProg('ChkTeX', ['chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38'],
         rc_entry = [ r'\chktex_command "%%"' ])
     checkProg('BibTeX', ['jbibtex', 'bibtex'],
@@ -595,8 +597,6 @@ def checkOtherEntries():
         rc_entry = [ r'\index_command "%%"' ])
     checkProg('a nomenclature processor', ['makeindex'],
         rc_entry = [ r'\nomencl_command "makeindex -s nomencl.ist"' ])
-    checkProg('a spellchecker', ['ispell'],
-        rc_entry = [ r'\spell_command "%%"' ])
     ## FIXME: OCTAVE is not used anywhere
     # path, OCTAVE = checkProg('Octave', ['octave'])
     ## FIXME: MAPLE is not used anywhere
@@ -616,7 +616,7 @@ def checkOtherEntries():
 ''')
 
 
-def processLayoutFile(file, bool_docbook, bool_linuxdoc):
+def processLayoutFile(file, bool_docbook):
     ''' process layout file and get a line of result
         
         Declare lines look like this: (article.layout, scrbook.layout, svjog.layout)
@@ -633,24 +633,24 @@ def processLayoutFile(file, bool_docbook, bool_linuxdoc):
     '''
     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|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:
             (classtype, optAll, opt, opt1, desc) = res.groups()
-            avai = {'LaTeX':'false', 'DocBook':bool_docbook, 'LinuxDoc':bool_linuxdoc}[classtype]
+            avai = {'LaTeX':'false', 'DocBook':bool_docbook}[classtype]
             if opt == None:
                 opt = classname
             return '"%s" "%s" "%s" "%s"\n' % (classname, opt, desc, avai)
-    print "Layout file without \DeclareXXClass line. "
-    sys.exit(2)
+    logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
+    return ""
 
-    
-def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
+
+def checkLatexConfig(check_config, bool_docbook):
     ''' Explore the LaTeX configuration 
         Return None (will be passed to sys.exit()) for success.
     '''
-    print 'checking LaTeX configuration... ',
+    msg = 'checking LaTeX configuration... '
     # if --without-latex-config is forced, or if there is no previous 
     # version of textclass.lst, re-generate a default file.
     if not os.path.isfile('textclass.lst') or not check_config:
@@ -659,8 +659,8 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
         #
         # Then, generate a default textclass.lst. In case configure.py
         # fails, we still have something to start lyx.
-        print ' default values'
-        print '+checking list of textclasses... '
+        logger.info(msg + ' default values')
+        logger.info('+checking list of textclasses... ')
         tx = open('textclass.lst', 'w')
         tx.write('''
 # This file declares layouts and their associated definition files
@@ -685,22 +685,23 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
             # make sure the same class is not considered twice
             if foundClasses.count(cleanclass) == 0: # not found before
                 foundClasses.append(cleanclass)
-                tx.write(processLayoutFile(file, bool_docbook, bool_linuxdoc))
+                retval = processLayoutFile(file, bool_docbook)
+                if retval != "":
+                    tx.write(retval)
         tx.close()
-        print '\tdone'
+        logger.info('\tdone')
     if not check_config:
         return None
     # the following will generate textclass.lst.tmp, and packages.lst.tmp
     else:
-        print '\tauto'
+        logger.info(msg + '\tauto')
         removeFiles(['wrap_chkconfig.ltx', 'chkconfig.vars', \
             'chkconfig.classes', 'chklayouts.tex'])
         rmcopy = False
         if not os.path.isfile( 'chkconfig.ltx' ):
             shutil.copyfile( os.path.join(srcdir, 'chkconfig.ltx'), 'chkconfig.ltx' )
             rmcopy = True
-        writeToFile('wrap_chkconfig.ltx', '%s\n%s\n\\input{chkconfig.ltx}\n' \
-            % (linuxdoc_cmd, docbook_cmd) )
+        writeToFile('wrap_chkconfig.ltx', '%s\n\\input{chkconfig.ltx}\n' % docbook_cmd)
         # Construct the list of classes to test for.
         # build the list of available layout files and convert it to commands
         # for chkconfig.ltx
@@ -715,7 +716,7 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
                 if p1.search(line) == None:
                     continue
                 if line[0] != '#':
-                    print "Wrong input layout file with line '" + line
+                    logger.error("Wrong input layout file with line '" + line)
                     sys.exit(3)
                 testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()))
                 break
@@ -732,7 +733,7 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
             if not line:
                 break;
             if re.match('^\+', line):
-                print line,
+                logger.info(line.strip())
         # if the command succeeds, None will be returned
         ret = fout.close()
         #
@@ -762,7 +763,7 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
 def checkModulesConfig():
   removeFiles(['lyxmodules.lst'])
 
-  print '+checking list of modules... '
+  logger.info('+checking list of modules... ')
   tx = open('lyxmodules.lst', 'w')
   tx.write('''## This file declares modules and their associated definition files.
 ## It has been automatically generated by configure
@@ -774,15 +775,17 @@ def checkModulesConfig():
   for file in glob.glob( os.path.join('layouts', '*.module') ) + \
       glob.glob( os.path.join(srcdir, 'layouts', '*.module' ) ) :
       # valid file?
-      print file
+      logger.info(file)
       if not os.path.isfile(file): 
           continue
-      tx.write(processModuleFile(file, bool_docbook, bool_linuxdoc))
+      retval = processModuleFile(file, bool_docbook)
+      if retval != "":
+          tx.write(retval)
   tx.close()
-  print '\tdone'
+  logger.info('\tdone')
 
 
-def processModuleFile(file, bool_docbook, bool_linuxdoc):
+def processModuleFile(file, bool_docbook):
     ''' process module file and get a line of result
 
         The top of a module file should look like this:
@@ -844,25 +847,25 @@ def processModuleFile(file, bool_docbook, bool_linuxdoc):
         continue
     if modname != "":
         return '"%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl)
-    print "Module file without \DeclareLyXModule line. "
-    sys.exit(2)
+    logger.warning("Module file without \DeclareLyXModule line. ")
+    return ""
 
 
 def checkTeXAllowSpaces():
     ''' Let's check whether spaces are allowed in TeX file names '''
     tex_allows_spaces = 'false'
     if lyx_check_config:
-        print "Checking whether TeX allows spaces in file names... ",
+        msg = "Checking whether TeX allows spaces in file names... "
         writeToFile('a b.tex', r'\message{working^^J}' )
         if os.name == 'nt':
             latex_out = cmdOutput(LATEX + r""" "\nonstopmode\input{\"a b\"}" """)
         else:
             latex_out = cmdOutput(LATEX + r""" '\nonstopmode\input{"a b"}' """)
         if 'working' in latex_out:
-            print 'yes'
+            logger.info(msg + 'yes')
             tex_allows_spaces = 'true'
         else:
-            print 'no'
+            logger.info(msg + 'no')
             tex_allows_spaces = 'false'
         addToRC(r'\tex_allows_spaces ' + tex_allows_spaces)
         removeFiles( [ 'a b.tex', 'a b.log', 'texput.log' ])
@@ -883,7 +886,6 @@ 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' ]:
@@ -905,16 +907,12 @@ Options:
             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 == '':
         srcdir = '.'
     if not os.path.isfile( os.path.join(srcdir, 'chkconfig.ltx') ):
-        print "configure: error: cannot find chkconfig.ltx script"
+        logger.error("configure: error: cannot find chkconfig.ltx script")
         sys.exit(1)
     setEnviron()
     createDirectories()
@@ -932,15 +930,13 @@ Options:
     LATEX = checkLatex(dtl_tools)
     checkFormatEntries(dtl_tools)
     checkConverterEntries()
-    (chk_linuxdoc, bool_linuxdoc, linuxdoc_cmd) = checkLinuxDoc()
     (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()
     checkTeXAllowSpaces()
     if windows_style_tex_paths != '':
         addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths)
     checkOtherEntries()
     # --without-latex-config can disable lyx_check_config
-    ret = checkLatexConfig(lyx_check_config and LATEX != '',
-        bool_docbook, bool_linuxdoc)
+    ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook)
     checkModulesConfig() #lyx_check_config and LATEX != '')
     removeTempFiles()
     # The return error code can be 256. Because most systems expect an error code