160131Selan#!./perl
260131Selan
360131Selan$mainperldir = "/usr/bin";
460131Selan
560131Selanwhile (@ARGV) {
660131Selan    $nonono = 1 if $ARGV[0] eq '-n';
760131Selan    $versiononly = 1 if $ARGV[0] eq '-v';
860131Selan    shift;
960131Selan}
1060131Selan
1160131Selanumask 022;
1260131Selan
1360131Selan@scripts = ('cppstdin', 'h2ph', 'c2ph', 'pstruct', 'x2p/s2p', 'x2p/find2perl');
1460131Selan@manpages = ('perl.man', 'h2ph.man', 'x2p/a2p.man', 'x2p/s2p.man');
1560131Selan
1660131Selan# Read in the config file.
1760131Selan
1860131Selanopen(CONFIG, "config.sh") || die "You haven't run Configure yet!\n";
1960131Selanwhile (<CONFIG>) {
2060131Selan    if (s/^(\w+=)/\$$1/) {
2160131Selan	$accum =~ s/'undef'/undef/g;
2260131Selan	eval $accum;
2360131Selan	$accum = '';
2460131Selan    }
2560131Selan    $accum .= $_;
2660131Selan}
2760131Selanclose CONFIG;
2860131Selan
2960131Selanopen(PERL_C, "perl.c");
3060131Selanwhile (<PERL_C>) {
3160131Selan    last if /Revision:/;
3260131Selan}
3360131Selanclose PERL_C;
3460131Selans/.*Revision: //;
3560131Selan$major = $_ + 0;
3660131Selan
3760131Selan$ver = sprintf("%5.3f", $major + $PATCHLEVEL / 1000);
3860131Selan$release = substr($ver,0,3);
3960131Selan$patchlevel = substr($ver,3,2);
4060131Selan
4160131Selan# Do some quick sanity checks.
4260131Selan
4360131Selanif ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
4460131Selan
4560131Selan   $installbin		|| die "No installbin directory in config.sh\n";
4660131Selan-d $installbin		|| die "$installbin is not a directory\n";
4760131Selan-w $installbin		|| die "$installbin is not writable by you\n"
4860131Selan	unless $installbin =~ m#^/afs/#;
4960131Selan
5060131Selan-x 'perl'		|| die "perl isn't executable!\n";
5160131Selan-x 'taintperl'		|| die "taintperl isn't executable!\n";
5260131Selan-x 'suidperl'		|| die "suidperl isn't executable!\n" if $d_dosuid;
5360131Selan
5460131Selan-x 't/TEST'		|| warn "WARNING: You've never run 'make test'!!!",
5560131Selan	"  (Installing anyway.)\n";
5660131Selan
5760131Selan# First we install the version-numbered executables.
5860131Selan
5960131Selan&unlink("$installbin/perl$ver");
6060131Selan&cmd("cp perl $installbin/perl$ver");
6160131Selan
6260131Selan&unlink("$installbin/tperl$ver");
6360131Selan&cmd("cp taintperl $installbin/tperl$ver");
6460131Selan&chmod(0755, "$installbin/tperl$ver");		# force non-suid for security
6560131Selan
6660131Selan&unlink("$installbin/sperl$ver");
6760131Selanif ($d_dosuid) {
6860131Selan    &cmd("cp suidperl $installbin/sperl$ver");
6960131Selan    &chmod(04711, "$installbin/sperl$ver");
7060131Selan}
7160131Selan
7260131Selanexit 0 if $versiononly;
7360131Selan
7460131Selan# Make links to ordinary names if installbin directory isn't current directory.
7560131Selan
7660131Selan($bdev,$bino) = stat($installbin);
7760131Selan($ddev,$dino) = stat('.');
7860131Selan
7960131Selanif ($bdev != $ddev || $bino != $dino) {
8060131Selan    &unlink("$installbin/perl", "$installbin/taintperl", "$installbin/suidperl");
8160131Selan    &link("$installbin/perl$ver", "$installbin/perl");
8260131Selan    &link("$installbin/tperl$ver", "$installbin/taintperl");
8360131Selan    &link("$installbin/sperl$ver", "$installbin/suidperl") if $d_dosuid;
8460131Selan}
8560131Selan
8660131Selan($bdev,$bino) = stat($installbin);
8760131Selan($ddev,$dino) = stat('x2p');
8860131Selan
8960131Selanif ($bdev != $ddev || $bino != $dino) {
9060131Selan    &unlink("$installbin/a2p");
9160131Selan    &cmd("cp x2p/a2p $installbin/a2p");
9260131Selan    &chmod(0755, "$installbin/a2p");
9360131Selan}
9460131Selan
9560131Selan# Make some enemies in the name of standardization.   :-)
9660131Selan
9760131Selan($udev,$uino) = stat($mainperldir);
9860131Selan
9960131Selanif (-w _ && ($udev != $bdev || $uino != $bino) && !$nonono) {
10060131Selan    &unlink("$mainperldir/perl");
10160131Selan    eval 'link("$installbin/perl", "$mainperldir/perl")' ||
10260131Selan    eval 'symlink("$installbin/perl", "$mainperldir/perl")' ||
10360131Selan    &cmd("cp $installbin/perl $mainperldir");
10460131Selan}
10560131Selan
10660131Selan# Install scripts.
10760131Selan
10860131Selan&makedir($installscr);
10960131Selan
11060131Selanfor (@scripts) {
11160131Selan    &cmd("cp $_ $installscr");
11260131Selan    s#.*/##; &chmod(0755, "$installscr/$_");
11360131Selan}
11460131Selan
115*62692Selan# BSD modification -- install them in makefile.
11660131Selan
117*62692Selan# Install man pages.
118*62692Selan#
119*62692Selan#if ($mansrc ne '') {
120*62692Selan#    &makedir($mansrc);
121*62692Selan#
122*62692Selan#    ($mdev,$mino) = stat($mansrc);
123*62692Selan#    if ($mdev != $ddev || $mino != $dino) {
124*62692Selan#	for (@manpages) {
125*62692Selan#	    ($new = $_) =~ s/man$/$manext/;
126*62692Selan#	    $new =~ s#.*/##;
127*62692Selan#	    print STDERR "  Installing $mansrc/$new\n";
128*62692Selan#	    next if $nonono;
129*62692Selan#	    open(MI,$_) || warn "Can't open $_: $!\n";
130*62692Selan#	    open(MO,">$mansrc/$new") || warn "Can't install $mansrc/$new: $!\n";
131*62692Selan#	    print MO ".ds RP Release $release Patchlevel $patchlevel\n";
132*62692Selan#	    while (<MI>) {
133*62692Selan#		print MO;
134*62692Selan#	    }
135*62692Selan#	    close MI;
136*62692Selan#	    close MO;
137*62692Selan#	}
138*62692Selan#    }
139*62692Selan#}
14060131Selan
14160131Selan# Install library files.
14260131Selan
14360131Selan&makedir($installprivlib);
14460131Selanif (chdir "lib") {
14560131Selan
14660131Selan    ($pdev,$pino) = stat($installprivlib);
14760131Selan    ($ldev,$lino) = stat('.');
14860131Selan
14960131Selan    if ($pdev != $ldev || $pino != $lino) {
15060131Selan	foreach $file (<*.pl>) {
15160131Selan	    system "cmp", "-s", $file, "$privlib/$file";
15260131Selan	    if ($?) {
15360131Selan		&unlink("$installprivlib/$file");
15460131Selan		&cmd("cp $file $installprivlib");
15560131Selan		&chmod(0644, "$installprivlib/$file");
15660131Selan	    }
15760131Selan	}
15860131Selan    }
15960131Selan    chdir ".." || die "Can't cd back to source directory: $!\n";
16060131Selan}
16160131Selanelse {
16260131Selan    warn "Can't cd to lib to install lib files: $!\n";
16360131Selan}
16460131Selan
16560131Selan&chmod(0755, "usub/mus");
16660131Selan
16760131Selanprint STDERR "  Installation complete\n";
16860131Selan
16960131Selanexit 0;
17060131Selan
17160131Selan###############################################################################
17260131Selan
17360131Selansub unlink {
17460131Selan    local(@names) = @_;
17560131Selan
17660131Selan    foreach $name (@names) {
17760131Selan	next unless -e $name;
17860131Selan	print STDERR "  unlink $name\n";
17960131Selan	unlink($name) || warn "Couldn't unlink $name: $!\n" unless $nonono;
18060131Selan    }
18160131Selan}
18260131Selan
18360131Selansub cmd {
18460131Selan    local($cmd) = @_;
18560131Selan    print STDERR "  $cmd\n";
18660131Selan    unless ($nonono) {
18760131Selan	system $cmd;
18860131Selan	warn "Command failed!!!\n" if $?;
18960131Selan    }
19060131Selan}
19160131Selan
19260131Selansub link {
19360131Selan    local($from,$to) = @_;
19460131Selan
19560131Selan    print STDERR "  ln $from $to\n";
19660131Selan    link($from,$to) || warn "Couldn't link $from to $to: $!\n" unless $nonono;
19760131Selan}
19860131Selan
19960131Selansub chmod {
20060131Selan    local($mode,$name) = @_;
20160131Selan
20260131Selan    printf STDERR "  chmod %o %s\n", $mode, $name;
20360131Selan    chmod($mode,$name) || warn sprintf("Couldn't chmod %o %s: $!\n",$mode,$name)
20460131Selan	unless $nonono;
20560131Selan}
20660131Selan
20760131Selansub makedir {
20860131Selan    local($dir) = @_;
20960131Selan    unless (-d $dir) {
21060131Selan	local($shortdir) = $dir;
21160131Selan
21260131Selan	$shortdir =~ s#(.*)/.*#$1#;
21360131Selan	&makedir($shortdir);
21460131Selan
21560131Selan	print STDERR "  mkdir $dir\n";
21660131Selan	mkdir($dir, 0777) || warn "Couldn't create $dir: $!\n" unless $nonono;
21760131Selan    }
21860131Selan}
219