1 #! /bin/sh
   2 # depcomp - compile a program generating dependencies as side-effects
   3 
   4 scriptversion=2007-03-29.01
   5 
   6 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
   7 # Foundation, Inc.
   8 
   9 # This program is free software; you can redistribute it and/or modify
  10 # it under the terms of the GNU General Public License as published by
  11 # the Free Software Foundation; either version 2, or (at your option)
  12 # any later version.
  13 
  14 # This program is distributed in the hope that it will be useful,
  15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 # GNU General Public License for more details.
  18 
  19 # You should have received a copy of the GNU General Public License
  20 # along with this program; if not, write to the Free Software
  21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  22 # 02110-1301, USA.
  23 
  24 # As a special exception to the GNU General Public License, if you
  25 # distribute this file as part of a program that contains a
  26 # configuration script generated by Autoconf, you may include it under
  27 # the same distribution terms that you use for the rest of that program.
  28 
  29 # Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
  30 
  31 case $1 in
  32   '')
  33      echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
  34      exit 1;
  35      ;;
  36   -h | --h*)
  37     cat <<\EOF
  38 Usage: depcomp [--help] [--version] PROGRAM [ARGS]
  39 
  40 Run PROGRAMS ARGS to compile a file, generating dependencies
  41 as side-effects.
  42 
  43 Environment variables:
  44   depmode     Dependency tracking mode.
  45   source      Source file read by `PROGRAMS ARGS'.
  46   object      Object file output by `PROGRAMS ARGS'.
  47   DEPDIR      directory where to store dependencies.
  48   depfile     Dependency file to output.
  49   tmpdepfile  Temporary file to use when outputing dependencies.
  50   libtool     Whether libtool is used (yes/no).
  51 
  52 Report bugs to <bug-automake@gnu.org>.
  53 EOF
  54     exit $?
  55     ;;
  56   -v | --v*)
  57     echo "depcomp $scriptversion"
  58     exit $?
  59     ;;
  60 esac
  61 
  62 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
  63   echo "depcomp: Variables source, object and depmode must be set" 1>&2
  64   exit 1
  65 fi
  66 
  67 # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
  68 depfile=${depfile-`echo "$object" |
  69   sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
  70 tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
  71 
  72 rm -f "$tmpdepfile"
  73 
  74 # Some modes work just like other modes, but use different flags.  We
  75 # parameterize here, but still list the modes in the big case below,
  76 # to make depend.m4 easier to write.  Note that we *cannot* use a case
  77 # here, because this file can only contain one case statement.
  78 if test "$depmode" = hp; then
  79   # HP compiler uses -M and no extra arg.
  80   gccflag=-M
  81   depmode=gcc
  82 fi
  83 
  84 if test "$depmode" = dashXmstdout; then
  85    # This is just like dashmstdout with a different argument.
  86    dashmflag=-xM
  87    depmode=dashmstdout
  88 fi
  89 
  90 case "$depmode" in
  91 gcc3)
  92 ## gcc 3 implements dependency tracking that does exactly what
  93 ## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
  94 ## it if -MD -MP comes after the -MF stuff.  Hmm.
  95 ## Unfortunately, FreeBSD c89 acceptance of flags depends upon
  96 ## the command line argument order; so add the flags where they
  97 ## appear in depend2.am.  Note that the slowdown incurred here
  98 ## affects only configure: in makefiles, %FASTDEP% shortcuts this.
  99   for arg
 100   do
 101     case $arg in
 102     -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
 103     *)  set fnord "$@" "$arg" ;;
 104     esac
 105     shift # fnord
 106     shift # $arg
 107   done
 108   "$@"
 109   stat=$?
 110   if test $stat -eq 0; then :
 111   else
 112     rm -f "$tmpdepfile"
 113     exit $stat
 114   fi
 115   mv "$tmpdepfile" "$depfile"
 116   ;;
 117 
 118 gcc)
 119 ## There are various ways to get dependency output from gcc.  Here's
 120 ## why we pick this rather obscure method:
 121 ## - Don't want to use -MD because we'd like the dependencies to end
 122 ##   up in a subdir.  Having to rename by hand is ugly.
 123 ##   (We might end up doing this anyway to support other compilers.)
 124 ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
 125 ##   -MM, not -M (despite what the docs say).
 126 ## - Using -M directly means running the compiler twice (even worse
 127 ##   than renaming).
 128   if test -z "$gccflag"; then
 129     gccflag=-MD,
 130   fi
 131   "$@" -Wp,"$gccflag$tmpdepfile"
 132   stat=$?
 133   if test $stat -eq 0; then :
 134   else
 135     rm -f "$tmpdepfile"
 136     exit $stat
 137   fi
 138   rm -f "$depfile"
 139   echo "$object : \\" > "$depfile"
 140   alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
 141 ## The second -e expression handles DOS-style file names with drive letters.
 142   sed -e 's/^[^:]*: / /' \
 143       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
 144 ## This next piece of magic avoids the `deleted header file' problem.
 145 ## The problem is that when a header file which appears in a .P file
 146 ## is deleted, the dependency causes make to die (because there is
 147 ## typically no way to rebuild the header).  We avoid this by adding
 148 ## dummy dependencies for each header file.  Too bad gcc doesn't do
 149 ## this for us directly.
 150   tr ' ' '
 151 ' < "$tmpdepfile" |
 152 ## Some versions of gcc put a space before the `:'.  On the theory
 153 ## that the space means something, we add a space to the output as
 154 ## well.
 155 ## Some versions of the HPUX 10.20 sed can't process this invocation
 156 ## correctly.  Breaking it into two sed invocations is a workaround.
 157     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
 158   rm -f "$tmpdepfile"
 159   ;;
 160 
 161 hp)
 162   # This case exists only to let depend.m4 do its work.  It works by
 163   # looking at the text of this script.  This case will never be run,
 164   # since it is checked for above.
 165   exit 1
 166   ;;
 167 
 168 sgi)
 169   if test "$libtool" = yes; then
 170     "$@" "-Wp,-MDupdate,$tmpdepfile"
 171   else
 172     "$@" -MDupdate "$tmpdepfile"
 173   fi
 174   stat=$?
 175   if test $stat -eq 0; then :
 176   else
 177     rm -f "$tmpdepfile"
 178     exit $stat
 179   fi
 180   rm -f "$depfile"
 181 
 182   if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
 183     echo "$object : \\" > "$depfile"
 184 
 185     # Clip off the initial element (the dependent).  Don't try to be
 186     # clever and replace this with sed code, as IRIX sed won't handle
 187     # lines with more than a fixed number of characters (4096 in
 188     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
 189     # the IRIX cc adds comments like `#:fec' to the end of the
 190     # dependency line.
 191     tr ' ' '
 192 ' < "$tmpdepfile" \
 193     | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
 194     tr '
 195 ' ' ' >> $depfile
 196     echo >> $depfile
 197 
 198     # The second pass generates a dummy entry for each header file.
 199     tr ' ' '
 200 ' < "$tmpdepfile" \
 201    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
 202    >> $depfile
 203   else
 204     # The sourcefile does not contain any dependencies, so just
 205     # store a dummy comment line, to avoid errors with the Makefile
 206     # "include basename.Plo" scheme.
 207     echo "#dummy" > "$depfile"
 208   fi
 209   rm -f "$tmpdepfile"
 210   ;;
 211 
 212 aix)
 213   # The C for AIX Compiler uses -M and outputs the dependencies
 214   # in a .u file.  In older versions, this file always lives in the
 215   # current directory.  Also, the AIX compiler puts `$object:' at the
 216   # start of each line; $object doesn't have directory information.
 217   # Version 6 uses the directory in both cases.
 218   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
 219   test "x$dir" = "x$object" && dir=
 220   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
 221   if test "$libtool" = yes; then
 222     tmpdepfile1=$dir$base.u
 223     tmpdepfile2=$base.u
 224     tmpdepfile3=$dir.libs/$base.u
 225     "$@" -Wc,-M
 226   else
 227     tmpdepfile1=$dir$base.u
 228     tmpdepfile2=$dir$base.u
 229     tmpdepfile3=$dir$base.u
 230     "$@" -M
 231   fi
 232   stat=$?
 233 
 234   if test $stat -eq 0; then :
 235   else
 236     rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
 237     exit $stat
 238   fi
 239 
 240   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
 241   do
 242     test -f "$tmpdepfile" && break
 243   done
 244   if test -f "$tmpdepfile"; then
 245     # Each line is of the form `foo.o: dependent.h'.
 246     # Do two passes, one to just change these to
 247     # `$object: dependent.h' and one to simply `dependent.h:'.
 248     sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
 249     # That's a tab and a space in the [].
 250     sed -e 's,^.*\.[a-z]*:[      ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
 251   else
 252     # The sourcefile does not contain any dependencies, so just
 253     # store a dummy comment line, to avoid errors with the Makefile
 254     # "include basename.Plo" scheme.
 255     echo "#dummy" > "$depfile"
 256   fi
 257   rm -f "$tmpdepfile"
 258   ;;
 259 
 260 icc)
 261   # Intel's C compiler understands `-MD -MF file'.  However on
 262   #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
 263   # ICC 7.0 will fill foo.d with something like
 264   #    foo.o: sub/foo.c
 265   #    foo.o: sub/foo.h
 266   # which is wrong.  We want:
 267   #    sub/foo.o: sub/foo.c
 268   #    sub/foo.o: sub/foo.h
 269   #    sub/foo.c:
 270   #    sub/foo.h:
 271   # ICC 7.1 will output
 272   #    foo.o: sub/foo.c sub/foo.h
 273   # and will wrap long lines using \ :
 274   #    foo.o: sub/foo.c ... \
 275   #     sub/foo.h ... \
 276   #     ...
 277 
 278   "$@" -MD -MF "$tmpdepfile"
 279   stat=$?
 280   if test $stat -eq 0; then :
 281   else
 282     rm -f "$tmpdepfile"
 283     exit $stat
 284   fi
 285   rm -f "$depfile"
 286   # Each line is of the form `foo.o: dependent.h',
 287   # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
 288   # Do two passes, one to just change these to
 289   # `$object: dependent.h' and one to simply `dependent.h:'.
 290   sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
 291   # Some versions of the HPUX 10.20 sed can't process this invocation
 292   # correctly.  Breaking it into two sed invocations is a workaround.
 293   sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
 294     sed -e 's/$/ :/' >> "$depfile"
 295   rm -f "$tmpdepfile"
 296   ;;
 297 
 298 hp2)
 299   # The "hp" stanza above does not work with aCC (C++) and HP's ia64
 300   # compilers, which have integrated preprocessors.  The correct option
 301   # to use with these is +Maked; it writes dependencies to a file named
 302   # 'foo.d', which lands next to the object file, wherever that
 303   # happens to be.
 304   # Much of this is similar to the tru64 case; see comments there.
 305   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
 306   test "x$dir" = "x$object" && dir=
 307   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
 308   if test "$libtool" = yes; then
 309     tmpdepfile1=$dir$base.d
 310     tmpdepfile2=$dir.libs/$base.d
 311     "$@" -Wc,+Maked
 312   else
 313     tmpdepfile1=$dir$base.d
 314     tmpdepfile2=$dir$base.d
 315     "$@" +Maked
 316   fi
 317   stat=$?
 318   if test $stat -eq 0; then :
 319   else
 320      rm -f "$tmpdepfile1" "$tmpdepfile2"
 321      exit $stat
 322   fi
 323 
 324   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
 325   do
 326     test -f "$tmpdepfile" && break
 327   done
 328   if test -f "$tmpdepfile"; then
 329     sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
 330     # Add `dependent.h:' lines.
 331     sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
 332   else
 333     echo "#dummy" > "$depfile"
 334   fi
 335   rm -f "$tmpdepfile" "$tmpdepfile2"
 336   ;;
 337 
 338 tru64)
 339    # The Tru64 compiler uses -MD to generate dependencies as a side
 340    # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
 341    # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
 342    # dependencies in `foo.d' instead, so we check for that too.
 343    # Subdirectories are respected.
 344    dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
 345    test "x$dir" = "x$object" && dir=
 346    base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
 347 
 348    if test "$libtool" = yes; then
 349       # With Tru64 cc, shared objects can also be used to make a
 350       # static library.  This mechanism is used in libtool 1.4 series to
 351       # handle both shared and static libraries in a single compilation.
 352       # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
 353       #
 354       # With libtool 1.5 this exception was removed, and libtool now
 355       # generates 2 separate objects for the 2 libraries.  These two
 356       # compilations output dependencies in $dir.libs/$base.o.d and
 357       # in $dir$base.o.d.  We have to check for both files, because
 358       # one of the two compilations can be disabled.  We should prefer
 359       # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
 360       # automatically cleaned when .libs/ is deleted, while ignoring
 361       # the former would cause a distcleancheck panic.
 362       tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
 363       tmpdepfile2=$dir$base.o.d          # libtool 1.5
 364       tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
 365       tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
 366       "$@" -Wc,-MD
 367    else
 368       tmpdepfile1=$dir$base.o.d
 369       tmpdepfile2=$dir$base.d
 370       tmpdepfile3=$dir$base.d
 371       tmpdepfile4=$dir$base.d
 372       "$@" -MD
 373    fi
 374 
 375    stat=$?
 376    if test $stat -eq 0; then :
 377    else
 378       rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
 379       exit $stat
 380    fi
 381 
 382    for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
 383    do
 384      test -f "$tmpdepfile" && break
 385    done
 386    if test -f "$tmpdepfile"; then
 387       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
 388       # That's a tab and a space in the [].
 389       sed -e 's,^.*\.[a-z]*:[    ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
 390    else
 391       echo "#dummy" > "$depfile"
 392    fi
 393    rm -f "$tmpdepfile"
 394    ;;
 395 
 396 #nosideeffect)
 397   # This comment above is used by automake to tell side-effect
 398   # dependency tracking mechanisms from slower ones.
 399 
 400 dashmstdout)
 401   # Important note: in order to support this mode, a compiler *must*
 402   # always write the preprocessed file to stdout, regardless of -o.
 403   "$@" || exit $?
 404 
 405   # Remove the call to Libtool.
 406   if test "$libtool" = yes; then
 407     while test $1 != '--mode=compile'; do
 408       shift
 409     done
 410     shift
 411   fi
 412 
 413   # Remove `-o $object'.
 414   IFS=" "
 415   for arg
 416   do
 417     case $arg in
 418     -o)
 419       shift
 420       ;;
 421     $object)
 422       shift
 423       ;;
 424     *)
 425       set fnord "$@" "$arg"
 426       shift # fnord
 427       shift # $arg
 428       ;;
 429     esac
 430   done
 431 
 432   test -z "$dashmflag" && dashmflag=-M
 433   # Require at least two characters before searching for `:'
 434   # in the target name.  This is to cope with DOS-style filenames:
 435   # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
 436   "$@" $dashmflag |
 437     sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
 438   rm -f "$depfile"
 439   cat < "$tmpdepfile" > "$depfile"
 440   tr ' ' '
 441 ' < "$tmpdepfile" | \
 442 ## Some versions of the HPUX 10.20 sed can't process this invocation
 443 ## correctly.  Breaking it into two sed invocations is a workaround.
 444     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
 445   rm -f "$tmpdepfile"
 446   ;;
 447 
 448 dashXmstdout)
 449   # This case only exists to satisfy depend.m4.  It is never actually
 450   # run, as this mode is specially recognized in the preamble.
 451   exit 1
 452   ;;
 453 
 454 makedepend)
 455   "$@" || exit $?
 456   # Remove any Libtool call
 457   if test "$libtool" = yes; then
 458     while test $1 != '--mode=compile'; do
 459       shift
 460     done
 461     shift
 462   fi
 463   # X makedepend
 464   shift
 465   cleared=no
 466   for arg in "$@"; do
 467     case $cleared in
 468     no)
 469       set ""; shift
 470       cleared=yes ;;
 471     esac
 472     case "$arg" in
 473     -D*|-I*)
 474       set fnord "$@" "$arg"; shift ;;
 475     # Strip any option that makedepend may not understand.  Remove
 476     # the object too, otherwise makedepend will parse it as a source file.
 477     -*|$object)
 478       ;;
 479     *)
 480       set fnord "$@" "$arg"; shift ;;
 481     esac
 482   done
 483   obj_suffix="`echo $object | sed 's/^.*\././'`"
 484   touch "$tmpdepfile"
 485   ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
 486   rm -f "$depfile"
 487   cat < "$tmpdepfile" > "$depfile"
 488   sed '1,2d' "$tmpdepfile" | tr ' ' '
 489 ' | \
 490 ## Some versions of the HPUX 10.20 sed can't process this invocation
 491 ## correctly.  Breaking it into two sed invocations is a workaround.
 492     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
 493   rm -f "$tmpdepfile" "$tmpdepfile".bak
 494   ;;
 495 
 496 cpp)
 497   # Important note: in order to support this mode, a compiler *must*
 498   # always write the preprocessed file to stdout.
 499   "$@" || exit $?
 500 
 501   # Remove the call to Libtool.
 502   if test "$libtool" = yes; then
 503     while test $1 != '--mode=compile'; do
 504       shift
 505     done
 506     shift
 507   fi
 508 
 509   # Remove `-o $object'.
 510   IFS=" "
 511   for arg
 512   do
 513     case $arg in
 514     -o)
 515       shift
 516       ;;
 517     $object)
 518       shift
 519       ;;
 520     *)
 521       set fnord "$@" "$arg"
 522       shift # fnord
 523       shift # $arg
 524       ;;
 525     esac
 526   done
 527 
 528   "$@" -E |
 529     sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
 530        -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
 531     sed '$ s: \\$::' > "$tmpdepfile"
 532   rm -f "$depfile"
 533   echo "$object : \\" > "$depfile"
 534   cat < "$tmpdepfile" >> "$depfile"
 535   sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
 536   rm -f "$tmpdepfile"
 537   ;;
 538 
 539 msvisualcpp)
 540   # Important note: in order to support this mode, a compiler *must*
 541   # always write the preprocessed file to stdout, regardless of -o,
 542   # because we must use -o when running libtool.
 543   "$@" || exit $?
 544   IFS=" "
 545   for arg
 546   do
 547     case "$arg" in
 548     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
 549         set fnord "$@"
 550         shift
 551         shift
 552         ;;
 553     *)
 554         set fnord "$@" "$arg"
 555         shift
 556         shift
 557         ;;
 558     esac
 559   done
 560   "$@" -E |
 561   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
 562   rm -f "$depfile"
 563   echo "$object : \\" > "$depfile"
 564   . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::    \1 \\:p' >> "$depfile"
 565   echo "        " >> "$depfile"
 566   . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
 567   rm -f "$tmpdepfile"
 568   ;;
 569 
 570 none)
 571   exec "$@"
 572   ;;
 573 
 574 *)
 575   echo "Unknown depmode $depmode" 1>&2
 576   exit 1
 577   ;;
 578 esac
 579 
 580 exit 0
 581 
 582 # Local Variables:
 583 # mode: shell-script
 584 # sh-indentation: 2
 585 # eval: (add-hook 'write-file-hooks 'time-stamp)
 586 # time-stamp-start: "scriptversion="
 587 # time-stamp-format: "%:y-%02m-%02d.%02H"
 588 # time-stamp-end: "$"
 589 # End: