]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
Add characters counting.
[lyx.git] / lib / configure.py
index c6c2ddd6202742b97c5f6af9cac92b6168e719d6..62f32751e6c5837326b7f31e24e51bd3fd517156 100644 (file)
@@ -158,17 +158,19 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
         ac_word = ac_prog.split(' ')[0]
         print '+checking for "' + ac_word + '"... ',
         path = os.environ["PATH"].split(os.pathsep) + path
+        extlist = ['']
+        if os.environ.has_key("PATHEXT"):
+            extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
         for ac_dir in path:
-            # check both ac_word and ac_word.exe (for windows system)
-            if os.path.isfile( os.path.join(ac_dir, ac_word) ) or \
-                os.path.isfile( os.path.join(ac_dir, ac_word + ".exe") ):
-                print ' yes'
-                # write rc entries for this command
-                if len(rc_entry) == 1:
-                    addToRC(rc_entry[0].replace('%%', ac_prog))
-                elif len(rc_entry) > 1:
-                    addToRC(rc_entry[idx].replace('%%', ac_prog))
-                return [ac_dir, ac_word]
+            for ext in extlist:
+                if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
+                    print ' yes'
+                    # write rc entries for this command
+                    if len(rc_entry) == 1:
+                        addToRC(rc_entry[0].replace('%%', ac_prog))
+                    elif len(rc_entry) > 1:
+                        addToRC(rc_entry[idx].replace('%%', ac_prog))
+                    return [ac_dir, ac_word]
         # if not successful
         print ' no'
     # write rc entries for 'not found'
@@ -196,14 +198,17 @@ def checkDTLtools():
 
 def checkLatex(dtl_tools):
     ''' Check latex, return lyx_check_config '''
+    path, LATEX = checkProg('a Latex2e program', ['latex $$i', 'platex $$i', 'latex2e $$i'])
+    path, PPLATEX = checkProg('a DVI postprocessing program', ['pplatex $$i'])
+    # use LATEX to convert from latex to dvi if PPLATEX is not available    
+    if PPLATEX == '':
+        PPLATEX = LATEX
     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" ""'''
+        addToRC(r'''\converter latex      dvi2       "%s"      "latex"
+\converter dvi2       dvi        "python -tt $$s/scripts/clean_dvi.py $$i $$o" ""''' % PPLATEX)
     else:
-        converter_entry = r'\converter latex      dvi        "%%"      "latex"'
-    path, LATEX = checkProg('a Latex2e program', ['pplatex $$i', 'latex $$i', 'latex2e $$i'],
-        rc_entry = [converter_entry])
+        addToRC(r'\converter latex      dvi        "%s"        "latex"' % PPLATEX)
     # no latex
     if LATEX != '':
         # Check if latex is usable
@@ -239,7 +244,7 @@ def checkFormatEntries(dtl_tools):
     checkViewer('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
         rc_entry = [r'\Format fen        fen     FEN                    "" "%%"        "%%"    ""'])
     #
-    path, iv = checkViewer('a raster image viewer', ['xv', 'kview', 'gimp-remote', 'gimp'])
+    path, iv = checkViewer('a raster image viewer', ['xdg-open', 'xv', 'kview', 'gimp-remote', 'gimp'])
     path, ie = checkViewer('a raster image editor', ['gimp-remote', 'gimp'])
     addToRC(r'''\Format bmp        bmp     BMP                    "" "%s"      "%s"    ""
 \Format gif        gif     GIF                    "" "%s"      "%s"    ""
@@ -253,7 +258,7 @@ def checkFormatEntries(dtl_tools):
 \Format xpm        xpm     XPM                    "" "%s"      "%s"    ""''' % \
         (iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie) )
     #
-    checkViewer('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
+    checkViewer('a text editor', ['sensible-editor', 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
         'nedit', 'gedit', 'notepad'],
         rc_entry = [r'''\Format asciichess asc    "Plain text (chess output)"  "" ""   "%%"    ""
 \Format asciiimage asc    "Plain text (image)"         "" ""   "%%"    ""
@@ -274,23 +279,23 @@ def checkFormatEntries(dtl_tools):
     #
     #checkProg('a Postscript interpreter', ['gs'],
     #  rc_entry = [ r'\ps_command "%%"' ])
-    checkViewer('a Postscript previewer', ['kghostview', 'evince', 'gv', 'ghostview -swap'],
+    checkViewer('a Postscript previewer', ['xdg-open', 'kghostview', 'evince', 'gv', 'ghostview -swap'],
         rc_entry = [r'''\Format eps        eps     EPS                    "" "%%"      ""      "vector"
 \Format ps         ps      Postscript             t  "%%"      ""      "document,vector"'''])
     #
-    checkViewer('a PDF previewer', ['kpdf', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \
+    checkViewer('a PDF previewer', ['xdg-open', 'kpdf', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \
                    '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"'''])
     #
-    checkViewer('a DVI previewer', ['xdvi', 'kdvi'],
+    checkViewer('a DVI previewer', ['xdg-open', 'xdvi', 'kdvi'],
         rc_entry = [r'\Format dvi        dvi     DVI                    D  "%%"        ""      "document,vector"'])
     if dtl_tools:
         # Windows only: DraftDVI
-        addToRC(r'\Format dvi2       dvi     DraftDVI               "" ""      "document,vector"')
+        addToRC(r'\Format dvi2       dvi     DraftDVI               "" ""      ""      "vector"')
     #
-    checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'],
+    checkViewer('an HTML previewer', ['xdg-open', 'firefox', 'mozilla file://$$p$$i', 'netscape'],
         rc_entry = [r'\Format html       html    HTML                   H  "%%"        ""      "document"'])
     #
     checkViewer('Noteedit', ['noteedit'],
@@ -305,6 +310,7 @@ def checkFormatEntries(dtl_tools):
 \Format lyx        lyx     LyX                    "" ""        ""      ""
 \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 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"
@@ -483,6 +489,7 @@ def checkConverterEntries():
 \converter fig        pstex      "python -tt $$s/scripts/fig2pstex.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        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"   ""
@@ -589,12 +596,18 @@ def processLayoutFile(file, bool_docbook, bool_linuxdoc):
 
     
 def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
-    ''' Explore the LaTeX configuration '''
+    ''' Explore the LaTeX configuration 
+        Return None (will be passed to sys.exit()) for success.
+    '''
     print 'checking LaTeX configuration... ',
-    # First, remove the files that we want to re-create
-    removeFiles(['textclass.lst', 'packages.lst', 'chkconfig.sed'])
-    #
-    if not check_config:
+    # 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:
+        # remove the files only if we want to regenerate
+        removeFiles(['textclass.lst', 'packages.lst'])
+        #
+        # 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... '
         tx = open('textclass.lst', 'w')
@@ -624,6 +637,9 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
                 tx.write(processLayoutFile(file, bool_docbook, bool_linuxdoc))
         tx.close()
         print '\tdone'
+    if not check_config:
+        return None
+    # the following will generate textclass.lst.tmp, and packages.lst.tmp
     else:
         print '\tauto'
         removeFiles(['wrap_chkconfig.ltx', 'chkconfig.vars', \
@@ -666,7 +682,8 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
                 break;
             if re.match('^\+', line):
                 print line,
-        fout.close()
+        # if the command succeeds, None will be returned
+        ret = fout.close()
         #
         # currently, values in chhkconfig are only used to set
         # \font_encoding
@@ -682,59 +699,13 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc):
             pass
         if rmcopy:   # remove the copied file
             removeFiles( [ 'chkconfig.ltx' ] )
-
-
-def createLaTeXConfig():
-    ''' create LaTeXConfig.lyx '''
-    # if chkconfig.sed does not exist (because LaTeX did not run),
-    # then provide a standard version.
-    if not os.path.isfile('chkconfig.sed'):
-        writeToFile('chkconfig.sed', 's!@.*@!???!g\n')
-    print "creating packages.lst"
-    # if packages.lst does not exist (because LaTeX did not run),
-    # then provide a standard version.
-    if not os.path.isfile('packages.lst'):
-        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.py
-### if you need to update it after a configuration change.
-''')
-    print 'creating doc/LaTeXConfig.lyx'
-    #
-    # This is originally done by sed, using a
-    # tex-generated file chkconfig.sed
-    ##sed -f chkconfig.sed ${srcdir}/doc/LaTeXConfig.lyx.in
-    ##  >doc/LaTeXConfig.lyx
-    # Now, we have to do it by hand (python).
-    #
-    # add to chekconfig.sed
-    writeToFile('chkconfig.sed', '''s!@chk_linuxdoc@!%s!g
-s!@chk_docbook@!%s!g
-    ''' % (chk_linuxdoc, chk_docbook) , append=True)
-    # process this sed file!!!!
-    lyxin = open( os.path.join(srcdir, 'doc', 'LaTeXConfig.lyx.in')).readlines()
-    # get the rules
-    p = re.compile(r's!(.*)!(.*)!g')
-    # process each sed replace.
-    for sed in open('chkconfig.sed').readlines():
-        if sed.strip() == '':
-            continue
-        try:
-            fr, to = p.match(sed).groups()
-            # if latex did not run, change all @name@ to '???'
-            if fr == '@.*@':
-                for line in range(len(lyxin)):
-                    lyxin[line] = re.sub('@.*@', to, lyxin[line])
-            else:
-                for line in range(len(lyxin)):
-                    lyxin[line] = lyxin[line].replace(fr, to)
-        except:  # wrong sed entry?
-            print "Wrong sed entry in chkconfig.sed: '" + sed + "'"
-            sys.exit(4)
-    # 
-    writeToFile( os.path.join('doc', 'LaTeXConfig.lyx'),
-        ''.join(lyxin))
+        # if configure successed, move textclass.lst.tmp to textclass.lst
+        # and packages.lst.tmp to packages.lst
+        if os.path.isfile('textclass.lst.tmp') and len(open('textclass.lst.tmp').read()) > 0 \
+            and os.path.isfile('packages.lst.tmp') and len(open('packages.lst.tmp').read()) > 0:
+            shutil.move('textclass.lst.tmp', 'textclass.lst')
+            shutil.move('packages.lst.tmp', 'packages.lst')
+        return ret
 
 
 def checkModulesConfig():
@@ -811,7 +782,7 @@ def checkTeXAllowSpaces():
 def removeTempFiles():
     # Final clean-up
     if not lyx_keep_temps:
-        removeFiles(['chkconfig.sed', 'chkconfig.vars',  \
+        removeFiles(['chkconfig.vars',  \
             'wrap_chkconfig.ltx', 'wrap_chkconfig.log', \
             'chklayouts.tex', 'missfont.log', 
             'chklatex.ltx', 'chklatex.log'])
@@ -879,7 +850,11 @@ Options:
         addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths)
     checkOtherEntries()
     # --without-latex-config can disable lyx_check_config
-    checkLatexConfig( lyx_check_config and LATEX != '', bool_docbook, bool_linuxdoc)
-    createLaTeXConfig()
+    ret = checkLatexConfig(lyx_check_config and LATEX != '',
+        bool_docbook, bool_linuxdoc)
     checkModulesConfig() #lyx_check_config and LATEX != '')
     removeTempFiles()
+    # The return error code can be 256. Because most systems expect an error code
+    # in the range 0-127, 256 can be interpretted as 'success'. Because we expect
+    # a None for success, 'ret is not None' is used to exit.
+    sys.exit(ret is not None)