Dear list,

Attached is a python version of lib/configure for 1.4.0 cvs. It is
written according to the m4 file at
http://www.lyx.org/cgi-bin/viewcvs.cgi/lyx-devel/lib/configure.m4 .
Since I do not have access to lyx/cvs, I can only test it against
1.4.0pre1 from ftp.lyx.org.

Please test this script and report any problem here. Note that you
should diff sorted lyxrc.default files since configure.py does not
keep the original entry order.

Angus, could you add this file to the repository? 

Thanks.
Bo
#!/usr/bin/env python 
#
# Python version of the configure script
#
# Bo Peng ([EMAIL PROTECTED])
# Sep, 2005
#
import sys, os, re, shutil, glob

outfile = 'lyxrc.defaults'
rc_entries = ''
lyx_check_config = True
lyx_keep_temps = False
srcdir = ''
version_suffix = ''

def writeToFile(filename, lines, append = False):
  " utility function: write or append lines to filename "
  if append:
    file = open(filename, 'a')
  else:
    file = open(filename, 'w')
  file.write(lines)
  file.close()

def addToRC(lines):
  ''' utility function: shortcut for appending lines to outfile
    add newline at the end of lines. 
  '''  
  if lines.strip() != '':
    writeToFile(outfile, lines + '\n', append = True)

def removeFiles(filenames):
  '''utility function: 'rm -f'
    ignore erroes when file does not exist, or is a directory.
  '''
  for file in filenames:
    try:
      os.remove(file)
    except:
      pass

def cmdOutput(cmd, line=-1):
  '''utility function: run a command and get its output
    cmd: command to run
    line: return the 'line' line. (with boundary checking)
      if line==-1 (default), return all lines.
  '''  
  fout = os.popen(cmd)
  output = fout.readlines()
  fout.close()
  if line < 0:
    return output
  elif line >= len(output):
    print "Output of command", cmd, "has less than", line+1, "lines"
    sys.exit(4)
  return output[line]

## 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]
Options:
  --help                   show this help lines
  --keep-temps             keep temporary files (for debug. purposes)
  --without-latex-config   do not run LaTeX to determine configuration
  --with-version-suffix=suffix suffix of binary installed files
'''
    sys.exit(0)
  elif op == '--without-latex-config':
    lyx_check_config = False
  elif op == '--keep-temps':
    lyx_keep_temps = True
  elif op[0:22] == '--with-version-suffix=':  # never mind if op is not long 
enough  
    version_suffix = op[23:]
  else:
    print "Unknown option", op
    sys.exit(1)

## Checking for some echo oddities (ignored)
## The original script defines ac_n, ac_t and ac_c for 
## tab, newline etc, I just use python's print output. 

## I do not really know why this is useful, but we might as well keep it.
### 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'!
### Non-C LC_CTYPE values break the ctype check.
## 
os.environ['LANG'] = os.getenv('LANG', 'C')
os.environ['LC'] = os.getenv('LC_ALL', 'C')
os.environ['LC_MESSAGE'] = os.getenv('LC_MESSAGE', 'C')
os.environ['LC_CTYPE'] = os.getenv('LC_CTYPE', 'C')

## Guess the directory in which configure is located.
ac_prog = sys.argv[0]
srcdir = os.path.dirname(ac_prog)
if srcdir == '':  
  srcdir = '.'
if not os.path.isfile( os.path.join(srcdir, 'chkconfig.ltx') ):
  print "configure: error: cannot find chkconfig.ltx script"
  sys.exit(1)

## Adjust PATH for Win32 (Cygwin)
#
use_cygwin_path_fix = ''
if sys.platform == 'cygwin':
  from tempfile import mkstemp
  fd, tmpfname = mkstemp(suffix='.ltx')
  os.write(fd, r'''
\documentstyle{article} 
\begin{document}\end{document} 
''')
  os.close(fd) 
  inpname = cmdOutput('cygpath -w ' + tmpfname, 0).replace('\\', '/').strip()
  # a wrapper file
  wfd, wtmpfname = mkstemp(suffix='.ltx')
  os.write(wfd, r'\input{' + inpname + '}' )
  os.close(wfd)
  check_err = False
  # grep Error
  for line in cmdOutput('latex ' + wtmpfname):
    if line.count('Error') != 0:
      check_err = True
      break
  removeFiles( [ tmpfname, wtmpfname ])
  if check_err:
    print "configure: cygwin detected; path correction"
    srcdir = cmdOutput('cygpath -w ' + srcdir, 0).replace(r'\\', '').strip()
    print "srcdir = ", srcdir
    use_cygwin_path_fix = 'true'
  else:
    print "configure: cygwin detected; path correction is not needed"
    use_cygwin_path_fix = 'false'

#### Create the build directories if necessary
for dir in ['bind', 'clipart', 'doc', 'examples', 'images', 'kbd', \
  'layouts', 'scripts', 'templates', 'ui' ]:
  if not os.path.isdir( dir ):
    try:
      os.mkdir( dir)
    except:
      print "Failed to create directory ", dir
      sys.exit(1)

## Write the first part of outfile
writeToFile(outfile, '''# This file has been automatically generated by LyX' 
lib/configure
# 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
# override the values given here.
''')

## Searching some useful programs
def checkProg(description, progs, rc_entry = [], path = [] ):
  '''
    This function will search a program in $PATH plus given path
    If found, return directory and program name (not the options).
   
    description: description of the program
   
    progs: check programs, for each prog, the first word is used
      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 path
   
    rc_entry: entry to outfile, can be emtpy, one pattern (%% for chosen 
       prog or none), or one for each prog and none.
   
    FIXME: under windows, we should check registry
    instead of $PATH
  '''
  # one rc entry for each progs plus none 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 none."
    sys.exit(2)
  print '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 + '"... ', 
    for ac_dir in os.environ['PATH'].split(':') + path:
      if os.path.isfile( os.path.join(ac_dir, ac_word) ):
        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' 
  if len(rc_entry) > 0:  # the last one.
    addToRC(rc_entry[-1].replace('%%', 'none')) 
  return ['', 'none']

# Find programs! Returned path is not used now
path, LATEX = checkProg( 'a Latex2e program', ['pplatex $$i', 'latex $$i', 
'latex2e $$i'],
  rc_entry = [ r'\converter latex      dvi        "%%" "latex"' ] )

# no latex
lyx_check_config = False
if LATEX != 'none': 
  # Check if latex is usable
  writeToFile('chklatex.ltx', '''
\\nonstopmode\\makeatletter
\\ifx\\undefined\\documentclass\\else
  \\message{ThisIsLaTeX2e}
\\fi
\\@@end
''')
  # run latex on chklatex.ltx and check result
  isLatex2e = False
  for line in cmdOutput(LATEX + ' chklatex.ltx'):
    if re.search('ThisIsLaTeX2e', line) != None:
      isLatex2e = True
      break
  if not isLatex2e:
    print "Latex not usable (not LaTeX2e) "
  else:
    lyx_check_config = True
  # remove temporary files
  removeFiles(['chkltex.ltx', 'chklatex.log'])

checkProg('the pdflatex program', ['pdflatex $$i'], 
  rc_entry = [ r'\converter latex       pdf2    "%%" "latex"' ])

checkProg('a Tgif viewer and editor', ['tgif'], 
  rc_entry = [ r'\Format tgif       obj     Tgif                   "" "%%"      
"%%"'])

checkProg('a FIG viewer and editor', ['xfig'], 
  rc_entry = [ r'\Format fig        fig     FIG                    "" "%%"      
"%%"'] )

checkProg('a Grace viewer and editor', ['xmgrace'], 
  rc_entry = [  r'\Format agr agr GRACE  "" "%%" "%%"' ] )

checkProg('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
  rc_entry = [ r'\Format fen        fen     FEN                    "" "%%"      
"%%"' ])

path, iv = checkProg('a raster image viewer', ['xv', 'kview', 'gimp'])
path, ie = checkProg('a raster image editor', ['gimp'])
addToRC(r'''\Format bmp        bmp     BMP  "" "%s"     "%s"
\Format gif        gif     GIF                    "" "%s"       "%s"
\Format jpg        jpg     JPEG                   "" "%s"       "%s"
\Format pbm        pbm     PBM                    "" "%s"       "%s"
\Format pgm        pgm     PGM                    "" "%s"       "%s"
\Format png        png     PNG                    "" "%s"       "%s"
\Format ppm        ppm     PPM                    "" "%s"       "%s"
\Format tiff       tif     TIFF                   "" "%s"       "%s"
\Format xbm        xbm     XBM                    "" "%s"       "%s"
\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) )

checkProg('a text 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)"         "" ""    "%%"
\Format asciixfig  asc    "Plain text (xfig output)"   "" ""    "%%"
\Format dateout    tmp    "date (output)"         "" "" "%%"
\Format docbook    sgml    DocBook                B  "" "%%"
\Format docbook-xml xml   "Docbook (XML)"         "" "" "%%"
\Format literate   nw      NoWeb                  N  "" "%%"
\Format latex      tex     LaTeX                  L  "" "%%"
\Format linuxdoc   sgml    LinuxDoc               x  "" "%%"
\Format text       txt    "Plain text"            a  "" "%%"
\Format textparagraph txt "Plain text (paragraphs)"    "" ""    "%%"''' ])

checkProg('a LaTeX -> LyX converter', 
[os.path.join('..','src','tex2lyx','tex2lyx') + ' -f $$i $$o', \
  'tex2lyx' +  version_suffix + ' -f $$i $$o' ], 
  rc_entry = [ r'\converter latex      lyx        "%%" ""' ])

checkProg('a Noweb -> LyX converter', ['noweb2lyx' + version_suffix + ' $$i 
$$o'], path = ['./reLyX'],
  rc_entry = [ r'\converter literate   lyx        "%%" ""' ]) 

checkProg('a Noweb -> LaTeX converter', ['noweave' + version_suffix + ' -delay 
-index $$i > $$o'], 
  path = ['./reLyX'], rc_entry = [ r'\converter literate        latex   "%%" 
""' ]) 

checkProg('a HTML -> LaTeX converter', ['html2latex $$i'],
  rc_entry = [ r'\converter html       latex      "%%" ""' ])

checkProg('a MSWord -> LaTeX converter', ['wvCleanLatex $$i $$o'],
  rc_entry = [ r'\converter word       latex      "%%" ""' ])

checkProg('a LaTeX -> MS Word converter', ["htlatex $$i 'html,word' 'symbol/!' 
'-cvalidate'"], 
  rc_entry = [  r'\converter latex      wordhtml        "%%"  ""' ])
    
# FIXME: image_command is not used anywhere. 
checkProg('Image converter', ['convert $$i $$o'])

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'],
  rc_entry = [r'\converter latex      sxw        "%%"   "latex"' ])

#checkProg('a Postscript interpreter', ['gs'], 
#  rc_entry = [ r'\ps_command "%%"' ])

checkProg('a Postscript previewer', ['gsview32', 'gv', 'ghostview -swap', 
'kghostview'],
  rc_entry = [
    r'''\Format eps        eps     EPS                    "" "%%"       ""
\Format ps         ps      Postscript             t  "%%"       ""''' ])

checkProg('a PDF previewer', ['acrobat', 'acrord32', 'gsview32', \
  'acroread', 'gv', 'ghostview', 'xpdf', 'kpdf', 'kghostview'], 
  rc_entry = [ r'''\Format pdf        pdf    "PDF (ps2pdf)"          P  "%%"    
""
\Format pdf2       pdf    "PDF (pdflatex)"        F  "%%"       ""
\Format pdf3       pdf    "PDF (dvipdfm)"         m  "%%"       ""''' ])

checkProg('a DVI previewer', ['xdvi', 'windvi', 'yap', 'kdvi'],
  rc_entry = [ r'\Format dvi        dvi     DVI                    D  "%%"      
""' ])

checkProg('a HTML previewer', ['mozilla file://$$p$$i', 'netscape'], 
  rc_entry = [ r'\Format html       html    HTML                   H  "%%"      
""' ])

checkProg('a PS to PDF converter', ['ps2pdf13 $$i'],
  rc_entry = [ r'\converter ps         pdf        "%%"  ""' ])

checkProg('a DVI to PS converter', ['dvips -o $$o $$i'],
  rc_entry = [ r'\converter dvi        ps         "%%"  ""' ])

checkProg('a DVI to PDF converter', ['dvipdfm $$i'],
  rc_entry = [ r'\converter dvi        pdf3       "%%" ""' ])

### We have a script to convert previewlyx to ppm
addToRC(r'\converter lyxpreview ppm     "python 
$$s/scripts/lyxpreview2bitmap.py"       ""')

path, dvipng = checkProg('dvipng', ['dvipng'])
if dvipng == "dvipng":
  addToRC(r'\converter lyxpreview       png     "python 
$$s/scripts/lyxpreview2bitmap.py"       ""')
else:
  addToRC(r'\converter lyxpreview       png     ""      ""')

checkProg('a *roff formatter', ['groff -t -Tlatin1 $$FName', 'nroff'],
  rc_entry = [
    r'\ascii_roff_command "groff -t -Tlatin1 $$FName"', 
    r'\ascii_roff_command "tbl $$FName | nroff"', 
    '' ])

checkProg('ChkTeX', ['chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38'],
  rc_entry = [
    r'\chktex_command "chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38"',
    r'\chktex_command "none"' ])

checkProg('a spellchecker', ['ispell'],
  rc_entry = [
    r'\spell_command "ispell"', '' ] )

## FIXME: OCTAVE is not used anywhere
path, OCTAVE = checkProg('Octave', ['octave'])

## FIXME: MAPLE is not used anywhere
path, MAPLE = checkProg('Maple', ['maple'])

checkProg('a fax program', ['kdeprintfax $$i', 'ksendfax $$i'], 
  rc_entry = [ r'\converter ps  fax     "%%" ""'])

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 "none" ""
\converter linuxdoc     latex "none" ""
\converter linuxdoc     dvi "none" ""
\converter linuxdoc     html "none" "" ''' ])

if LINUXDOC != 'none':
  chk_linuxdoc = 'yes'
  bool_linuxdoc = 'true'
  linuxdoc_cmd = '\\def\\haslinuxdoc{yes}'
else:
  chk_linuxdoc = 'no'
  bool_linuxdoc = 'false'

path, DOCBOOK = checkProg('SGML-tools 2.x (DocBook) or db2x scripts', 
['sgmltools', 'db2dvi'],
  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        "none" ""
\converter docbook    html       "none" ""'''])

if DOCBOOK != 'none':
  chk_docbook = 'yes'
  bool_docbook = 'true'
  docbook_cmd = '\\def\\hasdocbook{yes}'
else:
  chk_docbook = 'no'
  bool_docbook = 'false'

checkProg('a spool command', ['lp', 'lpr'],
  rc_entry = [
    r'''\print_spool_printerprefix "-d "
\print_spool_command "lp"''',
    r'''\print_spool_printerprefix "-P"',
\print_spool_command "lpr"''',
    ''])

checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'tth  -t -e2 -L$$b < $$i 
> $$o', \
  'latex2html -no_subdir -split 0 -show_section_numbers $$i', 'hevea -s $$i'],
  rc_entry = [ r'\converter latex      html       "%%" "originaldir,needaux"' ])

# Add the rest of the entries (no checkProg is required)
addToRC(r'''\Format date       ""     "date command"          "" ""     ""
\Format fax        ""      Fax                    "" "" ""
\Format lyx        lyx     LyX                    "" "lyx"      "lyx"
\Format lyxpreview lyxpreview "LyX Preview"       "" "" ""
\Format pdftex     pdftex_t PDFTEX                "" "" ""
\Format program    ""      Program                "" "" ""
\Format pstex      pstex_t PSTEX                  "" "" ""
\Format sxw        sxw    "OpenOffice.Org Writer" O  "" ""
\Format word       doc    "MS Word"               W  "" ""
\Format wordhtml   html   "MS Word (HTML)"        "" ""        ""
\converter date       dateout    "date +%d-%m-%Y > $$o" ""
\converter docbook    docbook-xml "cp $$i $$o" "xml"
\converter fen        asciichess "python $$s/scripts/fen2ascii.py $$i $$o"      
""
\converter fig        pdftex     "sh $$s/scripts/fig2pdftex.sh $$i $$o" ""
\converter fig        pstex      "sh $$s/scripts/fig2pstex.sh $$i $$o"  "" 
\copier    fig        "sh $$s/scripts/fig_copy.sh $$i $$o"
\copier    pstex      "python $$s/scripts/tex_copy.py $$i $$o $$l"
\copier    pdftex     "python $$s/scripts/tex_copy.py $$i $$o $$l"
''')

## Explore the LaTeX configuration
print 'checking LaTeX configuration... ',
## First, remove the files that we want to re-create
removeFiles(['textclass.lst', 'packages.lst', 'chkconfig.sed'])

if not lyx_check_config:
  print ' default values'
  print '+checking list of textclasses... '
  tx = open('textclass.lst', 'w')
  tx.write('''
# 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
# configuration change.
''')
  # build the list of available layout files and convert it to commands
  # for chkconfig.ltx
  foundClasses = []
  # sed filters
  # FIXME: this is a direct translation of the sed commands
  # There may be more efficient methods 
  p1 = re.compile(r'\Declare(LaTeX|DocBook|LinuxDoc)Class')
  p2 = re.compile(r'^.*\DeclareLaTeXClass *(.*)')
  p3 = re.compile(r'^.*\DeclareDocBookClass *(.*)')
  p4 = re.compile(r'^.*\DeclareLinuxDocClass *(.*)')
  p5 = re.compile(r'\[([^,]*),[^]]*\]')
  p6 = re.compile('^{')
  p7 = re.compile(r'\[([^]]*)\] *{([^}]*)}')
  for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
    glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) :
    # valid file?
    if not os.path.isfile(file): continue
    # get stuff between /xxxx.layout .
    classname = file.split(os.sep)[-1].split('.')[0]
    #  tr ' -' '__'`
    cleanclass = classname.replace(' ', '_')
    cleanclass = cleanclass.replace('-', '_')
    # make sure the same class is not considered twice
    if foundClasses.count(cleanclass) == 0: # not found before
      foundClasses.append(cleanclass)
      # The sed commands below are a bit scary. Here is what they do:
      # 1-3: remove the \DeclareFOO macro and add the correct boolean 
      #      at the end of the line telling whether the class is 
      #      available
      # 4: if the macro had an optional argument with several 
      #    parameters, only keep the first one
      # 5: if the macro did not have an optional argument, provide one 
      #    (equal to the class name)
      # 6: remove brackets and replace with correctly quoted entries
      #     grep '\\Declare\(LaTeX\|DocBook\|LinuxDoc\)Class' "$file" \
      #      | sed -e 's/^.*\DeclareLaTeXClass *\(.*\)/\1 "false"/' \
      #     -e 's/^.*\DeclareDocBookClass *\(.*\)/\1 "'$bool_docbook'"/' \
      #     -e 's/^.*\DeclareLinuxDocClass *\(.*\)/\1 "'$bool_linuxdoc'"/' \
      #     -e 's/\[\([^,]*\),[^]]*\]/[\1]/' \
      #     -e 's/^{/['$class']{/' \
      #     -e 's/\[\([^]]*\)\] *{\([^}]*\)}/"'$class'" "\1" "\2"/' \
      #                   >>textclass.lst
      for line in open(file).readlines():
        if p1.search(line) == None: 
          continue
        line = p2.sub(r'\1 "false"', line)
        line = p3.sub(r'\1 "' + bool_docbook + '"', line)
        line = p4.sub(r'\1 "' + bool_linuxdoc + '"', line)
        line = p5.sub(r'[\1]', line)
        line = p6.sub("[" + classname + "]{", line)  
        line = p7.sub( "'" + classname + "'" + r'"\1" "\2"', line)
        tx.write(line)
        break       # one file, one line. 
  tx.close()
  print '\tdone'
else:
  print '\tauto'
  removeFiles(['wrap_chkconfig.ltx', 'chkconfig.vars', \
    'chkconfig.classes', 'chklayouts.tex'])
  rmcopy = False
  if not os.path.isfile( 'chkconfig.ltx' ):
    shutil.copy( 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) )
  cl = open('chklayouts.tex', 'w')
  ## 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')
  for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
    glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) :
    if not os.path.isfile(file): continue
    classname = file.split(os.sep)[-1].split('.')[0]
    for line in open(file).readlines():
      if p1.search(line) == None: 
        continue
      if line[0] != '#':
        print "Wrong input layout file with line '" + line
        sys.exit(3)
      cl.write( "\\TestDocClass{%s}{%s}\n" % \
        ( classname, line[1:].strip() ) )
      break
  cl.close()
  #
  # we have chklayouts.tex, then process it
  for line in cmdOutput(LATEX + ' wrap_chkconfig.ltx'):
    if re.match('^\+', line):
      print line,
  #
  #  evalulate lines in chkconfig.vars?
  # is it really necessary?
  for line in open('chkconfig.vars').readlines():
    exec( re.sub('-', '_', line) )
  if rmcopy:   # remove the copied file
    removeFiles( [ 'chkconfig.ltx' ] )

### Do we have all the files we need? Useful if latex did not run

### 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
### 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', '''[EMAIL PROTECTED]@!%s!g
[EMAIL PROTECTED]@!%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():
  try:
    fr, to = p.match(sed).groups()
    for line in range(len(lyxin)):
      lyxin[line] = lyxin[line].replace(fr, to)
  except:
    pass

writeToFile( os.path.join('doc', 'LaTeXConfig.lyx'), 
  ''.join(lyxin))

### Let's check whether spaces are allowed in TeX file names
print "Checking whether TeX allows spaces in file names... ",
if not lyx_check_config:
  tex_allows_spaces = 'false'
else:
  file = open('a b.tex', 'w')
  file.write(r'\message{working^^J}' )
  file.close()
  # FIXME: the bsh version uses < /dev/null which is not portable.
  # Can anyone confirm if this option (-interaction) is available 
  # at other flavor of latex as well?
  if cmdOutput('latex -interaction=nonstopmode "a b.tex"', 0).count('working') 
> 0:
    print 'yes'
    tex_allows_spaces = 'true'
  else:
    print 'no'
    tex_allows_spaces = 'false'
  removeFiles( [ 'a b.tex', 'a b.log', 'texput.log' ])

checkProg('a FIG -> EPS/PPM converter', ['fig2dev'],
  rc_entry = [ 
    r'''\converter fig eps "fig2dev -L eps $$i $$o" ""
\converter fig  ppm     "fig2dev -L ppm $$i $$o" ""
\converter fig  png     "fig2dev -L png $$i $$o" ""''',
    ''])

checkProg('a TIFF -> PS converter', ['tiff2ps $$i > $$o'],
  rc_entry = [ r'\converter tiff        eps     "%%" ""', ''])

checkProg('a TGIF -> EPS/PPM converter', ['tgif'],
  rc_entry = [
    r'''\converter tgif eps "tgif -stdout -print -color -eps $$i > $$o" ""
\converter tgif pdf     "tgif -stdout -print -color -pdf $$i > $$o" ""''',
    ''])

checkProg('a EPS -> PDF converter', ['epstopdf'],
  rc_entry = [ r'\converter eps       pdf      "epstopdf --outfile=$$o $$i" 
""', ''])

path, GRACE = checkProg('a  Grace -> Image converter', ['gracebat'],
  rc_entry = [ 
    r'''\converter agr  eps     "gracebat -hardcopy -printfile $$o -hdevice EPS 
$$i 2>/dev/null" ""
\converter agr  png     "gracebat -hardcopy -printfile $$o -hdevice PNG $$i 
2>/dev/null" ""
\converter agr  jpg     "gracebat -hardcopy -printfile $$o -hdevice JPEG $$i 
2>/dev/null" ""
\converter agr  ppm     "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 
2>/dev/null" ""''',
    ''])

addToRC(r'\font_encoding "%s"' % chk_fontenc)
addToRC(r'\tex_allows_spaces ' + tex_allows_spaces)

if use_cygwin_path_fix == 'true':
  addToRC(r'\cygwin_path_fix_needed ' + use_cygwin_path_fix)

# Remove superfluous files if we are not writing in the main lib
# directory
for file in [outfile, 'textclass.lst', 'packages.lst', \
  'doc/LaTeXConfig.lyx']:
  try:
    # we rename the file first, so that we avoid comparing a file with itself
    os.rename(file, file + '.new')
    mycfg = open( os.path.join(srcdir, file) ).read()
    syscfg = open( file + '.new').read()
    if mycfg == syscfg:
      print "removing ", file, " which is identical to the system global 
version"
      removeFiles( [file + '.new'] )
    else:
      os.rename( file + '.new', file )
  except:  # ignore if file not found
    os.rename( file + '.new', file )
    pass 

# Final clean-up
if not lyx_keep_temps:
  removeFiles(['chkconfig.sed', 'chkconfig.vars',  \
    'wrap_chkconfig.ltx', 'wrap_chkconfig.log', \
    'chklayouts.tex', 'missfont.log'])

Reply via email to