0024275: Cppcheck warnings on uninitialized class members
[occt.git] / dox / occdoc.tcl
1 # -----------------------------------------------------------------------
2 #  Script name: CompileDocs.tcl
3 #  This script compiles OCCT documents from *.md files to HTML pages
4 #  Author: omy
5 # -----------------------------------------------------------------------
6
7 # get OCCT version from file Standard_Version.hxx (if available)
8 proc OverviewDoc_DetectCasVersion {theCasRoot} {
9   set occt_ver 16.7.0
10   set occt_ver_add ""
11   if { [file exist $theCasRoot/src/Standard/Standard_Version.hxx] } {
12     set fh [open $theCasRoot/src/Standard/Standard_Version.hxx]
13     set fh_loaded [read $fh]
14     close $fh
15     regexp {[^/]\s*#\s*define\s+OCC_VERSION_COMPLETE\s+\"([^\s]*)\"} $fh_loaded dummy occt_ver
16     regexp {#\s*define\s+OCC_VERSION_DEVELOPMENT\s+\"([^\s]*)\"} $fh_loaded dummy occt_ver_add
17     if { "$occt_ver_add" != "" } { set occt_ver ${occt_ver}.$occt_ver_add }
18   }
19   return $occt_ver
20 }
21
22 # Generates Doxygen configuration file for Overview documentation
23 proc OverviewDoc_MakeDoxyfile {casDir outDir tagFileDir {doxyFileName} {generatorMode ""} DocFilesList verboseMode searchMode} {
24
25     set doxyFile [open $doxyFileName "w"]
26     set casroot  $casDir
27     set inputDir $casDir/dox
28
29     # Common configs
30     puts $doxyFile "DOXYFILE_ENCODING      = UTF-8"
31     puts $doxyFile "PROJECT_NAME           = \"Open CASCADE Technology\""
32     puts $doxyFile "PROJECT_NUMBER         = [OverviewDoc_DetectCasVersion $casDir]"
33     puts $doxyFile "PROJECT_BRIEF          = "
34     puts $doxyFile "PROJECT_LOGO           = $inputDir/resources/occ_logo.png"
35
36     puts $doxyFile "OUTPUT_DIRECTORY       = $outDir"
37     puts $doxyFile "CREATE_SUBDIRS         = NO"
38     puts $doxyFile "OUTPUT_LANGUAGE        = English"
39     puts $doxyFile "ABBREVIATE_BRIEF       = \"The \$name class\" \
40                                              \"The \$name widget\" \
41                                              \"The \$name file\" \
42                                              is \
43                                              provides \
44                                              specifies \
45                                              contains \
46                                              represents \
47                                              a \
48                                              an \
49                                              the"
50
51     puts $doxyFile "FULL_PATH_NAMES        = YES"
52     puts $doxyFile "INHERIT_DOCS           = YES"
53     puts $doxyFile "TAB_SIZE               = 4"
54     puts $doxyFile "MARKDOWN_SUPPORT       = YES"
55     puts $doxyFile "EXTRACT_ALL            = YES"
56     puts $doxyFile "CASE_SENSE_NAMES       = NO"
57     puts $doxyFile "INLINE_INFO            = YES"
58     puts $doxyFile "SORT_MEMBER_DOCS       = YES"
59     puts $doxyFile "WARNINGS               = YES"
60     puts $doxyFile "WARN_IF_UNDOCUMENTED   = YES"
61     puts $doxyFile "WARN_IF_DOC_ERROR      = YES"
62     puts $doxyFile "WARN_NO_PARAMDOC       = NO"
63     puts $doxyFile "WARN_FORMAT            = \"\$file:\$line: \$text\""
64     puts $doxyFile "INPUT_ENCODING         = UTF-8"
65     puts $doxyFile "FILE_PATTERNS          = *.md *.dox "
66     puts $doxyFile "RECURSIVE              = YES"
67     puts $doxyFile "SOURCE_BROWSER         = NO"
68     puts $doxyFile "INLINE_SOURCES         = YES"
69     puts $doxyFile "COLS_IN_ALPHA_INDEX    = 5"
70     
71     # Generation options
72     puts $doxyFile "GENERATE_DOCSET        = NO"
73     puts $doxyFile "GENERATE_HTMLHELP      = NO"
74     puts $doxyFile "GENERATE_CHI           = NO"
75     puts $doxyFile "GENERATE_QHP           = NO"
76     puts $doxyFile "GENERATE_ECLIPSEHELP   = NO"
77     puts $doxyFile "GENERATE_RTF           = NO"
78     puts $doxyFile "GENERATE_MAN           = NO"
79     puts $doxyFile "GENERATE_XML           = NO"
80     puts $doxyFile "GENERATE_DOCBOOK       = NO"
81     puts $doxyFile "GENERATE_AUTOGEN_DEF   = NO"
82     puts $doxyFile "GENERATE_PERLMOD       = NO"
83
84     set PARAM_INPUT "INPUT                  ="
85     set PARAM_IMAGEPATH "IMAGE_PATH             = $inputDir/resources/ "
86
87     foreach docFile $DocFilesList {
88         set NEW_IMG_PATH [file normalize [file dirname "$inputDir/$docFile"]]
89         if { [string compare $NEW_IMG_PATH $casroot] != 0 } {
90           if {[file isdirectory "$NEW_IMG_PATH/images"]} {
91             append PARAM_IMAGEPATH " $NEW_IMG_PATH/images"
92           }
93         }
94         append PARAM_INPUT " " $inputDir/$docFile
95     }
96     puts $doxyFile $PARAM_INPUT
97     puts $doxyFile $PARAM_IMAGEPATH
98
99     if { $generatorMode == "HTML_ONLY"} {
100         # Set a reference to a TAGFILE
101         if { $tagFileDir != "" } {
102             if {[file exists $tagFileDir/OCCT.tag] == 1} {
103                 set tagPath [OverviewDoc_GetRelPath $tagFileDir $outDir/html]
104                 puts $doxyFile "TAGFILES               = $tagFileDir/OCCT.tag=$tagPath/html"
105             }
106         }
107         # HTML Output
108         puts $doxyFile "GENERATE_LATEX         = NO"
109         puts $doxyFile "GENERATE_HTML          = YES"
110         puts $doxyFile "HTML_COLORSTYLE_HUE    = 220"
111         puts $doxyFile "HTML_COLORSTYLE_SAT    = 100"
112         puts $doxyFile "HTML_COLORSTYLE_GAMMA  = 80"
113         puts $doxyFile "HTML_TIMESTAMP         = YES"
114         puts $doxyFile "HTML_DYNAMIC_SECTIONS  = YES"
115         puts $doxyFile "HTML_INDEX_NUM_ENTRIES = 100"
116         puts $doxyFile "DISABLE_INDEX          = YES"
117         puts $doxyFile "GENERATE_TREEVIEW      = YES"
118         puts $doxyFile "ENUM_VALUES_PER_LINE   = 8"
119         puts $doxyFile "TREEVIEW_WIDTH         = 250"
120         puts $doxyFile "EXTERNAL_PAGES         = NO"
121         # HTML Search engine options
122         if { [string tolower $searchMode] == "none" } {
123           puts $doxyFile "SEARCHENGINE           = NO"
124           puts $doxyFile "SERVER_BASED_SEARCH    = NO"
125           puts $doxyFile "EXTERNAL_SEARCH        = NO"
126         } else {
127           puts $doxyFile "SEARCHENGINE           = YES"
128           if { [string tolower $searchMode] == "local" } {
129             puts $doxyFile "SERVER_BASED_SEARCH    = NO"
130             puts $doxyFile "EXTERNAL_SEARCH        = NO"
131           } elseif { [string tolower $searchMode] == "server" } {
132             puts $doxyFile "SERVER_BASED_SEARCH    = YES"
133             puts $doxyFile "EXTERNAL_SEARCH        = NO"
134           } elseif { [string tolower $searchMode] == "external" } {
135             puts $doxyFile "SERVER_BASED_SEARCH    = YES"
136             puts $doxyFile "EXTERNAL_SEARCH        = YES"
137           } else {
138             puts "ERROR: Wrong search engine type"
139             close $doxyFile 
140             return
141           }
142         }
143         puts $doxyFile "SEARCHDATA_FILE        = searchdata.xml"
144         puts $doxyFile "SKIP_FUNCTION_MACROS   = YES"
145         # Formula options
146         puts $doxyFile "FORMULA_FONTSIZE       = 12"
147         puts $doxyFile "FORMULA_TRANSPARENT    = YES"
148         puts $doxyFile "USE_MATHJAX            = YES"
149         puts $doxyFile "MATHJAX_FORMAT         = HTML-CSS"
150         puts $doxyFile "MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest"
151         
152     } elseif { $generatorMode == "PDF_ONLY"} {
153         
154         puts $doxyFile "GENERATE_HTML          = NO"
155         puts $doxyFile "DISABLE_INDEX          = YES"
156         puts $doxyFile "GENERATE_TREEVIEW      = NO"
157         puts $doxyFile "PREDEFINED             = PDF_ONLY"
158         puts $doxyFile "GENERATE_LATEX         = YES"
159         puts $doxyFile "COMPACT_LATEX          = YES"
160         puts $doxyFile "PDF_HYPERLINKS         = YES"
161         puts $doxyFile "USE_PDFLATEX           = YES"
162         puts $doxyFile "LATEX_BATCHMODE        = YES"
163         puts $doxyFile "LATEX_OUTPUT           = latex"
164         puts $doxyFile "LATEX_CMD_NAME         = latex"
165         puts $doxyFile "MAKEINDEX_CMD_NAME     = makeindex"
166     }
167
168     close $doxyFile 
169 }
170
171 # Returns the relative path between two directories
172 proc OverviewDoc_GetRelPath {targetFile currentpath} {
173   set cc [file split [file normalize $currentpath]]
174   set tt [file split [file normalize $targetFile]]
175   
176   if {![string equal [lindex $cc 0] [lindex $tt 0]]} {
177       # not on *n*x then
178       return -code error "$targetFile not on same volume as $currentpath"
179   }
180   while {[string equal [lindex $cc 0] [lindex $tt 0]] && [llength $cc] > 0} {
181       # discard matching components from the front
182       set cc [lreplace $cc 0 0]
183       set tt [lreplace $tt 0 0]
184   }
185   set prefix ""
186   if {[llength $cc] == 0} {
187       # just the file name, so targetFile is lower down (or in same place)
188       set prefix "."
189   }
190   # step up the tree
191   for {set i 0} {$i < [llength $cc]} {incr i} {
192       append prefix " .."
193   }
194   # stick it all together (the eval is to flatten the targetFile list)
195   return [eval file join $prefix $tt]
196 }
197
198 # Prints Help message
199 proc OverviewDoc_PrintHelpMessage {} {
200     puts "\nUsage : occdoc \[-h\] \[-html\] \[-pdf\] \[-m=<list of files>\] \[-l=<document name>\] \[-v\] \[-s\]"
201     puts ""
202     puts " Options are : "
203     puts "    -html                : To generate HTML files"
204     puts "                           (cannot be used with -pdf)"
205     puts "    -pdf                 : To generate PDF files"
206     puts "                           (cannot be used with -html)"
207     puts "    -m=<modules_list>    : Specifies list of documents to generate."
208     puts "                           If it is not specified, all files, "
209     puts "                           mentioned in FILES.txt are processed."
210     puts "    -l=<document_name>   : Specifies the document caption "
211     puts "                           for a single document"
212     puts "    -h                   : Prints help message"
213     puts "    -v                   : Specifies the Verbose mode"
214     puts "                           (info on all script actions is shown)"
215     puts "    -s=<search_mode>     : Specifies the Search mode of HTML documents."
216     puts "                           Can be: none | local | server | external | "
217     puts "                         : Can be used only with -html option"
218 }
219
220 # Parses command line arguments
221 proc OverviewDoc_ParseArguments {arguments} {
222     global args_names
223     global args_values
224     set args_names {}
225     array set args_values {}
226
227     foreach arg $arguments {
228         if {[regexp {^(-)[a-z]+$} $arg] == 1} {
229             set name [string range $arg 1 [string length $arg]-1]
230             lappend args_names $name
231             set args_values($name) "NULL"
232             continue
233         } elseif {[regexp {^(-)[a-z]+=.+$} $arg] == 1} {
234             set equal_symbol_position [string first "=" $arg]
235             set name [string range $arg 1 $equal_symbol_position-1]
236             lappend args_names $name
237             set value [string range $arg $equal_symbol_position+1 [string length $arguments]-1]
238             
239             # To parse a list of values for -m parameter
240             if { [string first "," $value] != -1 } {
241                 set value [split $value ","];
242             }
243             set args_values($name) $value
244         } else {
245             puts "Error in argument $arg"
246             return 1
247         }
248     }
249     return 0
250 }
251
252 # Loads a list of docfiles from file FILES.txt
253 proc OverviewDoc_LoadFilesList {} {
254
255     set INPUTDIR [file normalize [file dirname [info script]]]
256     
257     global available_docfiles
258     set available_docfiles {}
259
260     # Read data from file
261     if { [file exists "$INPUTDIR/FILES.txt"] == 1 } {
262         set FILE [open "$INPUTDIR/FILES.txt" r]
263         while {1} {
264             set line [string trim [gets $FILE]]
265
266             # trim possible comments starting with '#'
267             set line [regsub {\#.*} $line {}]
268
269             if {$line != ""} {
270               lappend available_docfiles $line
271             }
272
273             if {[eof $FILE]} {
274                 close $FILE
275                 break
276             }
277         }
278     } else {
279         return -1
280     }
281     return 0
282 }
283
284 # Writes new tex file for conversion from tex to pdf for a specific doc
285 proc OverviewDoc_MakeRefmanTex {fileName latexDir docLabel verboseMode} {
286
287     if {$verboseMode == "YES"} {
288         puts "INFO: Making refman.tex file for $fileName"
289     }
290     set DOCNAME "$latexDir/refman.tex"
291     if {[file exists $DOCNAME] == 1} {
292         file delete -force $DOCNAME
293     }
294     set texfile [open $DOCNAME w]
295
296     puts $texfile "\\batchmode"
297     puts $texfile "\\nonstopmode"
298     puts $texfile "\\documentclass\[oneside\]{article}"
299     puts $texfile "\n% Packages required by doxygen"
300     puts $texfile "\\usepackage{calc}"
301     puts $texfile "\\usepackage{doxygen}"
302     puts $texfile "\\usepackage{graphicx}"
303     puts $texfile "\\usepackage\[utf8\]{inputenc}"
304     puts $texfile "\\usepackage{makeidx}"
305     puts $texfile "\\usepackage{multicol}"
306     puts $texfile "\\usepackage{multirow}"
307     puts $texfile "\\usepackage{textcomp}"
308     puts $texfile "\\usepackage{amsmath}"
309     puts $texfile "\\usepackage\[table\]{xcolor}"
310     puts $texfile "\\usepackage{indentfirst}"
311     puts $texfile ""
312     puts $texfile "% Font selection"
313     puts $texfile "\\usepackage\[T1\]{fontenc}"
314     puts $texfile "\\usepackage{mathptmx}"
315     puts $texfile "\\usepackage\[scaled=.90\]{helvet}"
316     puts $texfile "\\usepackage{courier}"
317     puts $texfile "\\usepackage{amssymb}"
318     puts $texfile "\\usepackage{sectsty}"
319     puts $texfile "\\renewcommand{\\familydefault}{\\sfdefault}"
320     puts $texfile "\\allsectionsfont{%"
321     puts $texfile "  \\fontseries{bc}\\selectfont%"
322     puts $texfile "  \\color{darkgray}%"
323     puts $texfile "}"
324     puts $texfile "\\renewcommand{\\DoxyLabelFont}{%"
325     puts $texfile "  \\fontseries{bc}\\selectfont%"
326     puts $texfile "  \\color{darkgray}%"
327     puts $texfile "}"
328     puts $texfile ""
329     puts $texfile "% Page & text layout"
330     puts $texfile "\\usepackage{geometry}"
331     puts $texfile "\\geometry{%"
332     puts $texfile "  a4paper,%"
333     puts $texfile "  top=2.5cm,%"
334     puts $texfile "  bottom=2.5cm,%"
335     puts $texfile "  left=2.5cm,%"
336     puts $texfile "  right=2.5cm%"
337     puts $texfile "}"
338     puts $texfile "\\tolerance=750"
339     puts $texfile "\\hfuzz=15pt"
340     puts $texfile "\\hbadness=750"
341     puts $texfile "\\setlength{\\emergencystretch}{15pt}"
342     puts $texfile "\\setlength{\\parindent}{0cm}";#0.75cm
343     puts $texfile "\\setlength{\\parskip}{0.2cm}"; #0.2
344     puts $texfile "\\makeatletter"
345     puts $texfile "\\renewcommand{\\paragraph}{%"
346     puts $texfile "  \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%"
347     puts $texfile "\\normalfont\\normalsize\\bfseries\\SS@parafont%"
348     puts $texfile "  }%"
349     puts $texfile "}"
350     puts $texfile "\\renewcommand{\\subparagraph}{%"
351     puts $texfile "  \\@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%"
352     puts $texfile "\\normalfont\\normalsize\\bfseries\\SS@subparafont%"
353     puts $texfile "  }%"
354     puts $texfile "}"
355     puts $texfile "\\makeatother"
356     puts $texfile ""
357     puts $texfile "% Headers & footers"
358     puts $texfile "\\usepackage{fancyhdr}"
359     puts $texfile "\\pagestyle{fancyplain}"
360     puts $texfile "\\fancyhead\[LE\]{\\fancyplain{}{\\bfseries\\thepage}}"
361     puts $texfile "\\fancyhead\[CE\]{\\fancyplain{}{}}"
362     puts $texfile "\\fancyhead\[RE\]{\\fancyplain{}{\\bfseries\\leftmark}}"
363     puts $texfile "\\fancyhead\[LO\]{\\fancyplain{}{\\bfseries\\rightmark}}"
364     puts $texfile "\\fancyhead\[CO\]{\\fancyplain{}{}}"
365     puts $texfile "\\fancyhead\[RO\]{\\fancyplain{}{\\bfseries\\thepage}}"
366     puts $texfile "\\fancyfoot\[LE\]{\\fancyplain{}{}}"
367     puts $texfile "\\fancyfoot\[CE\]{\\fancyplain{}{}}"
368     puts $texfile "\\fancyfoot\[RE\]{\\fancyplain{}{\\bfseries\\scriptsize (c) Open CASCADE 2001\-2013}}"
369     puts $texfile "\\fancyfoot\[LO\]{\\fancyplain{}{\\bfseries\\scriptsize (c) Open CASCADE 2001\-2013}}"
370     puts $texfile "\\fancyfoot\[CO\]{\\fancyplain{}{}}"
371     puts $texfile "\\fancyfoot\[RO\]{\\fancyplain{}{}}"
372     puts $texfile "\\renewcommand{\\footrulewidth}{0.4pt}"
373     puts $texfile "\\renewcommand{\\sectionmark}\[1\]{%"
374     puts $texfile "  \\markright{\\thesection\\ #1}%"
375     puts $texfile "}"
376     puts $texfile ""
377     puts $texfile "% Indices & bibliography"
378     puts $texfile "\\usepackage{natbib}"
379     puts $texfile "\\usepackage\[titles\]{tocloft}"
380     puts $texfile "\\renewcommand{\\cftsecleader}{\\cftdotfill{\\cftdotsep}}"
381     puts $texfile "\\setcounter{tocdepth}{3}"
382     puts $texfile "\\setcounter{secnumdepth}{5}"
383     puts $texfile "\\makeindex"
384     puts $texfile ""
385     puts $texfile "% Hyperlinks (required, but should be loaded last)"
386     puts $texfile "\\usepackage{ifpdf}"
387     puts $texfile "\\ifpdf"
388     puts $texfile "  \\usepackage\[pdftex,pagebackref=true\]{hyperref}"
389     puts $texfile "\\else"
390     puts $texfile "  \\usepackage\[ps2pdf,pagebackref=true\]{hyperref}"
391     puts $texfile "\\fi"
392     puts $texfile "\\hypersetup{%"
393     puts $texfile "  colorlinks=true,%"
394     puts $texfile "  linkcolor=black,%"
395     puts $texfile "  citecolor=black,%"
396     puts $texfile "  urlcolor=blue,%"
397     puts $texfile "  unicode%"
398     puts $texfile "}"
399     puts $texfile ""
400     puts $texfile "% Custom commands"
401     puts $texfile "\\newcommand{\\clearemptydoublepage}{%"
402     puts $texfile "  \\newpage{\\pagestyle{empty}\\cleardoublepage}%"
403     puts $texfile "}"
404     puts $texfile "\n"
405     puts $texfile "%===== C O N T E N T S =====\n"
406     puts $texfile "\\begin{document}"
407     puts $texfile ""
408     puts $texfile "% Titlepage & ToC"
409     puts $texfile "\\hypersetup{pageanchor=false}"
410     puts $texfile "\\pagenumbering{roman}"
411     puts $texfile "\\begin{titlepage}"
412     puts $texfile "\\vspace*{7cm}"
413     puts $texfile "\\begin{center}%"
414     puts $texfile "\\includegraphics\[width=0.75\\textwidth, height=0.2\\textheight\]{../../../dox/resources/occt_logo.png}\\\\"; #\\\\\\\\
415     puts $texfile "{\\Large Open C\\-A\\-S\\-C\\-A\\-D\\-E Technology \\\\\[1ex\]\\Large [OverviewDoc_DetectCasVersion $latexDir/../../../] }\\\\"
416     puts $texfile "\\vspace*{1cm}"
417     puts $texfile "{\\Large $docLabel}\\\\"
418     puts $texfile "\\vspace*{1cm}"
419     puts $texfile "{\\large Generated by Doxygen 1.8.4}\\\\"
420     puts $texfile "\\vspace*{0.5cm}"
421     puts $texfile "{\\small \\today}\\"
422     puts $texfile "\\end{center}"
423     puts $texfile "\\end{titlepage}"
424     puts $texfile "\\clearpage"
425     puts $texfile "\\pagenumbering{roman}"
426     puts $texfile "\\tableofcontents"
427     puts $texfile "\\newpage"
428     puts $texfile "\\pagenumbering{arabic}"
429     puts $texfile "\\hypersetup{pageanchor=true}"
430     puts $texfile ""
431     puts $texfile "\\let\\stdsection\\section"
432     puts $texfile "  \\renewcommand\\section{\\pagebreak\\stdsection}"
433     puts $texfile "\\hypertarget{$fileName}{}"
434     puts $texfile "\\input{$fileName}"
435     puts $texfile ""
436     puts $texfile "% Index"
437     puts $texfile "\\newpage"
438     puts $texfile "\\phantomsection"
439     puts $texfile "\\addcontentsline{toc}{part}{Index}"
440     puts $texfile "\\printindex\n"
441     puts $texfile "\\end{document}"
442
443     close $texfile
444 }
445
446 # Postprocesses generated TeX files
447 proc OverviewDoc_ProcessTex {{texFiles {}} {latexDir} verboseMode} {
448
449     foreach TEX $texFiles {
450         if {$verboseMode == "YES"} {
451             puts "INFO: Preprocessing file $TEX"
452         }
453
454          if {![file exists $TEX]} {
455           puts "file $TEX doesn't exist"
456           return
457         }
458
459         set IN_F  [open "$TEX" r]
460         set TMPFILENAME "$latexDir/temp.tex"
461
462         set OUT_F [open $TMPFILENAME w]
463         
464         while {1} {
465             set line [gets $IN_F]
466             if { [string first "\\includegraphics" $line] != -1 } {
467                 # Center images in TeX files
468                 set line "\\begin{center}\n $line\n\\end{center}"
469             } elseif { [string first "\\subsection" $line] != -1 } {
470                 # Replace \subsection with \section tag
471                 regsub -all "\\\\subsection" $line "\\\\section" line
472             } elseif { [string first "\\subsubsection" $line] != -1 } {
473                 # Replace \subsubsection with \subsection tag
474                 regsub -all "\\\\subsubsection" $line "\\\\subsection" line
475             } elseif { [string first "\\paragraph" $line] != -1 } {
476                 # Replace \paragraph with \subsubsection tag
477                 regsub -all "\\\\paragraph" $line "\\\\subsubsection" line
478             }
479             puts $OUT_F $line
480             
481             if {[eof $IN_F]} {
482                 close $IN_F
483                 close $OUT_F
484                 break
485             }
486         }
487         file delete -force $TEX
488         file rename $TMPFILENAME $TEX
489     }
490 }
491
492 # Main procedure for documents compilation
493 proc OverviewDoc_Main { {docfiles {}} generatorMode docLabel verboseMode searchMode} {
494
495     set INDIR      [file normalize [file dirname [info script]]]
496     set CASROOT    [file normalize [file dirname "$INDIR/../../"]]
497     set OUTDIR     $CASROOT/doc
498     set PDFDIR     $OUTDIR/overview/pdf
499     set HTMLDIR    $OUTDIR/overview/html
500     set LATEXDIR   $OUTDIR/overview/latex
501     set TAGFILEDIR $OUTDIR/refman
502     set DOXYFILE   $OUTDIR/OCCT.cfg
503
504     # Create or clean the output folders
505     if {[file exists $OUTDIR] == 0} {
506         file mkdir $OUTDIR
507     } 
508     if {[file exists $HTMLDIR] == 0} {
509         file mkdir $HTMLDIR
510     }
511     if {[file exists $PDFDIR] == 0} {
512         file mkdir $PDFDIR
513     }
514     
515     if {[file exists $LATEXDIR]} {
516       #file delete {*}[glob -nocomplain $LATEXDIR/*.*]
517       file delete -force $LATEXDIR
518     }
519     file mkdir $LATEXDIR
520
521     # Run tools to compile documents
522     puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generating Doxyfile..."
523     
524     OverviewDoc_MakeDoxyfile $CASROOT "$OUTDIR/overview" $TAGFILEDIR $DOXYFILE $generatorMode $docfiles $verboseMode $searchMode
525
526     # Run doxygen tool
527     if { $generatorMode == "HTML_ONLY"} {
528         puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generating HTML files..."
529     }
530     set RESULT [catch {exec doxygen $DOXYFILE > $OUTDIR/doxygen_out.log} DOX_ERROR] 
531     if {$RESULT != 0} {
532         if {[llength [split $DOX_ERROR "\n"]] > 1} {
533             if {$verboseMode == "YES"} {
534                 puts "See Doxygen log in $OUTDIR/doxygen_warnings_and_errors.log"
535             }
536             set DOX_ERROR_FILE [open "$OUTDIR/doxygen_warnings_and_errors.log" "w"]
537             puts $DOX_ERROR_FILE $DOX_ERROR
538             close $DOX_ERROR_FILE
539         } else {
540             puts $DOX_ERROR
541         }
542     }
543     # Close the Doxygen application
544     after 300
545
546     # Start PDF generation routine
547     if { $generatorMode == "PDF_ONLY" } {
548         puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generating PDF files..."
549
550         set OS $::tcl_platform(platform)
551         if { $OS == "unix" } {
552             set PREFIX ".sh"
553         } elseif { $OS == "windows" } {
554             set PREFIX ".bat"
555         }
556
557         # Prepare a list of TeX files, generated by Doxygen
558         cd $LATEXDIR
559         
560         set TEXFILES [glob $LATEXDIR -type f -directory $LATEXDIR -tails "*.tex" ]
561         set REFMAN_IDX [lsearch $TEXFILES "refman.tex"]
562         set TEXFILES [lreplace $TEXFILES $REFMAN_IDX $REFMAN_IDX]
563
564
565         set IDX [lsearch $TEXFILES "$LATEXDIR"]
566         while { $IDX != -1} {
567             set TEXFILES [lreplace $TEXFILES $IDX $IDX]
568             set IDX [lsearch $TEXFILES "$LATEXDIR"]
569         }
570
571         if {$verboseMode == "YES"} {
572             puts "Preprocessing generated TeX files..."
573         }
574         OverviewDoc_ProcessTex $TEXFILES $LATEXDIR $verboseMode
575         
576         if {$verboseMode == "YES"} {
577             puts "Generating PDF files from TeX files..."
578         }
579         foreach TEX $TEXFILES {
580             # Rewrite existing REFMAN.tex file...
581             set TEX [string range $TEX 0 [ expr "[string length $TEX] - 5"]]
582             OverviewDoc_MakeRefmanTex $TEX $LATEXDIR $docLabel $verboseMode
583             
584             if {$verboseMode == "YES"} {
585                 puts "INFO: Generating PDF file from $TEX"
586                 # ...and use it to generate PDF from TeX...
587                 puts "Executing $LATEXDIR/make$PREFIX..."
588             }
589             set RESULT [catch {eval exec [auto_execok $LATEXDIR/make$PREFIX] > "$OUTDIR/pdflatex_out.log"} LaTeX_ERROR]
590             if {$RESULT != 0} {
591                 if {[llength [split $LaTeX_ERROR "\n"]] > 1} {
592                     if {$verboseMode == "YES"} {
593                         puts "See Latex log in $OUTDIR/pdflatex_warnings_and_errors.log"
594                     }
595                     set LaTeX_ERROR_FILE [open "$OUTDIR/pdflatex_warnings_and_errors.log" "w"]
596                     puts $LaTeX_ERROR_FILE $LaTeX_ERROR
597                     close $LaTeX_ERROR_FILE
598                 } else {
599                     puts $DOX_ERROR
600                 }
601             }
602
603             # ...and place it to the specific folder
604             if { [file exists $PDFDIR/$TEX.pdf] == 1 } {
605                 file delete -force $PDFDIR/$TEX.pdf
606             }
607             
608             if {![file exists "$LATEXDIR/refman.pdf"]} {
609               puts "Error: file $LATEXDIR/refman.pdf does not exist"
610               return
611             }
612             
613             file rename $LATEXDIR/refman.pdf "$PDFDIR/$TEX.pdf"
614         }
615     }
616
617     cd $INDIR
618     puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generation completed"
619     if { $generatorMode == "HTML_ONLY" } {
620         puts "View generated HTML documentation by opening: "
621         set RESFILE $OUTDIR/overview/html/index.html
622         puts "$RESFILE"
623     }
624     if { $generatorMode == "PDF_ONLY" } {
625         puts "PDF files are generated in: "
626         puts "$OUTDIR/overview/pdf folder"
627     }
628 }
629
630 # A command for User Documentation compilation
631 proc occdoc {args} {
632     # Programm options
633     set GEN_MODE    "HTML_ONLY"
634     
635     set DOCFILES  {}
636     set DOCLABEL    "Default OCCT Document"
637     set VERB_MODE   "NO"
638     set SEARCH_MODE "none"
639
640     global available_docfiles
641     global args_names
642     global args_values
643
644     # Load list of docfiles
645     if { [OverviewDoc_LoadFilesList] != 0 } {
646         puts "ERROR: File FILES.txt was not found"
647         return
648     }
649
650     # Parse CL arguments
651     if {[OverviewDoc_ParseArguments $args] == 1} {
652         return
653     }
654     
655   foreach arg_n $args_names {
656     if {$arg_n == "h"} {
657       OverviewDoc_PrintHelpMessage
658       return
659     } elseif {$arg_n == "html"} {
660         set GEN_MODE "HTML_ONLY"
661     } elseif {$arg_n == "pdf"} {
662         set GEN_MODE "PDF_ONLY"
663     } elseif {$arg_n == "v"} {
664         set VERB_MODE "YES"
665     } elseif {$arg_n == "m"} {
666       if {$args_values(m) != "NULL"} {
667         set DOCFILES $args_values(m)
668       } else {
669         puts "Error in argument m"
670         return
671       }
672         
673       # Check if all chosen docfiles are correct
674       foreach docfile $DOCFILES {
675         if { [lsearch $available_docfiles $docfile] == -1 } {
676           puts "File \"$docfile\" is not presented in the list of available docfiles"
677           puts "Please, specify the correct docfile name"
678           return
679         } else {
680           puts "File $docfile is presented in FILES.TXT"
681         }
682       }
683     } elseif {$arg_n == "l"} {
684       if { [llength $DOCFILES] <= 1 } {
685         if {$args_values(l) != "NULL"} {
686           set DOCLABEL $args_values(l)
687         } else {
688           puts "Error in argument l"
689           return
690         }
691       }
692     } elseif {$arg_n == "s"} {
693       if {$args_values(s) != "NULL"} {
694         set SEARCH_MODE $args_values(s)
695       } else {
696         puts "Error in argument s"
697         return
698       }
699     } else {
700       puts "\nWrong argument: $arg_n"
701       OverviewDoc_PrintHelpMessage
702       return
703     }
704   }
705
706   # Specify verbose mode
707   if { $GEN_MODE != "PDF_ONLY" && [llength $DOCFILES] > 1 } {
708     set DOCLABEL ""
709   }
710     
711   # If we don't specify list for docfiles with -m argument,
712   # we assume that we have to generate all docfiles
713   if { [llength $DOCFILES] == 0 } {
714     set DOCFILES $available_docfiles
715   }
716
717   # Start main activities
718   OverviewDoc_Main $DOCFILES $GEN_MODE $DOCLABEL $VERB_MODE $SEARCH_MODE
719 }