#! /usr/local/bin/perl # ($Pgm = $0) =~ s/.*\/([^\/]+)$/\1/; $Usage = "\n" . <<EOUSAGE; Usage: $Pgm [-? or -help] [-k] [-n] [-v] [-t] dir/module-target(s) This script runs `make' to build the requested target, WITHOUT including the dependencies generated by `mkdependHS' (i.e., all those derived from import declarations). With a -t flag, it also sets the modification time of the resulting .hi file (one target only, please) to some EARLY date, so that changes to that interface will not trigger much useless recompilation. Typical uses, for module "Bar" in directory "foo": (1) You've changed "Bar" and you want to recompile it; you know that other module interfaces are stable, so you'd rather do without all of `make''s prognostications: $Pgm foo/Bar.s (2) You've ADDED a new function to "Bar"; you want to recompile that module, BUT NOT TRIGGER LOTS OF FURTHER COMPILATION because of the "changed" interface file: $Pgm -t foo/Bar.s USE AT YOUR OWN RISK: you can make a big mess with this script! EOUSAGE $Makefile = 'Makefile'; $Tmpfile = "/tmp/Makefile$$"; chop($Arch = `/bin/arch`); $SleazyTouch = '/usr/5bin/touch'; $DoTouch = 0; $Verbose = 0; $MakeFlags = ''; sub rm_temp_file { print STDERR "rm $Tmpfile\n" if $Verbose; unlink $Tmpfile; exit(1); } $SIG{'INT'} = 'rm_temp_file'; $SIG{'QUIT'} = 'rm_temp_file'; $Target = ''; $DirMod = ''; # the dir/module-file to make # process ARGV while ($_ = $ARGV[0]) { shift(@ARGV); if (/^-\?$/ || /^-help$/) { print $Usage; exit 1; } elsif (/^-v$/) { $Verbose = 1; } elsif (/^-t$/) { $Do_touch = 1; } elsif (/^-k$/) { $MakeFlags .= ' -k'; } elsif (/^-n$/) { $MakeFlags .= ' -n'; } elsif (/^-d$/) { $MakeFlags .= ' -d'; } elsif (/^-/) { print STDERR "$Pgm: unknown option: $_\n\n$Usage"; exit 1; } elsif (/^([A-Z_]+)=(.+)/) { $MakeFlags .= " $1=\"$2\""; } elsif ($Do_touch) { # the module file $Target = $_; if ( /([^\/]+\/[^\/\.]+)\.[a-z]+/ ) { $DirMod = $1; } else { print STDERR "$Pgm: argument not of the form: directory/Module.suffix: $_\n\n$Usage"; exit 1; } } else { # accumulate as "Target"... $Target .= " $_"; } } if ($Do_touch && $Target =~ / /) { print STDERR "$Pgm: too many arguments\n\n$Usage"; exit 1; } open(INF, "<$Makefile") || die "Can't open $Makefile for input\n"; open(OUTF,">$Tmpfile") || die "Can't open $Tmpfile for output\n"; select(OUTF); $_ = <INF>; # copy through until ... while ( $_ && ! /^# DO NOT DELETE: Beginning of Haskell dependencies/ ) { print $_; $_ = <INF>; } # now copy through 'til the end, omittin the %.[so] : %.hi dependencies while ( $_ ) { print $_ if ! /^\S+ : \S+\.hi$/; $_ = <INF>; } close(INF); close(OUTF); if ($Arch ne "sun3") { $Make = 'make JMAKE=jmake LIT2PGM=lit2pgm LIT2LATEX=lit2latex LIT2TEXI=lit2texi MKDEPENDLIT=mkdependlit MAKEINFO=makeinfo POSTMAKEINFO=postmakeinfo'; } else { $Make = 'make'; } print STDERR "$Make $MakeFlags -f $Tmpfile $Target; rm $Tmpfile\n" if $Verbose; system( "$Make $MakeFlags -f $Tmpfile $Target; rm $Tmpfile" ); if ($Do_touch) { print STDERR "$SleazyTouch -m 01010101 $DirMod\.hi\n" if $Verbose; system( "$SleazyTouch -m 01010101 $DirMod\.hi" ); }