X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=210aad99b74ded4c40c79db60b90885ef4578bfe;hb=246baa610eecba28100fdc4f9363e38bc3735cbf;hp=093b2867442dd1dbb6b79aa9ae0814c3bf621ab5;hpb=8151f74f2174339c79511e87592dda6c494d27d4;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index 093b286744..210aad99b7 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -104,6 +104,7 @@ def checkTeXPaths(): inpname = tmpfname.replace('\\', '/') else: inpname = cmdOutput('cygpath -m ' + tmpfname) + logname = os.path.basename(inpname.replace('.ltx', '.log')) inpname = inpname.replace('~', '\\string~') os.write(fd, r'\relax') os.close(fd) @@ -114,7 +115,7 @@ def checkTeXPaths(): else: print "configure: TeX engine needs windows-style paths in latex files" windows_style_tex_paths = 'true' - removeFiles([tmpfname, 'texput.log']) + removeFiles([tmpfname, logname, 'texput.log']) return windows_style_tex_paths @@ -157,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' @@ -201,7 +204,7 @@ def checkLatex(dtl_tools): \converter dvi2 dvi "python -tt $$s/scripts/clean_dvi.py $$i $$o" ""''' else: converter_entry = r'\converter latex dvi "%%" "latex"' - path, LATEX = checkProg('a Latex2e program', ['pplatex $$i', 'latex $$i', 'latex2e $$i'], + path, LATEX = checkProg('a Latex2e program', ['pplatex $$i', 'platex $$i', 'latex $$i', 'latex2e $$i'], rc_entry = [converter_entry]) # no latex if LATEX != '': @@ -287,7 +290,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"']) @@ -304,6 +307,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" @@ -349,19 +353,22 @@ def checkConverterEntries(): # checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'], rc_entry = [ r'\converter word latex "%%" ""' ]) - # - path, htmlconv = checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'tth -t -e2 -L$$b < $$i > $$o', \ + # On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/ + path, htmlconv = checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'htlatex.sh $$i', \ + '/usr/share/tex4ht/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 "%%" "needaux"' ]) - if htmlconv == 'htlatex' or htmlconv == 'latex2html': + if htmlconv.find('htlatex') >= 0 or htmlconv == 'latex2html': addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py -e html,png,css $$i $$o"''') else: addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py $$i $$o"''') - # - path, htmlconv = checkProg('a LaTeX -> MS Word converter', ["htlatex $$i 'html,word' 'symbol/!' '-cvalidate'"], + # On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/ + path, htmlconv = checkProg('a LaTeX -> MS Word converter', ["htlatex $$i 'html,word' 'symbol/!' '-cvalidate'", \ + "htlatex.sh $$i 'html,word' 'symbol/!' '-cvalidate'", \ + "/usr/share/tex4ht/htlatex $$i 'html,word' 'symbol/!' '-cvalidate'"], rc_entry = [ r'\converter latex wordhtml "%%" "needaux"' ]) - if htmlconv == 'htlatex': + if htmlconv.find('htlatex') >= 0: addToRC(r'''\copier wordhtml "python -tt $$s/scripts/ext_copy.py -e html,png,css $$i $$o"''') # checkProg('an OpenOffice.org -> LaTeX converter', ['w2l -clean $$i'], @@ -369,8 +376,11 @@ def checkConverterEntries(): # checkProg('an OpenDocument -> LaTeX converter', ['w2l -clean $$i'], rc_entry = [ r'\converter odt latex "%%" ""' ]) - # - checkProg('a LaTeX -> Open Document converter', ['oolatex $$i', 'oolatex.sh $$i', 'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\''], + # 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\''], 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'], @@ -476,6 +486,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" "" @@ -582,12 +593,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') @@ -617,13 +634,16 @@ 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', \ 'chkconfig.classes', 'chklayouts.tex']) rmcopy = False if not os.path.isfile( 'chkconfig.ltx' ): - shutil.copy( os.path.join(srcdir, 'chkconfig.ltx'), '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) ) @@ -659,7 +679,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 @@ -675,59 +696,64 @@ 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. + # 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(): + removeFiles(['lyxmodules.lst']) + + print '+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 +## Use "Options/Reconfigure" 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]) + # build the list of available modules + foundClasses = [] + for file in glob.glob( os.path.join('layouts', '*.module') ) + \ + glob.glob( os.path.join(srcdir, 'layouts', '*.module' ) ) : + # valid file? + print file + if not os.path.isfile(file): + continue + tx.write(processModuleFile(file, bool_docbook, bool_linuxdoc)) + 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}... + We expect output: + "ModuleName" "filename" "Description" "Packages" + " + ''' + p = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*)\])?{(.*)}{(.*)}') + for line in open(file).readlines(): + res = p.search(line) + if res != None: + (packages, desc, modname) = res.groups() + #check availability...need to add that + if packages == None: + packages = "" 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)) + 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) + print "Module file without \DeclareLyXModule line. " + sys.exit(2) + + def checkTeXAllowSpaces(): @@ -753,7 +779,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']) @@ -821,6 +847,8 @@ 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() + sys.exit(ret)