X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=9cb6e4f65baf3bebb54a77a8c4f94f923b7b14a1;hb=e54ae72e5fac6f750c3f7972c74bb42b57f3a049;hp=0ab15c7a800f69614f165bc8f2c2ee1c5fb068a2;hpb=f3b66682f272645bef8f270f766cc6e70392da25;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index 0ab15c7a80..9cb6e4f65b 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -1,4 +1,5 @@ #! /usr/bin/env python +# -*- coding: utf-8 -*- # # file configure.py # This file is part of LyX, the document processor. @@ -7,12 +8,27 @@ # \author Bo Peng # Full author contact details are available in file CREDITS. -# This is an experimental version of the configure script, written -# in Python. - 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) + + def writeToFile(filename, lines, append = False): " utility function: write or append lines to filename " if append: @@ -88,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) @@ -98,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 @@ -165,12 +182,21 @@ def checkViewer(description, progs, rc_entry = [], path = []): return checkProg(description, progs, rc_entry, path, not_found = 'auto') -def checkLatex(): - ''' Check latex, return lyx_check_config ''' +def checkDTLtools(): + ''' Check whether DTL tools are available (Windows only) ''' # Find programs! Returned path is not used now if ((os.name == 'nt' or sys.platform == 'cygwin') and checkProg('DVI to DTL converter', ['dv2dt']) != ['', ''] and checkProg('DTL to DVI converter', ['dt2dv']) != ['', '']): + dtl_tools = True + else: + dtl_tools = False + return dtl_tools + + +def checkLatex(dtl_tools): + ''' Check latex, return lyx_check_config ''' + 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" ""''' @@ -199,22 +225,22 @@ def checkLatex(): return '' -def checkFormatEntries(): +def checkFormatEntries(dtl_tools): ''' Check all formats (\Format entries) ''' checkViewer('a Tgif viewer and editor', ['tgif'], - rc_entry = [r'\Format tgif obj Tgif "" "%%" "%%" ""']) + rc_entry = [r'\Format tgif obj Tgif "" "%%" "%%" "vector"']) # checkViewer('a FIG viewer and editor', ['xfig'], - rc_entry = [r'\Format fig fig FIG "" "%%" "%%" ""']) + rc_entry = [r'\Format fig fig FIG "" "%%" "%%" "vector"']) # checkViewer('a Grace viewer and editor', ['xmgrace'], - rc_entry = [r'\Format agr agr Grace "" "%%" "%%" ""']) + rc_entry = [r'\Format agr agr Grace "" "%%" "%%" "vector"']) # 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']) - path, ie = checkViewer('a raster image editor', ['gimp']) + path, iv = checkViewer('a raster image viewer', ['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" "" \Format jpg jpg JPEG "" "%s" "%s" "" @@ -236,6 +262,7 @@ def checkFormatEntries(): \Format docbook sgml DocBook B "" "%%" "document" \Format docbook-xml xml "Docbook (XML)" "" "" "%%" "document" \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" @@ -243,43 +270,54 @@ def checkFormatEntries(): \Format text2 txt "Plain text (pstotext)" "" "" "%%" "document" \Format text3 txt "Plain text (ps2ascii)" "" "" "%%" "document" \Format text4 txt "Plain text (catdvi)" "" "" "%%" "document" -\Format textparagraph txt "Plain text (paragraphs)" "" "" "%%" "document"''' ]) +\Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document"''' ]) # #checkProg('a Postscript interpreter', ['gs'], # rc_entry = [ r'\ps_command "%%"' ]) - checkViewer('a Postscript previewer', ['gv', 'ghostview -swap', 'kghostview'], - rc_entry = [r'''\Format eps eps EPS "" "%%" "" "" -\Format ps ps Postscript t "%%" "" "document"''']) + checkViewer('a Postscript previewer', ['kghostview', 'evince', 'gv', 'ghostview -swap'], + rc_entry = [r'''\Format eps eps EPS "" "%%" "" "vector" +\Format ps ps Postscript t "%%" "" "document,vector"''']) # - checkViewer('a PDF previewer', ['acrobat', 'acroread', 'gv', 'ghostview', \ - 'xpdf', 'kpdf', 'kghostview'], - rc_entry = [r'''\Format pdf pdf "PDF (ps2pdf)" P "%%" "" "document" -\Format pdf2 pdf "PDF (pdflatex)" F "%%" "" "document" -\Format pdf3 pdf "PDF (dvipdfm)" m "%%" "" "document"''']) + checkViewer('a PDF previewer', ['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'], - rc_entry = [r'\Format dvi dvi DVI D "%%" "" "document"']) - if ((os.name == 'nt' or sys.platform == 'cygwin') and - checkProg('DVI to DTL converter', ['dv2dt']) != ['', ''] and - checkProg('DTL to DVI converter', ['dt2dv']) != ['', '']): + rc_entry = [r'\Format dvi dvi DVI D "%%" "" "document,vector"']) + if dtl_tools: # Windows only: DraftDVI - addToRC(r'\Format dvi2 dvi DraftDVI "" "" "document"') + addToRC(r'\Format dvi2 dvi DraftDVI "" "" "document,vector"') # - checkViewer('a HTML previewer', ['mozilla file://$$p$$i', 'netscape'], + checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'], rc_entry = [r'\Format html html HTML H "%%" "" "document"']) # + checkViewer('Noteedit', ['noteedit'], + rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector"']) + # + checkViewer('an OpenDocument viewer', ['oowriter'], + rc_entry = [r'\Format odt odt OpenDocument "" "%%" "%%" "document,vector"']) + # # entried that do not need checkProg addToRC(r'''\Format date "" "date command" "" "" "" "" \Format fax "" Fax "" "" "" "document" \Format lyx lyx LyX "" "" "" "" \Format lyx13x lyx13 "LyX 1.3.x" "" "" "" "document" +\Format lyx14x lyx14 "LyX 1.4.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" \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 "" "" "document" -\Format word doc "MS Word" W "" "" "document" -\Format wordhtml html "MS Word (HTML)" "" "" "" "document" +\Format rtf rtf "Rich Text Format" "" "" "" "document,vector" +\Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector" +\Format wmf wmf "Windows Metafile" "" "" "" "vector" +\Format emf emf "Enhanced Metafile" "" "" "" "vector" +\Format word doc "MS Word" W "" "" "document,vector" +\Format wordhtml html "HTML (MS Word)" "" "" "" "document" ''') @@ -297,33 +335,47 @@ def checkConverterEntries(): os.environ["PATH"] = os.path.join('..', 'src', 'tex2lyx') + \ os.pathsep + path_orig - checkProg('a LaTeX -> LyX converter', ['tex2lyx -f $$i $$o', \ - 'tex2lyx' + version_suffix + ' -f $$i $$o' ], - rc_entry = [ r'\converter latex lyx "%%" ""' ]) + checkProg('a LaTeX/Noweb -> LyX converter', ['tex2lyx', 'tex2lyx' + version_suffix], + rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" "" +\converter literate lyx "%% -n -f $$i $$o" ""''']) os.environ["PATH"] = path_orig - # - checkProg('a Noweb -> LyX converter', ['noweb2lyx' + version_suffix + ' $$i $$o'], path = ['./reLyX'], - rc_entry = [ r'\converter literate lyx "%%" ""' ]) # checkProg('a Noweb -> LaTeX converter', ['noweave -delay -index $$i > $$o'], rc_entry = [ r'\converter literate latex "%%" ""' ]) # - checkProg('a HTML -> LaTeX converter', ['html2latex $$i'], + checkProg('an HTML -> LaTeX converter', ['html2latex $$i'], rc_entry = [ r'\converter html latex "%%" ""' ]) # - checkProg('a MSWord -> LaTeX converter', ['wvCleanLatex $$i $$o'], + checkProg('an MS Word -> 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 "%%" ""' ]) + path, htmlconv = 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 "%%" "needaux"' ]) + if htmlconv == 'htlatex' 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'"], + rc_entry = [ r'\converter latex wordhtml "%%" "needaux"' ]) + if htmlconv == 'htlatex': + 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'], 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('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\''], + 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 PS to PDF converter', ['ps2pdf13 $$i $$o'], rc_entry = [ r'\converter ps pdf "%%" ""' ]) @@ -370,9 +422,19 @@ def checkConverterEntries(): \converter tgif pdf "tgif -stdout -print -color -pdf $$i > $$o" ""''', '']) # - checkProg('a EPS -> PDF converter', ['epstopdf'], + checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'], + rc_entry = [ r'\converter wmf eps "%%" ""']) + # + checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'], + rc_entry = [ r'\converter emf eps "%%" ""']) + # + checkProg('an EPS -> PDF converter', ['epstopdf'], rc_entry = [ r'\converter eps pdf "epstopdf --outfile=$$o $$i" ""', '']) # + # no agr -> pdf converter, since the pdf library used by gracebat is not + # free software and therefore not compiled in in many installations. + # Fortunately, this is not a big problem, because we will use epstopdf to + # convert from agr to pdf via eps without loss of quality. checkProg('a Grace -> Image converter', ['gracebat'], rc_entry = [ r'''\converter agr eps "gracebat -hardcopy -printfile $$o -hdevice EPS $$i 2>/dev/null" "" @@ -381,21 +443,46 @@ def checkConverterEntries(): \converter agr ppm "gracebat -hardcopy -printfile $$o -hdevice PNM $$i 2>/dev/null" ""''', '']) # - 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"' ]) + # + path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond']) + if (lilypond != ''): + version_string = cmdOutput("lilypond --version") + match = re.match('GNU LilyPond (\S+)', version_string) + 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): + 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 + else: + print '+ found LilyPond, but version %s is too old.' % version_number + else: + print '+ found LilyPond, but could not extract version number.' + # + checkProg('a Noteedit -> LilyPond converter', ['noteedit --export-lilypond $$i'], + rc_entry = [ r'\converter noteedit lilypond "%%" ""', '']) # # FIXME: no rc_entry? comment it out # checkProg('Image converter', ['convert $$i $$o']) # - # Entried that do not need checkProg + # Entries that do not need checkProg addToRC(r'''\converter lyxpreview ppm "python -tt $$s/scripts/lyxpreview2bitmap.py" "" -\converter date dateout "date +%d-%m-%Y > $$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" "" \converter fig pdftex "python -tt $$s/scripts/fig2pdftex.py $$i $$o" "" \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 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" "" +\converter clyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c big5 $$i > $$o" "" +\converter jlyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp $$i > $$o" "" +\converter klyx lyx "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr $$i > $$o" "" ''') @@ -439,9 +526,9 @@ def checkOtherEntries(): ''' entries other than Format and Converter ''' checkProg('a *roff formatter', ['groff', 'nroff'], rc_entry = [ - r'\ascii_roff_command "groff -t -Tlatin1 $$FName"', - r'\ascii_roff_command "tbl $$FName | nroff"', - r'\ascii_roff_command ""' ]) + 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('a spellchecker', ['ispell'], @@ -461,13 +548,14 @@ def checkOtherEntries(): addToRC(r'''\copier fig "python -tt $$s/scripts/fig_copy.py $$i $$o" \copier pstex "python -tt $$s/scripts/tex_copy.py $$i $$o $$l" \copier pdftex "python -tt $$s/scripts/tex_copy.py $$i $$o $$l" +\copier program "python -tt $$s/scripts/ext_copy.py $$i $$o" ''') def processLayoutFile(file, bool_docbook, bool_linuxdoc): ''' process layout file and get a line of result - Declear line are like this: (article.layout, scrbook.layout, svjog.layout) + Declare lines look like this: (article.layout, scrbook.layout, svjog.layout) \DeclareLaTeXClass{article} \DeclareLaTeXClass[scrbook]{book (koma-script)} @@ -480,7 +568,7 @@ def processLayoutFile(file, bool_docbook, bool_linuxdoc): "svjog" "svjour" "article (Springer - svjour/jog)" "false" ''' classname = file.split(os.sep)[-1].split('.')[0] - # return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclearLaTeXClass[a,b,c]{article} + # 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*{(.*)}') for line in open(file).readlines(): res = p.search(line) @@ -490,7 +578,7 @@ def processLayoutFile(file, bool_docbook, bool_linuxdoc): if opt == None: opt = classname return '"%s" "%s" "%s" "%s"\n' % (classname, opt, desc, avai) - print "Layout file without \DeclearXXClass line. " + print "Layout file without \DeclareXXClass line. " sys.exit(2) @@ -508,7 +596,7 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc): # 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 +# for some reason. Run ./configure.py if you need to update it after a # configuration change. ''') # build the list of available layout files and convert it to commands @@ -536,14 +624,14 @@ def checkLatexConfig(check_config, bool_docbook, bool_linuxdoc): '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) ) # 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') + p1 = re.compile(r'\Declare(LaTeX|DocBook)Class') testclasses = list() for file in glob.glob( os.path.join('layouts', '*.layout') ) + \ glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) : @@ -603,7 +691,7 @@ def createLaTeXConfig(): 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 +### 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' @@ -678,6 +766,7 @@ 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' ]: @@ -698,7 +787,11 @@ Options: else: 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 == '': @@ -709,17 +802,18 @@ Options: setEnviron() createDirectories() windows_style_tex_paths = checkTeXPaths() + dtl_tools = checkDTLtools() ## Write the first part of outfile writeToFile(outfile, '''# This file has been automatically generated by LyX' lib/configure.py # 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 +# want to customize LyX, use LyX' Preferences dialog or modify directly +# the "preferences" file instead. Any setting in that file will # override the values given here. ''') # check latex - LATEX = checkLatex() - checkFormatEntries() + LATEX = checkLatex(dtl_tools) + checkFormatEntries(dtl_tools) checkConverterEntries() (chk_linuxdoc, bool_linuxdoc, linuxdoc_cmd) = checkLinuxDoc() (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()