0026537: It is not possible to generate reference documentation in new structure...
[occt.git] / adm / gendoc.tcl
1 # =======================================================================
2 # Created on: 2014-03-21
3 # Created by: OMY
4 # Copyright (c) 1996-1999 Matra Datavision
5 # Copyright (c) 1999-2014 OPEN CASCADE SAS
6 #
7 # This file is part of Open CASCADE Technology software library.
8 #
9 # This library is free software; you can redistribute it and/or modify it under
10 # the terms of the GNU Lesser General Public License version 2.1 as published
11 # by the Free Software Foundation, with special exception defined in the file
12 # OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
13 # distribution for complete text of the license and disclaimer of any warranty.
14 #
15 # Alternatively, this file may be used under the terms of Open CASCADE
16 # commercial license or contractual agreement.
17
18 # Brief:  This script compiles OCCT documents from *.md files to HTML pages
19 # =======================================================================
20
21 # ======================================
22 #  Common functions
23 # ======================================
24
25 # Prints help message
26 proc OCCDoc_PrintHelpMessage {} {
27     puts "\nUsage: gendoc \[-h\] {-refman|-overview} \[-html|-pdf|-chm\] \[-m=<list of modules>|-ug=<list of docs>\] \[-v\] \[-s=<search_mode>\] \[-mathjax=<path>\]"
28     puts ""
29     puts "Options are:"
30     puts ""
31     puts "choice of documentation to be generated:"
32     puts "  -overview          : To generate Overview and User Guides"
33     puts "                       (cannot be used with -refman)"
34     puts "  -refman            : To generate class Reference Manual"
35     puts "                       (cannot be used with -overview)"
36     puts ""
37     puts "choice of output format:"
38     puts "  -html              : To generate HTML files"
39     puts "                       (default, cannot be used with -pdf or -chm)"
40     puts "  -pdf               : To generate PDF files"
41     puts "                       (cannot be used with -refman, -html, or -chm)"
42     puts "  -chm               : To generate CHM files"
43     puts "                       (cannot be used with -html or -pdf)"
44     puts ""
45     puts "additional options:"
46     puts "  -m=<modules_list>  : List of OCCT modules (separated with comma),"
47     puts "                       for generation of Reference Manual"
48     puts "  -ug=<docs_list>    : List of MarkDown documents (separated with comma),"
49     puts "                       to use for generation of Overview / User Guides"
50     puts "  -mathjax=<path>    : To use local or alternative copy of MathJax"
51     puts "  -s=<search_mode>   : Specifies the Search mode of HTML documents"
52     puts "                       Can be: none | local | server | external"
53     puts "  -h                 : Prints this help message"
54     puts "  -v                 : Enables more verbose output"    
55 }
56
57 # A command for User Documentation compilation
58 proc gendoc {args} {
59
60   # Parameters
61   set DOC_TYPE                  "REFMAN"
62   set GEN_MODE                  "HTML_ONLY"
63   set DOCFILES                  {}
64   set MODULES                   {}
65   set DOCLABEL                  ""
66   set VERB_MODE                 "NO"
67   set SEARCH_MODE               "none"
68   set MATHJAX_LOCATION          "http://cdn.mathjax.org/mathjax/latest"
69   set mathjax_js_name           "MathJax.js"
70   set DOCTYPE_COMBO_FLAG        0
71   set GENMODE_COMBO_FLAG        0
72   set GENERATE_PRODUCTS_REFMAN "NO"
73
74   global available_docfiles;   # The full list of md files for HTML or CHM generation
75   global available_pdf;        # The full list of md files for PDF generation
76   global tcl_platform
77   global args_names
78   global args_values
79   global env
80
81   # Load list of docfiles
82   if { [OCCDoc_LoadFilesList] != 0 } {
83     puts "Error: File FILES_HTML.txt or FILES_PDF.txt was not found on this computer.\nAborting..."
84     return -1
85   }
86
87   # Parse CL arguments
88   if {[OCCDoc_ParseArguments $args] == 1} {
89     return -1
90   }
91
92   # Print help message if no arguments provided
93   if {[llength $args_names] == 0} {
94     OCCDoc_PrintHelpMessage
95     return 0
96   }
97
98   foreach arg_n $args_names {
99     if {$arg_n == "h"} {
100       OCCDoc_PrintHelpMessage
101       return 0
102     } elseif {$arg_n == "html"} {
103       if { ([ lsearch $args_names "refman" ]   == -1) &&
104            ([ lsearch $args_names "overview" ] == -1) } {
105         puts "Warning: Please specify -refman or -overview argument."
106         return -1
107       }
108       if { [ lsearch $args_names "refman" ] != -1 } {
109         continue
110       }
111       if { $GENMODE_COMBO_FLAG != 1 } {
112         set GEN_MODE "HTML_ONLY"
113         set GENMODE_COMBO_FLAG 1
114       } else {
115         puts "Error: Options -html, -pdf and -chm can not be combined."
116         return -1
117       }
118     } elseif {$arg_n == "chm"} {
119       if { ([ lsearch $args_names "refman" ]   == -1) &&
120            ([ lsearch $args_names "overview" ] == -1) } {
121         puts "Warning: Please specify -refman or -overview argument."
122         return -1
123       }
124       if { [ lsearch $args_names "refman" ] != -1 } {
125         continue
126       }
127       if { $GENMODE_COMBO_FLAG != 1 } { 
128         set GEN_MODE "CHM_ONLY"
129         set GENMODE_COMBO_FLAG 1
130       } else {
131         puts "Error: Options -html, -pdf and -chm cannot be combined."
132         return -1
133       }
134     } elseif {$arg_n == "pdf"} {
135       if { ([ lsearch $args_names "refman" ]   == -1) &&
136            ([ lsearch $args_names "overview" ] == -1) } {
137         puts "Warning: Please specify -refman or -overview argument."
138         return -1
139       }
140       if { [ lsearch $args_names "refman" ] != -1 } {
141         continue
142       }
143       if { $GENMODE_COMBO_FLAG != 1 } { 
144         set GEN_MODE "PDF_ONLY"
145         set GENMODE_COMBO_FLAG 1
146       } else {
147         puts "Error: Options -html, -pdf and -chm cannot be combined."
148         return -1
149       }
150     } elseif {$arg_n == "overview"} {
151       if { $DOCTYPE_COMBO_FLAG != 1 } {
152         set DOC_TYPE "OVERVIEW"
153         set DOCTYPE_COMBO_FLAG 1
154       } else {
155         puts "Error: Options -refman and -overview cannot be combined."
156         return -1
157       }
158
159       # Print ignored options
160       if { [ lsearch $args_names "m" ] != -1 } {
161         puts "\nInfo: The following options will be ignored: \n"
162         puts "  * -m"
163       }
164       puts ""
165     } elseif {$arg_n == "refman"} {
166       if { $DOCTYPE_COMBO_FLAG != 1 } { 
167         set DOC_TYPE "REFMAN"
168         set DOCTYPE_COMBO_FLAG 1
169         if { [info exists env(PRODROOT)] && [file exists $::env(PRODROOT)/src/VAS/Products.tcl] } {
170           set GENERATE_PRODUCTS_REFMAN "YES"
171         }
172       } else {
173         puts "Error: Options -refman and -overview cannot be combined."
174         return -1
175       }
176       # Print ignored options
177       if { ([ lsearch $args_names "pdf" ]     != -1) || 
178            ([ lsearch $args_names "chm" ]     != -1) || 
179            ([ lsearch $args_names "ug" ]      != -1) } {
180         puts "\nInfo: The following options will be ignored: \n"
181         if { [ lsearch $args_names "pdf" ] != -1 } {
182           puts "  * -pdf"
183         }
184         if { [ lsearch $args_names "chm" ] != -1 } {
185           puts "  * -chm"
186         }
187         if { [ lsearch $args_names "ug" ] != -1 } {
188           puts "  * -ug"
189         }
190         puts ""
191       }
192       
193     } elseif {$arg_n == "v"} {
194       set VERB_MODE "YES"
195     } elseif {$arg_n == "ug"} {
196       if { ([ lsearch $args_names "refman" ]   != -1) } {
197         continue
198       }
199       if {$args_values(ug) != "NULL"} {
200         set DOCFILES $args_values(ug)
201       } else {
202         puts "Error in argument ug."
203         return -1
204       }
205       # Check if all chosen docfiles are correct
206       foreach docfile $DOCFILES {
207         if { [ lsearch $args_names "pdf" ] == -1 } {
208           # Check to generate HTMLs
209           if { [lsearch $available_docfiles $docfile] == -1 } {
210             puts "Error: File \"$docfile\" is not presented in the list of available docfiles."
211             puts "       Please specify the correct docfile name."
212             return -1
213           } 
214         } else {
215           # Check to generate PDFs
216           if { [lsearch $available_pdf $docfile] == -1 } {
217             puts "Error: File \"$docfile\" is not presented in the list of generic PDFs."
218             puts "       Please specify the correct pdf name."
219             return -1
220           }
221         }
222       }
223     } elseif {$arg_n == "m"} {
224       if { [ lsearch $args_names "overview" ] != -1 } {
225         continue
226       }
227       if {$args_values(m) != "NULL"} {
228         set MODULES $args_values(m)
229       } else {
230         puts "Error in argument m."
231         return -1
232       }
233     } elseif {$arg_n == "s"} {
234       if { [ lsearch $args_names "pdf" ] != -1 } {
235         continue
236       }
237       if {$args_values(s) != "NULL"} {
238         set SEARCH_MODE $args_values(s)
239       } else {
240         puts "Error in argument s."
241         return -1
242       }
243     } elseif {$arg_n == "mathjax"} {
244       if { [ lsearch $args_names "pdf" ] != -1 } {
245         set possible_mathjax_loc $args_values(mathjax)
246         if {[file exist [file join $possible_mathjax_loc $mathjax_js_name]]} {
247           set MATHJAX_LOCATION $args_values(mathjax)
248           puts "$MATHJAX_LOCATION"
249         } else {
250           puts "Warning: $mathjax_js_name is not found in $possible_mathjax_loc."
251           puts "         MathJax will be used from $MATHJAX_LOCATION"
252         }
253       } else {
254         puts "Warning: MathJax is not used with pdf and will be ignored."
255       }
256     } else {
257       puts "\nWrong argument: $arg_n"
258       OCCDoc_PrintHelpMessage
259       return -1
260     }
261   }
262
263   # Check the existence of the necessary tools
264   set DOXYGEN_PATH  ""
265   set GRAPHVIZ_PATH ""
266   set INKSCAPE_PATH ""
267   set PDFLATEX_PATH ""
268   set HHC_PATH      ""
269
270   OCCDoc_DetectNecessarySoftware $DOXYGEN_PATH $GRAPHVIZ_PATH $INKSCAPE_PATH $HHC_PATH $PDFLATEX_PATH
271
272   if {$DOXYGEN_PATH == ""} {
273     puts " Aborting..."
274     return -1
275   }
276
277   if {"$::tcl_platform(platform)" == "windows"} {
278     if { ($GEN_MODE == "CHM_ONLY") && ($HHC_PATH == "") } {
279       puts " Aborting..."
280       return -1
281     }
282   }
283
284   if { ($PDFLATEX_PATH == "") && ($GEN_MODE == "PDF_ONLY") } {
285     puts " Aborting..."
286     return -1
287   }
288
289   # If we do not specify list for docfiles with -m argument,
290   # we assume that we have to generate all docfiles
291   if { [llength $DOCFILES] == 0 } {
292     if { $GEN_MODE != "PDF_ONLY" } {
293       set DOCFILES $available_docfiles
294     } else {
295       set DOCFILES $available_pdf
296     }
297   }
298
299   puts ""
300
301   # Clean logfiles
302   set DOXYLOG [OCCDoc_GetRootDir]/doc/doxygen_warnings_and_errors.log
303   set PDFLOG  [OCCDoc_GetRootDir]/doc/pdflatex_warnings_and_errors.log
304
305   file delete -force $PDFLOG
306   file delete -force $DOXYLOG
307   
308   # Start main activities
309   if { $GEN_MODE != "PDF_ONLY" } {
310     OCCDoc_Main $DOC_TYPE $DOCFILES $MODULES $GEN_MODE $VERB_MODE $SEARCH_MODE $MATHJAX_LOCATION $GENERATE_PRODUCTS_REFMAN $DOXYGEN_PATH $GRAPHVIZ_PATH $INKSCAPE_PATH $HHC_PATH
311   } else {
312     puts "Generating OCCT User Guides in PDF format...\n"
313     foreach pdf $DOCFILES {
314
315       puts "Info: Processing file $pdf\n"
316
317       # Some values are hardcoded because they are related only to PDF generation
318       OCCDoc_Main "OVERVIEW" [list $pdf] {} "PDF_ONLY" $VERB_MODE "none" $MATHJAX_LOCATION "NO" $DOXYGEN_PATH $GRAPHVIZ_PATH $INKSCAPE_PATH $HHC_PATH
319     }
320     puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generation completed."
321     puts "\nPDF files are generated in \n[file normalize [OCCDoc_GetRootDir]/doc/pdf]"
322   }
323 }
324
325 # Main procedure for documents compilation
326 proc OCCDoc_Main {docType {docfiles {}} {modules {}} generatorMode verboseMode searchMode mathjaxLocation generateProductsRefman DOXYGEN_PATH GRAPHVIZ_PATH INKSCAPE_PATH HHC_PATH} {
327
328   global available_docfiles
329   global available_pdf
330
331   set PRODPATH   ""
332   if { [string compare -nocase $generateProductsRefman "YES"] == 0 } {
333     set PRODPATH "$::env(PRODROOT)"
334   }
335
336   set ROOTDIR    [OCCDoc_GetRootDir $PRODPATH]
337   set INDIR      [OCCDoc_GetDoxDir]
338   set OUTDIR     $ROOTDIR/doc
339   set PDFDIR     $OUTDIR/pdf
340   set UGDIR      $PDFDIR/user_guides
341   set DGDIR      $PDFDIR/dev_guides
342   set TAGFILEDIR $OUTDIR/refman
343   set HTMLDIR    $OUTDIR/overview/html
344   set LATEXDIR   $OUTDIR/overview/latex
345   set DOXYFILE   $OUTDIR/OCCT.cfg
346  
347   # Create or cleanup the output folders
348   if { [string compare -nocase $generateProductsRefman "YES"] != 0 } {
349     if { ![file exists $OUTDIR] } {
350       file mkdir $OUTDIR
351     } 
352     if { ![file exists $HTMLDIR] } {
353       file mkdir $HTMLDIR
354     }
355     if { ![file exists $PDFDIR] } {
356       file mkdir $PDFDIR
357     }
358     if { ![file exists $UGDIR] } {
359       file mkdir $UGDIR
360     }
361     if { ![file exists $DGDIR] } {
362       file mkdir $DGDIR
363     }
364     if { [file exists $LATEXDIR] } {
365       file delete -force $LATEXDIR
366     }
367     file mkdir $LATEXDIR
368   }
369   if { $docType == "REFMAN" } {
370     if { ![file exists $TAGFILEDIR] } {
371       file mkdir $TAGFILEDIR
372     }
373   }
374
375   # is MathJax HLink?
376   set mathjax_relative_location $mathjaxLocation
377   if { [file isdirectory "$mathjaxLocation"] } {
378     if { $generatorMode == "HTML_ONLY" } {
379       # related path
380       set mathjax_relative_location [OCCDoc_GetRelPath $HTMLDIR $mathjaxLocation]
381     } elseif { $generatorMode == "CHM_ONLY" } {
382       # absolute path
383       set mathjax_relative_location [file normalize $mathjaxLocation]
384     }
385   }
386
387   if { $generateProductsRefman == "YES" } {
388     set DOCDIR "$OUTDIR/refman"
389     puts "\nGenerating OCC Products Reference Manual\n"
390   } else {
391     if { $docType == "REFMAN"} {
392       set DOCDIR "$OUTDIR/refman"
393       puts "\nGenerating Open CASCADE Reference Manual\n"
394     } elseif { $docType == "OVERVIEW" } {
395       set DOCDIR "$OUTDIR/overview"
396       set FORMAT ""
397       if { ($generatorMode == "HTML_ONLY") || ($generatorMode == "CHM_ONLY") } {
398         if { $generatorMode == "HTML_ONLY" } { 
399           set FORMAT " in HTML format..."
400         } elseif { $generatorMode == "CHM_ONLY" } {
401           set FORMAT " in CHM format..."
402         }
403         puts "Generating OCCT User Guides$FORMAT\n"
404       }
405     } else {
406       puts "Error: Invalid documentation type: $docType. Can not process."
407       return -1
408     }
409   }
410
411   # Generate Doxyfile
412   puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generating Doxyfile..."
413
414   if { [OCCDoc_MakeDoxyfile $docType $DOCDIR $TAGFILEDIR $DOXYFILE $generatorMode $docfiles $modules $verboseMode $searchMode $HHC_PATH $mathjax_relative_location $GRAPHVIZ_PATH $PRODPATH] == -1 } {
415     return -1
416   }
417
418   # Run doxygen tool
419   set starttimestamp [clock format [clock seconds] -format {%Y-%m-%d %H:%M}]
420
421   if { ($generatorMode == "HTML_ONLY") || ($docType == "REFMAN") } {
422     puts "$starttimestamp Generating HTML files..."
423
424     # Copy index file to provide fast access to HTML documentation
425     file copy -force $INDIR/resources/index.html $DOCDIR/index.html
426   } elseif { $generatorMode == "CHM_ONLY" } {
427     puts "$starttimestamp Generating CHM file..."
428   } elseif { $generatorMode == "PDF_ONLY" } {
429     puts "$starttimestamp Generating PDF file..."
430   }
431
432   set DOXYLOG $OUTDIR/doxygen_warnings_and_errors.log
433   set RESULT [catch {exec $DOXYGEN_PATH $DOXYFILE >> $OUTDIR/doxygen_out.log} DOX_ERROR] 
434   if {$RESULT != 0} {
435     set NbErrors [regexp -all -line {^\s*[^\s]+} $DOX_ERROR]
436     if {$NbErrors > 0} {
437       puts "\nWarning: Doxygen reported $NbErrors messages."
438       puts "See log in $DOXYLOG\n"
439       set DOX_ERROR_FILE [open $DOXYLOG "a"]
440       if {$generatorMode == "PDF_ONLY"} {
441         puts $DOX_ERROR_FILE "\n===================================================="
442         puts $DOX_ERROR_FILE "Logfile for $docfiles"
443         puts $DOX_ERROR_FILE "====================================================\n"
444       }
445       puts $DOX_ERROR_FILE $DOX_ERROR
446       close $DOX_ERROR_FILE
447     }
448   }
449
450   # Close the Doxygen application
451   after 300
452
453   # Start Post Processing
454   set curtime [clock format [clock seconds] -format {%Y-%m-%d %H:%M}]
455   if { $docType == "REFMAN" } {
456     # Post Process generated HTML pages and draw dependency graphs
457     if {[OCCDoc_PostProcessor $DOCDIR] == 0} {
458       puts "$curtime Generation completed."
459       puts "\nInfo: doxygen log file is located in:"
460       puts "$OUTDIR/doxygen_out.log."
461       puts "\nReference Manual is generated in \n$DOCDIR"
462     }
463   } elseif { $docType == "OVERVIEW" } {
464     # Start PDF generation routine
465     if { $generatorMode == "PDF_ONLY" } {
466       set OS $::tcl_platform(platform)
467       if { $OS == "unix" } {
468         set PREFIX ".sh"
469       } elseif { $OS == "windows" } {
470         set PREFIX ".bat"
471       }
472
473       # Prepare a list of TeX files, generated by Doxygen
474       cd $LATEXDIR
475
476       set TEXFILES   [glob $LATEXDIR -type f -directory $LATEXDIR -tails "*.tex" ]
477       foreach path $TEXFILES {
478         if { [string compare -nocase $path $LATEXDIR] == 0 } {
479           set DEL_IDX [lsearch $TEXFILES $path]
480           if { $DEL_IDX != -1 } {
481             set TEXFILES [lreplace $TEXFILES $DEL_IDX $DEL_IDX]
482           }
483         }
484       }
485       set TEXFILES   [string map [list refman.tex ""] $TEXFILES]
486       if {$verboseMode == "YES"} {
487         puts "Info: Preprocessing generated TeX files..."
488       }
489       OCCDoc_ProcessTex $TEXFILES $LATEXDIR $verboseMode
490
491       if {$verboseMode == "YES"} {
492         puts "Info: Converting SVG images to PNG format..."
493       }
494
495       if { $INKSCAPE_PATH != "" } {
496         OCCDoc_ProcessSvg $LATEXDIR $verboseMode
497       } else {
498         puts "Warning: SVG images will be lost in PDF documents."
499       }
500
501       if {$verboseMode == "YES"} {
502         puts "Info: Generating PDF file from TeX files..."
503       }
504       foreach TEX $TEXFILES {
505         # Rewrite existing REFMAN.tex file...
506         set TEX [lindex [split $TEX "."] 0]
507
508         if {$verboseMode == "YES"} {
509           puts "Info: Generating PDF file from $TEX..."
510         }
511
512         OCCDoc_MakeRefmanTex $TEX $LATEXDIR $verboseMode $available_pdf
513
514         if {"$::tcl_platform(platform)" == "windows"} {
515           set is_win "yes"
516         } else {
517           set is_win "no"
518         }
519         if {$verboseMode == "YES"} {
520           # ...and use it to generate PDF from TeX...
521           if {$is_win == "yes"} {
522             puts "Info: Executing $LATEXDIR/make.bat..."
523           } else {
524             puts "Info: Executing $LATEXDIR/Makefile..."
525           }
526         }
527         set PDFLOG $OUTDIR/pdflatex_warnings_and_errors.log
528
529         if {"$is_win" == "yes"} {
530           set RESULT [catch {eval exec [auto_execok $LATEXDIR/make.bat] >> "$OUTDIR/pdflatex_out.log"} LaTeX_ERROR]
531         } else {
532           set RESULT [catch {eval exec "make -f $LATEXDIR/Makefile" >> "$OUTDIR/pdflatex_out.log"} LaTeX_ERROR]
533
534           # Small workaround for *nix stations
535           set prev_loc [pwd]
536           cd $LATEXDIR
537           set RESULT [catch {eval exec "pdflatex refman.tex" >> "$OUTDIR/pdflatex_out.log"} LaTeX_ERROR]
538           cd $prev_loc
539         }
540
541         if {$RESULT != 0} {
542           set NbErrors [regexp -all -line {^\s*[^\s]+} $LaTeX_ERROR]
543           if {$NbErrors > 0} {
544             puts "\nWarning: PDFLaTeX reported $NbErrors messages.\nSee log in $PDFLOG\n"
545             set LaTeX_ERROR_FILE [open $PDFLOG "a"]
546             puts $LaTeX_ERROR_FILE "\n===================================================="
547             puts $LaTeX_ERROR_FILE "Logfile of file $TEX:"
548             puts $LaTeX_ERROR_FILE "====================================================\n"
549             puts $LaTeX_ERROR_FILE $LaTeX_ERROR
550             close $LaTeX_ERROR_FILE
551           }
552         }
553
554         # ...and place it to the specific folder
555         if {![file exists "$LATEXDIR/refman.pdf"]} {
556           puts "Fatal: PDFLaTeX failed to create output file, stopping!"
557           return -1
558         }
559
560         set destFolder $PDFDIR
561         set parsed_string [split $TEX "_"]
562         if { [lsearch $parsed_string "tutorial"] != -1 } {
563           set TEX [string map [list occt__ occt_] $TEX]
564           set destFolder $PDFDIR
565         } elseif { [lsearch $parsed_string "user"] != -1 } {
566           set TEX [string map [list user_guides__ ""] $TEX]
567           set destFolder $UGDIR
568         } elseif { [lsearch $parsed_string "dev"]  != -1 } {
569           set TEX [string map [list dev_guides__ ""] $TEX]
570           set destFolder $DGDIR
571         }
572         file rename -force $LATEXDIR/refman.pdf "$destFolder/$TEX.pdf"
573
574       }
575     } elseif { $generatorMode == "CHM_ONLY" } {
576       file rename  $OUTDIR/overview.chm $OUTDIR/occt_overview.chm
577     }
578     cd $INDIR
579
580     if { $generatorMode == "HTML_ONLY" } {
581       puts "\nHTML documentation is generated in \n$DOCDIR"
582     }
583     if { $generatorMode == "CHM_ONLY" } {
584       puts "\nGenerated CHM documentation is in \n$OUTDIR/overview.chm"
585     }
586
587     puts ""
588   }
589
590   # Remove temporary Doxygen files
591   set deleteList [glob -nocomplain -type f "*.tmp"]
592   foreach file $deleteList {
593     file delete $file
594   }
595   return 0
596 }
597
598 # Generates Doxygen configuration file for Overview documentation
599 proc OCCDoc_MakeDoxyfile {docType outDir tagFileDir {doxyFileName} {generatorMode ""} {DocFilesList {}} {ModulesList {}} verboseMode searchMode hhcPath mathjaxLocation graphvizPath productsPath} {
600
601   set inputDir      [OCCDoc_GetDoxDir]
602   set TEMPLATES_DIR $inputDir/resources
603   set occt_version  [OCCDoc_DetectCasVersion]
604
605   # Delete existent doxyfile
606   file delete $doxyFileName
607
608   # Copy specific template to the target folder
609   if { $docType == "REFMAN" } {
610     file copy "$TEMPLATES_DIR/occt_rm.doxyfile" $doxyFileName
611   } elseif { $docType == "OVERVIEW" } {
612     if { $generatorMode == "HTML_ONLY" || $generatorMode == "CHM_ONLY" } {
613       file copy "$TEMPLATES_DIR/occt_ug_html.doxyfile" $doxyFileName
614     } elseif { $generatorMode == "PDF_ONLY"} {
615       file copy "$TEMPLATES_DIR/occt_ug_pdf.doxyfile" $doxyFileName
616     } else {
617       puts "Error: Unknown generation mode"
618       return -1
619     }
620   } else {
621     puts "Error: Cannot generate unknown document type"
622     return -1
623   }
624
625   set doxyFile [open $doxyFileName "a"]
626   # Write specific options
627   if { $docType == "REFMAN" } {
628
629     # Load lists of modules scripts
630     if { $productsPath == "" } {
631       set modules_scripts [glob -nocomplain -type f -directory "[OCCDoc_GetSourceDir $productsPath]/OS/" *.tcl]
632     } else {
633       set modules_scripts [glob -nocomplain -type f -directory "[OCCDoc_GetSourceDir $productsPath]/VAS/" *.tcl]
634     }
635     if { [llength $modules_scripts] != 0} {
636       foreach module_file $modules_scripts {
637         source $module_file
638       }
639     }
640
641     set ALL_MODULES [OCCDoc_GetModulesList $productsPath]
642     if { [llength $ModulesList] == 0 } {
643       # by default take all modules
644       set modules $ALL_MODULES
645     } else {
646       set modules $ModulesList
647     }
648
649     # Detect invalid names of modules
650     foreach module $modules {
651       if { $module == "" } {
652         continue
653       }
654       if {[lsearch $ALL_MODULES $module] == -1 } {
655         puts "Error: No module $module is known. Aborting..."
656         return -1
657       }
658     }
659
660     # Set context
661     set one_module [expr [llength $modules] == 1]
662     if { $one_module } {
663       set title "OCCT [$modules:name]"
664       set name $modules
665     } else {
666       set title "Open CASCADE Technology"
667       set name OCCT
668     }
669
670     # Get list of header files in the specified modules
671     set filelist {}
672     foreach module $modules {
673       if { $module == "" } {
674         continue
675       }
676       foreach tk [$module:toolkits] {
677         foreach pk [split [OCCDoc_GetPackagesList [OCCDoc_Locate $tk $productsPath]]] {
678           if { [llength $pk] != "{}" } {
679             lappend filelist [OCCDoc_GetHeadersList "p" "$pk" "$productsPath"]
680           }
681         }
682       }
683     }
684
685     # Filter out files Handle_*.hxx and *.lxx
686     set hdrlist {}
687     foreach fileset $filelist {
688       set hdrset {}
689       foreach hdr $fileset {
690         if { ! [regexp {Handle_.*[.]hxx} $hdr] && ! [regexp {.*[.]lxx} $hdr] } {
691           lappend hdrset $hdr
692         }
693       }
694       lappend hdrlist $hdrset
695     }
696     set filelist $hdrlist
697
698     set doxyFile [open $doxyFileName "a"]
699   
700     puts $doxyFile "PROJECT_NAME           = \"$title\""
701     puts $doxyFile "PROJECT_NUMBER         = $occt_version"
702     puts $doxyFile "OUTPUT_DIRECTORY       = $outDir/."
703     puts $doxyFile "GENERATE_TAGFILE       = $outDir/${name}.tag"
704
705     if { [string tolower $searchMode] == "none" } {
706       puts $doxyFile "SEARCHENGINE           = NO"
707       puts $doxyFile "SERVER_BASED_SEARCH    = NO"
708       puts $doxyFile "EXTERNAL_SEARCH        = NO"
709     } else {
710       puts $doxyFile "SEARCHENGINE           = YES"
711       if { [string tolower $searchMode] == "local" } {
712         puts $doxyFile "SERVER_BASED_SEARCH    = NO"
713         puts $doxyFile "EXTERNAL_SEARCH        = NO"
714       } elseif { [string tolower $searchMode] == "server" } {
715         puts $doxyFile "SERVER_BASED_SEARCH    = YES"
716         puts $doxyFile "EXTERNAL_SEARCH        = NO"
717       } elseif { [string tolower $searchMode] == "external" } {
718         puts $doxyFile "SERVER_BASED_SEARCH    = YES"
719         puts $doxyFile "EXTERNAL_SEARCH        = YES"
720       } else {
721         puts "Error: Wrong search engine type: $searchMode."
722         close $doxyFile 
723         return -1
724       }
725     }
726
727     puts $doxyFile "DOTFILE_DIRS             = $outDir/html"
728     puts $doxyFile "DOT_PATH                 = $graphvizPath"
729     puts $doxyFile "INCLUDE_PATH             = [OCCDoc_GetIncDir $productsPath]"
730     
731     # list of files to generate
732     set mainpage [OCCDoc_MakeMainPage $outDir $outDir/$name.dox $modules $productsPath]
733     puts $doxyFile ""
734     puts $doxyFile "INPUT    = $mainpage \\"
735     foreach header $filelist {
736       puts $doxyFile "               $header \\"
737     }
738
739     puts $doxyFile "MATHJAX_FORMAT         = HTML-CSS"
740     puts $doxyFile "MATHJAX_RELPATH        = ${mathjaxLocation}"
741
742     puts $doxyFile ""
743
744   } elseif { $docType == "OVERVIEW" } {
745
746     # Add common options for generation of Overview and User Guides
747     puts $doxyFile "PROJECT_NUMBER         = $occt_version"
748     puts $doxyFile "OUTPUT_DIRECTORY       = $outDir/."
749     puts $doxyFile "PROJECT_LOGO           = $inputDir/resources/occ_logo.png"
750
751     set PARAM_INPUT "INPUT                 ="
752     set PARAM_IMAGEPATH "IMAGE_PATH        = $inputDir/resources/ "
753     foreach docFile $DocFilesList {
754       set NEW_IMG_PATH "$inputDir/$docFile"
755       if { [string compare $NEW_IMG_PATH [OCCDoc_GetRootDir $productsPath]] != 0 } {
756         set img_string [file dirname $NEW_IMG_PATH]/images
757         if { [file exists $img_string] } {
758           append PARAM_IMAGEPATH " $img_string"
759         }
760       }
761       append PARAM_INPUT " " $inputDir/$docFile
762     }
763     puts $doxyFile $PARAM_INPUT
764     puts $doxyFile $PARAM_IMAGEPATH
765
766     # Add document type-specific options
767     if { $generatorMode == "HTML_ONLY"} {
768       # generate tree view
769       puts $doxyFile "GENERATE_TREEVIEW      = YES"
770
771       # Set a reference to a TAGFILE
772       if { $tagFileDir != "" } {
773         if {[file exists $tagFileDir/OCCT.tag] == 1} {
774           #set tagPath [OCCDoc_GetRelPath $tagFileDir $outDir/html]
775           set tagPath $tagFileDir
776           puts $doxyFile "TAGFILES               = $tagFileDir/OCCT.tag=../../refman/html"
777         }
778       }
779       # HTML Search engine options
780       if { [string tolower $searchMode] == "none" } {
781         puts $doxyFile "SEARCHENGINE           = NO"
782         puts $doxyFile "SERVER_BASED_SEARCH    = NO"
783         puts $doxyFile "EXTERNAL_SEARCH        = NO"
784       } else {
785         puts $doxyFile "SEARCHENGINE           = YES"
786         if { [string tolower $searchMode] == "local" } {
787           puts $doxyFile "SERVER_BASED_SEARCH    = NO"
788           puts $doxyFile "EXTERNAL_SEARCH        = NO"
789         } elseif { [string tolower $searchMode] == "server" } {
790           puts $doxyFile "SERVER_BASED_SEARCH    = YES"
791           puts $doxyFile "EXTERNAL_SEARCH        = NO"
792         } elseif { [string tolower $searchMode] == "external" } {
793           puts $doxyFile "SERVER_BASED_SEARCH    = YES"
794           puts $doxyFile "EXTERNAL_SEARCH        = YES"
795         } else {
796           puts "Error: Wrong search engine type: $searchMode."
797           close $doxyFile 
798           return -1
799         }
800       }
801     } elseif { $generatorMode == "CHM_ONLY"} {
802       # specific options for CHM file generation
803       puts $doxyFile "GENERATE_TREEVIEW      = NO"
804       puts $doxyFile "SEARCHENGINE           = NO"
805       puts $doxyFile "GENERATE_HTMLHELP      = YES"
806       puts $doxyFile "CHM_FILE               = ../../overview.chm"
807       puts $doxyFile "HHC_LOCATION           = \"$hhcPath\""
808       puts $doxyFile "DISABLE_INDEX          = YES"
809     }
810
811     # Formula options
812     puts $doxyFile "MATHJAX_RELPATH        = ${mathjaxLocation}"
813   }
814
815   close $doxyFile
816   return 0
817 }