X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=6be80f6fd0dc3abefde8c37d6b4b4badfca4db0b;hb=4a75fe0310ac64a079edab0c07d8f8eebaf519c0;hp=9db8e3a75c17359f053e206224b8e4eddcd8e3dd;hpb=efec6dde3debbea96cb3c413231059ac0565e786;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index 9db8e3a75c..6be80f6fd0 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -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,33 @@ 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']) + #----------------------------------------------------------------- + path, PLATEX = checkProg('pLaTeX, the Japanese LaTeX', ['platex $$i']) + # 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']) + #----------------------------------------------------------------- + # 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 @@ -230,7 +251,7 @@ def checkFormatEntries(dtl_tools): checkViewer('a Tgif viewer and editor', ['tgif'], rc_entry = [r'\Format tgif obj Tgif "" "%%" "%%" "vector"']) # - checkViewer('a FIG viewer and editor', ['xfig'], + checkViewer('a FIG viewer and editor', ['xfig', 'jfig3-itext.jar', 'jfig3.jar'], rc_entry = [r'\Format fig fig FIG "" "%%" "%%" "vector"']) # checkViewer('a Grace viewer and editor', ['xmgrace'], @@ -253,7 +274,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)" "" "" "%%" "" @@ -261,6 +282,8 @@ def checkFormatEntries(dtl_tools): \Format dateout tmp "date (output)" "" "" "%%" "" \Format docbook sgml DocBook B "" "%%" "document" \Format docbook-xml xml "Docbook (XML)" "" "" "%%" "document" +\Format dot dot "Graphviz Dot" "" "" "%%" "vector" +\Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document" \Format literate nw NoWeb N "" "%%" "document" \Format lilypond ly "LilyPond music" "" "" "%%" "vector" \Format latex tex "LaTeX (plain)" L "" "%%" "document" @@ -271,6 +294,13 @@ def checkFormatEntries(dtl_tools): \Format text3 txt "Plain text (ps2ascii)" "" "" "%%" "document" \Format text4 txt "Plain text (catdvi)" "" "" "%%" "document" \Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document"''' ]) + # + checkViewer('a BibTeX editor', ['sensible-editor', 'jabref', 'JabRef', \ + 'pybliographic', 'bibdesk', 'gbib', 'kbib', \ + 'kbibtex', 'sixpack', 'bibedit', 'tkbibtex' \ + 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \ + 'nedit', 'gedit', 'notepad'], + rc_entry = [r'''\Format bibtex bib "BibTeX" "" "" "%%" ""''' ]) # #checkProg('a Postscript interpreter', ['gs'], # rc_entry = [ r'\ps_command "%%"' ]) @@ -288,7 +318,7 @@ def checkFormatEntries(dtl_tools): 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'], rc_entry = [r'\Format html html HTML H "%%" "" "document"']) @@ -301,6 +331,7 @@ def checkFormatEntries(dtl_tools): # # entried that do not need checkProg addToRC(r'''\Format date "" "date command" "" "" "" "" +\Format csv csv "Table (CSV)" "" "" "" "document" \Format fax "" Fax "" "" "" "document" \Format lyx lyx LyX "" "" "" "" \Format lyx13x lyx13 "LyX 1.3.x" "" "" "" "document" @@ -310,6 +341,7 @@ def checkFormatEntries(dtl_tools): \Format jlyx cjklyx "CJK LyX 1.4.x (euc-jp)" "" "" "" "document" \Format klyx cjklyx "CJK LyX 1.4.x (euc-kr)" "" "" "" "document" \Format lyxpreview lyxpreview "LyX Preview" "" "" "" "" +\Format lyxpreview-platex lyxpreview-platex "LyX Preview (pLaTeX)" "" "" "" "" \Format pdftex pdftex_t PDFTEX "" "" "" "" \Format program "" Program "" "" "" "" \Format pstex pstex_t PSTEX "" "" "" "" @@ -346,7 +378,8 @@ def checkConverterEntries(): checkProg('a Noweb -> LaTeX converter', ['noweave -delay -index $$i > $$o'], rc_entry = [ r'\converter literate latex "%%" ""' ]) # - checkProg('an HTML -> LaTeX converter', ['html2latex $$i'], + checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex $$i', \ + 'htmltolatex -input $$i -output $$o', 'java -jar htmltolatex.jar -input $$i -output $$o'], rc_entry = [ r'\converter html latex "%%" ""' ]) # checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'], @@ -376,14 +409,18 @@ def checkConverterEntries(): rc_entry = [ r'\converter odt latex "%%" ""' ]) # 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', \ - 'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\''], + checkProg('a LaTeX -> Open Document converter', [ + 'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\'', \ + 'oolatex $$i', 'oolatex.sh $$i', \ + '/usr/share/tex4ht/oolatex $$i'], 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'], rc_entry = [ r'\converter latex rtf "%%" "needaux"' ]) # + checkProg('a RTF -> HTML converter', ['unrtf --html $$i > $$o'], + rc_entry = [ r'\converter rtf html "%%" ""' ]) + # checkProg('a PS to PDF converter', ['ps2pdf13 $$i $$o'], rc_entry = [ r'\converter ps pdf "%%" ""' ]) # @@ -393,6 +430,15 @@ def checkConverterEntries(): checkProg('a PS to TXT converter', ['ps2ascii $$i $$o'], rc_entry = [ r'\converter ps text3 "%%" ""' ]) # + checkProg('a PS to EPS converter', ['ps2eps $$i'], + rc_entry = [ r'\converter ps eps "%%" ""' ]) + # + checkProg('a PDF to PS converter', ['pdf2ps $$i $$o', 'pdftops $$i $$o'], + rc_entry = [ r'\converter pdf ps "%%" ""' ]) + # + checkProg('a PDF to EPS converter', ['pdftops -eps -f 1 -l 1 $$i $$o'], + rc_entry = [ r'\converter pdf eps "%%" ""' ]) + # checkProg('a DVI to TXT converter', ['catdvi $$i > $$o'], rc_entry = [ r'\converter dvi text4 "%%" ""' ]) # @@ -450,6 +496,9 @@ def checkConverterEntries(): \converter agr ppm "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 2>/dev/null" ""''', '']) # + checkProg('a Dot -> PDF converter', ['dot -Tpdf $$i -o $$o'], + rc_entry = [ r'\converter dot pdf "%%" ""']) + # # path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond']) if (lilypond != ''): @@ -477,6 +526,8 @@ def checkConverterEntries(): # # Entries that do not need checkProg addToRC(r'''\converter lyxpreview ppm "python -tt $$s/scripts/lyxpreview2bitmap.py" "" +\converter lyxpreview-platex ppm "python -tt $$s/scripts/lyxpreview-platex2bitmap.py" "" +\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" "" @@ -539,6 +590,12 @@ def checkOtherEntries(): r'\plaintext_roff_command ""' ]) checkProg('ChkTeX', ['chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38'], rc_entry = [ r'\chktex_command "%%"' ]) + checkProg('BibTeX', ['jbibtex', 'bibtex'], + rc_entry = [ r'\bibtex_command "%%"' ]) + checkProg('an index processor', ['texindy', 'makeindex -c -q'], + 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 @@ -591,12 +648,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') @@ -626,6 +689,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', \ @@ -668,7 +734,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 @@ -684,59 +751,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(): @@ -761,35 +782,73 @@ def checkModulesConfig(): tx.close() print '\tdone' + def processModuleFile(file, bool_docbook, bool_linuxdoc): ''' process module file and get a line of result - Declare lines look like this: - \DeclareLyXModule[LaTeX Packages]{Description}{ModuleName}... + The top of a module file should look like this: + #\DeclareLyXModule[LaTeX Packages]{ModuleName} + #BeginDescription + #...body of description... + #EndDescription + #Requires: [list of required modules] + #Excludes: [list of excluded modules] + The last two lines are optional We expect output: - "ModuleName" "filename" "Description" "Packages" - " + "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" ''' - p = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*)\])?{(.*)}{(.*)}') + p = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') + r = re.compile(r'#+\s*Requires: (.*)') + x = re.compile(r'#+\s*Excludes: (.*)') + b = re.compile(r'#+\s*DescriptionBegin\s*$') + e = re.compile(r'#+\s*DescriptionEnd\s*$') + + modname = desc = pkgs = req = excl = "" + readingDescription = False + descLines = [] + filename = file.split(os.sep)[-1] + filename = filename[:-7] + for line in open(file).readlines(): - res = p.search(line) + if readingDescription: + res = e.search(line) if res != None: - (packages, desc, modname) = res.groups() - #check availability...need to add that - if packages == None: - packages = "" - else: - pkgs = [s.strip() for s in packages.split(",")] - packages = ",".join(pkgs) - - filename = file.split(os.sep)[-1] - return '"%s" "%s" "%s" "%s"\n' % (modname, filename, desc, packages) + readingDescription = False + desc = " ".join(descLines) + continue + descLines.append(line[1:].strip()) + continue + res = b.search(line) + if res != None: + readingDescription = True + continue + res = p.search(line) + if res != None: + (pkgs, modname) = res.groups() + if pkgs == None: + pkgs = "" + else: + tmp = [s.strip() for s in pkgs.split(",")] + pkgs = ",".join(tmp) + continue + res = r.search(line) + if res != None: + req = res.group(1) + tmp = [s.strip() for s in req.split("|")] + req = "|".join(tmp) + continue + res = x.search(line) + if res != None: + excl = res.group(1) + tmp = [s.strip() for s in excl.split("|")] + excl = "|".join(tmp) + 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) - - def checkTeXAllowSpaces(): ''' Let's check whether spaces are allowed in TeX file names ''' tex_allows_spaces = 'false' @@ -813,7 +872,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']) @@ -881,7 +940,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)