]>
Commit | Line | Data |
---|---|---|
f7ab5fa4 | 1 | #!/bin/bash |
bfcafa4f | 2 | |
2f9d51b8 | 3 | # Runs doxygen and massages the output files. |
5624e564 | 4 | # Copyright (C) 2001-2015 Free Software Foundation, Inc. |
e03f70b3 | 5 | # |
0f752f44 | 6 | # Synopsis: run_doxygen --mode=[html|latex|man|xml] --host_alias=<alias> \ |
40e053e3 BK |
7 | # v3srcdir \ |
8 | # v3builddir \ | |
9 | # shortname | |
e03f70b3 | 10 | # |
b0037845 | 11 | # Originally hacked together by Phil Edwards <pme@gcc.gnu.org> |
bfcafa4f | 12 | |
e03f70b3 | 13 | |
cff75d2e | 14 | # We can check now that the version of doxygen is >= this variable. |
30f276c1 | 15 | DOXYVER=1.7.0 |
864e133c PE |
16 | |
17 | find_doxygen() { | |
f7ab5fa4 | 18 | local -r v_required=`echo $DOXYVER | \ |
0f752f44 | 19 | awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'` |
f7ab5fa4 | 20 | local testing_version doxygen maybedoxy v_found |
864e133c PE |
21 | # thank you goat book |
22 | set `IFS=:; X="$PATH:/usr/local/bin:/bin:/usr/bin"; echo $X` | |
23 | for dir | |
24 | do | |
25 | # AC_EXEEXT could come in useful here | |
26 | maybedoxy="$dir/doxygen" | |
27 | test -f "$maybedoxy" && testing_version=`$maybedoxy --version` | |
cff75d2e MK |
28 | if test -n "$testing_version"; then |
29 | v_found=`echo $testing_version | \ | |
0f752f44 | 30 | awk -F. '{if(NF<3)$3=0;print ($1*100+$2)*100+$3}'` |
cff75d2e | 31 | if test $v_found -ge $v_required; then |
0f752f44 BK |
32 | doxygen="$maybedoxy" |
33 | break | |
cff75d2e | 34 | fi |
864e133c PE |
35 | fi |
36 | done | |
37 | if test -z "$doxygen"; then | |
0f752f44 BK |
38 | echo run_doxygen error: Could not find Doxygen $DOXYVER in path. 1>&2 |
39 | print_usage | |
864e133c | 40 | fi |
f7ab5fa4 PE |
41 | # We need to use other tools from the same package/version. |
42 | echo :: Using Doxygen tools from ${dir}. | |
43 | PATH=$dir:$PATH | |
44 | hash -r | |
864e133c | 45 | } |
e03f70b3 PE |
46 | |
47 | print_usage() { | |
48 | cat 1>&2 <<EOF | |
7e7432e2 | 49 | Usage: run_doxygen --mode=MODE --host_alias=BUILD_ALIAS [<options>] |
0f752f44 | 50 | <v3-src-dir> <v3-build-dir> <shortnamesp> |
e03f70b3 | 51 | MODE is one of: |
0f752f44 BK |
52 | html Generate user-level HTML library documentation. |
53 | man Generate user-level man pages. | |
54 | xml Generate user-level XML pages. | |
55 | latex Generate user-level LaTeX pages. | |
e03f70b3 | 56 | |
3ebf2eba MK |
57 | BUILD_ALIAS is the GCC build alias set at configure time. |
58 | ||
e03f70b3 PE |
59 | Note: Requires Doxygen ${DOXYVER} or later; get it at |
60 | ftp://ftp.stack.nl/pub/users/dimitri/doxygen-${DOXYVER}.src.tar.gz | |
61 | ||
62 | EOF | |
63 | exit 1 | |
64 | } | |
65 | ||
66 | parse_options() { | |
67 | for o | |
68 | do | |
69 | # Blatantly ripped from autoconf, er, I mean, "gratefully standing | |
70 | # on the shoulders of those giants who have gone before us." | |
71 | case "$o" in | |
72 | -*=*) arg=`echo "$o" | sed 's/[-_a-zA-Z0-9]*=//'` ;; | |
73 | *) arg= ;; | |
74 | esac | |
75 | ||
76 | case "$o" in | |
77 | --mode=*) | |
0f752f44 | 78 | mode=$arg ;; |
7e7432e2 | 79 | --host_alias=*) |
0f752f44 | 80 | host_alias=$arg ;; |
7e7432e2 | 81 | --mode | --host_alias | --help | -h) |
0f752f44 | 82 | print_usage ;; |
e03f70b3 | 83 | *) |
0f752f44 BK |
84 | # this turned out to be a mess, maybe change to --srcdir=, etc |
85 | if test $srcdir = unset; then | |
86 | srcdir=$o | |
87 | elif test $outdir = unset; then | |
88 | builddir=${o} | |
89 | outdir=${o}/doc/doxygen | |
90 | elif test $shortname = unset; then | |
91 | shortname=$o | |
92 | else | |
93 | echo run_doxygen error: Too many arguments 1>&2 | |
94 | exit 1 | |
95 | fi | |
96 | ;; | |
e03f70b3 PE |
97 | esac |
98 | done | |
99 | } | |
100 | ||
101 | ||
102 | # script begins here | |
103 | mode=unset | |
7e7432e2 | 104 | host_alias=unset |
e03f70b3 PE |
105 | srcdir=unset |
106 | outdir=unset | |
40e053e3 | 107 | shortname=unset |
a43d13fb | 108 | do_html=false |
0f752f44 BK |
109 | do_man=false |
110 | do_xml=false | |
111 | do_latex=false | |
ffe94f83 | 112 | enabled_sections= |
4bc8ae23 | 113 | generate_tagfile= |
efe44c60 | 114 | DATEtext=`date '+%Y-%m-%d'` |
e03f70b3 | 115 | |
00aca6e8 BK |
116 | # Show how this script is called. |
117 | echo run_doxygen $* | |
118 | ||
e03f70b3 | 119 | parse_options $* |
864e133c | 120 | find_doxygen |
e03f70b3 | 121 | |
40e053e3 | 122 | if test $srcdir = unset || test $outdir = unset || test $mode = unset || test $shortname = unset || test $host_alias = unset; then |
e03f70b3 PE |
123 | # this could be better |
124 | echo run_doxygen error: You have not given enough information...! 1>&2 | |
125 | print_usage | |
126 | fi | |
127 | ||
128 | case x"$mode" in | |
4312e020 | 129 | xhtml) |
4bc8ae23 PE |
130 | do_html=true |
131 | enabled_sections=maint | |
4312e020 | 132 | generate_tagfile="$outdir/html/libstdc++.tag" |
4bc8ae23 | 133 | ;; |
0f752f44 BK |
134 | xlatex) |
135 | do_latex=true | |
136 | enabled_sections=maint | |
137 | ;; | |
4bc8ae23 PE |
138 | xman) |
139 | do_man=true | |
140 | ;; | |
8a165db0 BK |
141 | xxml) |
142 | do_xml=true | |
143 | enabled_sections=maint | |
144 | ;; | |
e03f70b3 PE |
145 | *) |
146 | echo run_doxygen error: $mode is an invalid mode 1>&2 | |
147 | exit 1 ;; | |
148 | esac | |
149 | ||
40e053e3 BK |
150 | case x"$shortname" in |
151 | xYES) | |
152 | ;; | |
153 | xNO) | |
154 | ;; | |
155 | *) | |
156 | echo run_doxygen error: $shortname is invalid 1>&2 | |
157 | exit 1 ;; | |
158 | esac | |
159 | ||
160 | ||
669f7a03 PE |
161 | mkdir -p $outdir |
162 | chmod u+w $outdir | |
ffe94f83 | 163 | |
60f8b2e2 | 164 | # Run it |
e03f70b3 | 165 | ( |
60f8b2e2 BK |
166 | set -e |
167 | cd $builddir | |
168 | sed -e "s=@outdir@=${outdir}=g" \ | |
169 | -e "s=@srcdir@=${srcdir}=g" \ | |
170 | -e "s=@shortname@=${shortname}=g" \ | |
171 | -e "s=@builddir@=${builddir}=g" \ | |
172 | -e "s=@host_alias@=${host_alias}=g" \ | |
173 | -e "s=@enabled_sections@=${enabled_sections}=" \ | |
174 | -e "s=@do_html@=${do_html}=" \ | |
175 | -e "s=@do_latex@=${do_latex}=" \ | |
176 | -e "s=@do_man@=${do_man}=" \ | |
177 | -e "s=@do_xml@=${do_xml}=" \ | |
178 | -e "s=@generate_tagfile@=${generate_tagfile}=" \ | |
179 | ${srcdir}/doc/doxygen/user.cfg.in > ${outdir}/${mode}.cfg | |
180 | echo :: NOTE that this may take some time... | |
181 | echo doxygen ${outdir}/${mode}.cfg | |
182 | doxygen ${outdir}/${mode}.cfg | |
0f752f44 BK |
183 | ) |
184 | ret=$? | |
185 | test $ret -ne 0 && exit $ret | |
186 | ||
60f8b2e2 BK |
187 | if $do_xml; then |
188 | echo :: | |
189 | echo :: XML pages begin with | |
190 | echo :: ${outdir}/xml/index.xml | |
0f752f44 BK |
191 | fi |
192 | ||
60f8b2e2 BK |
193 | if $do_latex; then |
194 | cd ${outdir}/${mode} | |
195 | ||
710d672b JW |
196 | # Grrr, Doxygen 1.8.x changed the -w latex options. |
197 | need_footer=`doxygen -h | sed -n -e '/-w latex/s=.*footer.*=true=p'` | |
198 | ||
199 | # Also drop in the header file (maybe footer file) and style sheet | |
200 | if $need_footer; then | |
201 | doxygen -w latex header.tex footer.tex doxygen.sty | |
202 | else | |
203 | doxygen -w latex header.tex doxygen.sty | |
204 | fi | |
60f8b2e2 BK |
205 | |
206 | echo :: | |
207 | echo :: LaTeX pages begin with | |
208 | echo :: ${outdir}/latex/refman.tex | |
209 | fi | |
210 | ||
a43d13fb | 211 | if $do_html; then |
60f8b2e2 | 212 | cd ${outdir}/${mode} |
f7ab5fa4 PE |
213 | |
214 | #doxytag -t libstdc++.tag . > /dev/null 2>&1 | |
c0ffa2ba BK |
215 | |
216 | # Strip pathnames from tag file. | |
a43d13fb PE |
217 | sed -e '/<path>/d' libstdc++.tag > TEMP |
218 | mv TEMP libstdc++.tag | |
f7ab5fa4 | 219 | |
4312e020 BK |
220 | sed -e "s=@DATE@=${DATEtext}=" \ |
221 | ${srcdir}/doc/doxygen/mainpage.html > index.html | |
e1bff39a | 222 | |
bd2726e0 PE |
223 | # The following bit of line noise changes annoying |
224 | # std::foo < typename _Ugly1, typename _Ugly2, .... _DefaultUgly17 > | |
225 | # to user-friendly | |
226 | # std::foo | |
227 | # in the major "Compound List" page. | |
a1fa4e31 PE |
228 | sed -e 's=\(::[[:alnum:]_]*\)< .* >=\1=' annotated.html > annstrip.html |
229 | mv annstrip.html annotated.html | |
e1bff39a | 230 | |
4312e020 | 231 | cp ${srcdir}/doc/doxygen/tables.html tables.html |
60f8b2e2 | 232 | |
a1fa4e31 PE |
233 | echo :: |
234 | echo :: HTML pages begin with | |
4312e020 | 235 | echo :: ${outdir}/html/index.html |
a43d13fb | 236 | fi |
e03f70b3 | 237 | |
2f9d51b8 PE |
238 | # Mess with the man pages. We don't need documentation of the internal |
239 | # headers, since the man pages for those contain nothing useful anyhow. The | |
240 | # man pages for doxygen modules need to be renamed (or deleted). And the | |
241 | # generated #include lines need to be changed from the internal names to the | |
242 | # standard ones (e.g., "#include <stl_tempbuf.h>" -> "#include <memory>"). | |
a43d13fb | 243 | if $do_man; then |
ffe94f83 | 244 | echo :: |
2f9d51b8 | 245 | echo :: Fixing up the man pages... |
ffe94f83 PE |
246 | cd $outdir/man/man3 |
247 | ||
729e3d3f | 248 | # File names with embedded spaces (EVIL!) need to be....? renamed or removed? |
a43d13fb | 249 | find . -name "* *" -print0 | xargs -0r rm # requires GNU tools |
2f9d51b8 | 250 | |
ffe94f83 PE |
251 | # man pages are for functions/types/other entities, not source files |
252 | # directly. who the heck would type "man foo.h" anyhow? | |
7850920c | 253 | find . -name "[a-z]*" -a ! -name "std_*" -print | xargs rm |
aac2878e | 254 | rm -f *.h.3 *.hpp.3 *config* *.cc.3 *.tcc.3 *_t.3 |
7850920c | 255 | #rm ext_*.3 tr1_*.3 debug_*.3 |
aac2878e | 256 | |
04b7c941 PE |
257 | # this is used to examine what we would have deleted, for debugging |
258 | #mkdir trash | |
ffe94f83 PE |
259 | #find . -name "[a-z]*" -a ! -name "std_*" -print | xargs -i mv {} trash |
260 | #mv *.h.3 *config* *.cc.3 *.tcc.3 *_t.3 trash | |
2f9d51b8 PE |
261 | |
262 | # Standardize the displayed header names. If anyone who knows perl cares | |
263 | # enough to rewrite all this, feel free. This only gets run once a century, | |
264 | # and I'm off getting coffee then anyhow, so I didn't care enough to make | |
265 | # this super-fast. | |
4312e020 | 266 | g++ ${srcdir}/doc/doxygen/stdheader.cc -o ./stdheader |
2f9d51b8 PE |
267 | problematic=`egrep -l '#include <.*_.*>' [a-z]*.3` |
268 | for f in $problematic; do | |
269 | # this is also slow, but safe and easy to debug | |
53e0a447 | 270 | oldh=`sed -n '/fC#include </s/.*<\(.*\)>.*/\1/p' $f` |
2f9d51b8 | 271 | newh=`echo $oldh | ./stdheader` |
801fe0bb | 272 | sed 's=${oldh}=${newh}=' $f > TEMP |
2f9d51b8 PE |
273 | mv TEMP $f |
274 | done | |
275 | rm stdheader | |
276 | ||
b0037845 | 277 | # Some of the pages for generated modules have text that confuses certain |
70c6e9cb GP |
278 | # implementations of man(1), e.g. on GNU/Linux. We need to have another |
279 | # top-level *roff tag to /stop/ the .SH NAME entry. | |
7850920c | 280 | problematic=`egrep --files-without-match '^\.SH SYNOPSIS' [A-Z]*.3` |
aac2878e | 281 | #problematic='Containers.3 Sequences.3 Assoc_containers.3 Iterator_types.3' |
7850920c BK |
282 | |
283 | for f in $problematic; do | |
284 | sed '/^\.SH NAME/{ | |
285 | n | |
286 | a\ | |
287 | \ | |
288 | .SH SYNOPSIS | |
289 | }' $f > TEMP | |
290 | mv TEMP $f | |
291 | done | |
b0037845 | 292 | |
bd2726e0 PE |
293 | # Also, break this (generated) line up. It's ugly as sin. |
294 | problematic=`grep -l '[^^]Definition at line' *.3` | |
295 | for f in $problematic; do | |
296 | sed 's/Definition at line/\ | |
297 | .PP\ | |
298 | &/' $f > TEMP | |
299 | mv TEMP $f | |
300 | done | |
301 | ||
4312e020 | 302 | cp ${srcdir}/doc/doxygen/Intro.3 C++Intro.3 |
bd2726e0 PE |
303 | |
304 | # Why didn't I do this at the start? Were rabid weasels eating my brain? | |
305 | # Who the fsck would "man std_vector" when the class isn't named that? | |
4312e020 BK |
306 | |
307 | # First, deal with nested namespaces. | |
a2edd3e9 BK |
308 | for f in *chrono_*; do |
309 | newname=`echo $f | sed 's/chrono_/chrono::/'` | |
310 | mv $f $newname | |
311 | done | |
312 | for f in *__debug_*; do | |
313 | newname=`echo $f | sed 's/__debug_/__debug::/'` | |
314 | mv $f $newname | |
315 | done | |
316 | for f in *decimal_*; do | |
317 | newname=`echo $f | sed 's/decimal_/decimal::/'` | |
318 | mv $f $newname | |
319 | done | |
4312e020 BK |
320 | for f in *__detail_*; do |
321 | newname=`echo $f | sed 's/__detail_/__detail::/'` | |
322 | mv $f $newname | |
323 | done | |
a345e45d BK |
324 | for f in *__gnu_pbds_detail_*; do |
325 | newname=`echo $f | sed 's/detail_/detail::/'` | |
326 | mv $f $newname | |
327 | done | |
4312e020 BK |
328 | for f in *__parallel_*; do |
329 | newname=`echo $f | sed 's/__parallel_/__parallel::/'` | |
330 | mv $f $newname | |
331 | done | |
8d079e67 BK |
332 | for f in *__profile_*; do |
333 | newname=`echo $f | sed 's/__profile_/__profile::/'` | |
334 | mv $f $newname | |
335 | done | |
4312e020 | 336 | |
6b4f8906 JW |
337 | # Remove inline namespaces used for versioning. |
338 | for f in *_V2_*; do | |
339 | newname=`echo $f | sed 's/_V2_/::/'` | |
340 | sed 's/::_V2::/::/g' $f > $newname | |
341 | rm $f | |
342 | done | |
343 | for f in *_experimental_filesystem_v?_*; do | |
344 | newname=`echo $f | sed 's/_filesystem_v._/::filesystem::/'` | |
345 | sed 's/::filesystem::v.::/::filesystem::/g' $f > $newname | |
346 | rm $f | |
347 | done | |
348 | for f in *experimental_fundamentals_v?_*; do | |
349 | newname=`echo $f | sed 's/experimental_.*_v[[:digit:]]_/experimental::/'` | |
350 | sed 's/::experimental::fundamentals_v[[:digit:]]::/::experimental::/g' $f > $newname | |
351 | rm $f | |
352 | done | |
353 | ||
4312e020 | 354 | # Then, clean up other top-level namespaces. |
0aa06b18 BK |
355 | for f in std_tr1_*; do |
356 | newname=`echo $f | sed 's/^std_tr1_/std::tr1::/'` | |
357 | mv $f $newname | |
358 | done | |
08624e90 BK |
359 | for f in std_tr2_*; do |
360 | newname=`echo $f | sed 's/^std_tr2_/std::tr2::/'` | |
361 | mv $f $newname | |
362 | done | |
bd2726e0 PE |
363 | for f in std_*; do |
364 | newname=`echo $f | sed 's/^std_/std::/'` | |
365 | mv $f $newname | |
366 | done | |
367 | for f in __gnu_cxx_*; do | |
368 | newname=`echo $f | sed 's/^__gnu_cxx_/__gnu_cxx::/'` | |
369 | mv $f $newname | |
370 | done | |
4312e020 BK |
371 | for f in __gnu_debug_*; do |
372 | newname=`echo $f | sed 's/^__gnu_debug_/__gnu_debug::/'` | |
373 | mv $f $newname | |
374 | done | |
375 | for f in __gnu_parallel_*; do | |
376 | newname=`echo $f | sed 's/^__gnu_parallel_/__gnu_parallel::/'` | |
377 | mv $f $newname | |
378 | done | |
8d079e67 BK |
379 | for f in __gnu_profile_*; do |
380 | newname=`echo $f | sed 's/^__gnu_profile_/__gnu_profile::/'` | |
381 | mv $f $newname | |
382 | done | |
383 | for f in __gnu_pbds_*; do | |
384 | newname=`echo $f | sed 's/^__gnu_pbds_/__gnu_pbds::/'` | |
385 | mv $f $newname | |
386 | done | |
7850920c BK |
387 | for f in __cxxabiv1_*; do |
388 | newname=`echo $f | sed 's/^__cxxabiv1_/abi::/'` | |
389 | mv $f $newname | |
390 | done | |
6309eefc | 391 | |
a2edd3e9 | 392 | # Then piecemeal nested classes |
a2edd3e9 BK |
393 | |
394 | ||
4312e020 | 395 | # Generic removal bits, where there are things in the generated man |
6309eefc BK |
396 | # pages that need to be killed. |
397 | for f in *_libstdc__-v3_*; do | |
0f752f44 | 398 | rm $f |
66fda8b2 | 399 | done |
6309eefc BK |
400 | |
401 | for f in *_src_*; do | |
0f752f44 | 402 | rm $f |
bd2726e0 PE |
403 | done |
404 | ||
6309eefc | 405 | |
bd2726e0 PE |
406 | # Also, for some reason, typedefs don't get their own man pages. Sigh. |
407 | for f in ios streambuf istream ostream iostream stringbuf \ | |
0f752f44 BK |
408 | istringstream ostringstream stringstream filebuf ifstream \ |
409 | ofstream fstream string; | |
bd2726e0 PE |
410 | do |
411 | echo ".so man3/std::basic_${f}.3" > std::${f}.3 | |
412 | echo ".so man3/std::basic_${f}.3" > std::w${f}.3 | |
413 | done | |
e03f70b3 | 414 | |
ffe94f83 PE |
415 | echo :: |
416 | echo :: Man pages in ${outdir}/man | |
a43d13fb | 417 | fi |
2f9d51b8 PE |
418 | |
419 | # all done | |
e03f70b3 | 420 | echo :: |
e03f70b3 PE |
421 | |
422 | exit 0 |