# # To fully function, this script needs the following variables # set: # # INSTALLING # DEFAULT_TMPDIR # TOP_PWD # libdir # libexecdir # ProjectVersionInt # HSP_IMPORTS if ( $ENV{'TMPDIR'} ) { # where to make tmp file names $tmp = $ENV{'TMPDIR'} . "/$$.eht"; } else { $tmp ="${DEFAULT_TMPDIR}/$$.eht"; $ENV{'TMPDIR'} = ${DEFAULT_TMPDIR}; # set the env var as well } $TopPwd = "${TOP_PWD}"; # *Only* needed when using it in-situ (i.e., INSTALLING=0). $InstLibDirGhc = "${libdir}"; $InstLibExecDirGhc = "${libexecdir}"; $Unlit = ( $INSTALLING ? "${InstLibExecDirGhc}/unlit" : "${TopPwd}/ghc/utils/unlit/unlit" ); # but this is re-set to "cat" (after options) if -cpp not seen $HsCpp = ( $INSTALLING ? "${InstLibDirGhc}/hscpp" : "${TopPwd}/ghc/utils/hscpp/hscpp" ); $HsP = ( $INSTALLING ? "${InstLibExecDirGhc}/hsp" : "${TopPwd}/ghc/compiler/hsp" ); $HsTagsHelp = ( $INSTALLING ? "${InstLibExecDirGhc}/hstags-help" : "${TopPwd}/ghc/utils/hstags/hstags-help" ); $Verbose = 0; $Append = '>'; $DoCpp = 0; $Cpp_opts = ''; $HsP_opts = ''; @Files = (); while ($ARGV[0] =~ /^-./) { $_ = shift(@ARGV); /^--/ && last; /^-v/ && ($Verbose = 1, next); /^-a$/ && ($Append = '>>', next); /^-fglasgow-exts/ && ($HsP_opts .= ' -N', next); /^-optP(.*)/ && ($Cpp_opts .= " $1", next); /^-[UDI]/ && ($Cpp_opts .= " $_", next); /^-cpp/ && ($DoCpp = 1, next); /^-/ && next; # ignore the rest push(@Files, $_); } $DoHsCpp = ( ! $DoCpp ) ? 'cat' : "$HsCpp -D__HASKELL1__=2 -D__GLASGOW_HASKELL__=$ProjectVersionInt $Cpp_opts"; # to find Prelude.hi and friends. $HsP_opts .= ( $INSTALLING ? "-J${InstLibDirGhc}/imports" : ( '-J' . join(' -J',split(/:/,${HSP_IMPORTS})) )); open(STDOUT, "$Append TAGS") || die "can't create TAGS"; foreach $f ( @ARGV ) { # if file is in a dir && we are CPPing, then we add its dir to the -I list. if ( $DoCpp && $f =~ /(.+)\/[^\/]+$/ ) { $Idir = "-I$1"; } else { $Idir = ''; } if ( $f =~ /\.lhs$/ ) { $ToDo = "$Unlit $f - | $DoHsCpp $Idir | $HsP -E $HsP_opts | $HsTagsHelp $f > $tmp"; } else { $ToDo = "$DoHsCpp $Idir < $f | $HsP -E $HsP_opts | $HsTagsHelp $f > $tmp"; } print STDERR "$ToDo\n" if $Verbose; system($ToDo); $return_val = $?; die "Fatal error $return_val\n" if $return_val != 0; ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime, $ctime,$blksize,$blocks) = stat("$tmp"); print STDOUT "\f\n$f,${size}\n"; print STDOUT `cat $tmp`; } unlink $tmp;