#!./perl
BEGIN {
require
5.004;
chdir
'..'
if
!-d
'lib'
and -d
'..\lib'
;
@INC
=
'lib'
;
$ENV
{PERL5LIB} =
'lib'
;
}
use
vars
qw($Is_VMS $Is_W32 $Is_OS2 $nonono $versiononly $depth)
;
BEGIN {
$Is_VMS
= $^O eq
'VMS'
;
$Is_W32
= $^O eq
'MSWin32'
;
$Is_OS2
= $^O eq
'os2'
;
if
(
$Is_VMS
) {
eval
'use VMS::Filespec;'
}
}
my
$scr_ext
= (
$Is_VMS
?
'.Com'
:
$Is_W32
?
'.bat'
:
''
);
use
subs
qw(unlink link chmod)
;
sub
mkpath {
File::Path::mkpath(
@_
)
unless
$nonono
;
}
my
$mainperldir
=
"/usr/bin"
;
my
$exe_ext
=
$Config
{exe_ext};
my
$perl
=
defined
(
$ENV
{PERLNAME}) ?
$ENV
{PERLNAME} :
'perl'
;
while
(
@ARGV
) {
$nonono
= 1
if
$ARGV
[0] eq
'-n'
;
$versiononly
= 1
if
$ARGV
[0] eq
'-v'
;
shift
;
}
umask
022
unless
$Is_VMS
;
my
@scripts
=
qw(utils/c2ph utils/h2ph utils/h2xs utils/perlbug utils/perldoc
utils/pl2pm utils/splain utils/perlcc
x2p/s2p x2p/find2perl
pod/pod2man pod/pod2html pod/pod2latex pod/pod2text)
;
if
(
$scr_ext
) {
@scripts
=
map
{
"$_$scr_ext"
}
@scripts
; }
my
@pods
= (<pod/*.pod>);
my
%archpms
= (
Config
=> 1,
);
if
($^O eq
'dos'
) {
push
(
@scripts
,
'djgpp/fixpmain'
);
$archpms
{config} =
$archpms
{filehand} = 1;
}
if
((-e
"testcompile"
) && (
defined
(
$ENV
{
'COMPILE'
})))
{
push
(
@scripts
,
map
(
"$_.exe"
,
@scripts
));
}
find(
sub
{
if
(
"$File::Find::dir/$_"
=~ m{^ext/[^/]+/(.*)\.pm$}) {
(
my
$pm
= $1) =~ s{^lib/}{};
$archpms
{
$pm
} = 1;
}
},
'ext'
);
my
$ver
= $];
my
$release
=
substr
(
$ver
,0,3);
my
$patchlevel
=
substr
(
$ver
,3,2);
die
"Patchlevel of perl ($patchlevel)"
,
"and patchlevel of config.sh ($Config{'PATCHLEVEL'}) don't match\n"
if
$patchlevel
!=
$Config
{
'PATCHLEVEL'
};
my
$installbin
=
$Config
{installbin};
my
$installscript
=
$Config
{installscript};
my
$installprivlib
=
$Config
{installprivlib};
my
$installarchlib
=
$Config
{installarchlib};
my
$installsitelib
=
$Config
{installsitelib};
my
$installsitearch
=
$Config
{installsitearch};
my
$installman1dir
=
$Config
{installman1dir};
my
$man1ext
=
$Config
{man1ext};
my
$libperl
=
$Config
{libperl};
my
$so
=
$Config
{so};
my
$dlext
=
$Config
{dlext};
my
$d_dosuid
=
$Config
{d_dosuid};
my
$binexp
=
$Config
{binexp};
if
(
$Is_VMS
) {
foreach
( \
$installbin
, \
$installscript
, \
$installprivlib
,
\
$installarchlib
, \
$installsitelib
, \
$installsitearch
,
\
$installman1dir
) {
$$_
= unixify(
$$_
);
$$_
=~ s:/$::;
}
}
if
(
$d_dosuid
&& $>) {
die
"You must run as root to install suidperl\n"
; }
$installbin
||
die
"No installbin directory in config.sh\n"
;
-d
$installbin
|| mkpath(
$installbin
, 1, 0777);
-d
$installbin
||
$nonono
||
die
"$installbin is not a directory\n"
;
-w
$installbin
||
$nonono
||
die
"$installbin is not writable by you\n"
unless
$installbin
=~ m
-x
'perl'
.
$exe_ext
||
die
"perl isn't executable!\n"
;
-x
'suidperl'
.
$exe_ext
||
die
"suidperl isn't executable!\n"
if
$d_dosuid
;
-x
't/TEST'
||
$Is_W32
||
warn
"WARNING: You've never run 'make test'!!!"
,
" (Installing anyway.)\n"
;
if
(
$Is_W32
) {
my
$perldll
=
'perl.'
.
$dlext
;
$perldll
=
'perlcore.'
.
$dlext
if
$Config
{
'ccflags'
} =~ /PERL_OBJECT/i;
-f
$perldll
||
die
"No perl DLL built\n"
;
safe_unlink(
"$installbin/$perldll"
);
copy(
"$perldll"
,
"$installbin/$perldll"
);
chmod
(0755,
"$installbin/$perldll"
);
}
my
$packlist
= ExtUtils::Packlist->new(
"$installarchlib/.packlist"
);
if
(
$Is_VMS
) {
safe_unlink(
"$installbin/$perl$exe_ext"
);
copy(
"perl$exe_ext"
,
"$installbin/$perl$exe_ext"
);
chmod
(0755,
"$installbin/$perl$exe_ext"
);
safe_unlink(
"$installbin/${perl}shr$exe_ext"
);
copy(
"perlshr$exe_ext"
,
"$installbin/${perl}shr$exe_ext"
);
chmod
(0755,
"$installbin/${perl}shr$exe_ext"
);
}
elsif
($^O eq
'mpeix'
) {
safe_unlink(
"$installbin/perl$ver$exe_ext"
,
$Config
{perlpath});
copy(
"perl$exe_ext"
,
$Config
{perlpath});
chmod
(0755,
$Config
{perlpath});
link
(
$Config
{perlpath},
"$installbin/perl$ver$exe_ext"
);
}
elsif
($^O ne
'dos'
) {
safe_unlink(
"$installbin/$perl$ver$exe_ext"
);
copy(
"perl$exe_ext"
,
"$installbin/$perl$ver$exe_ext"
);
chmod
(0755,
"$installbin/$perl$ver$exe_ext"
);
}
else
{
safe_unlink(
"$installbin/$perl.exe"
);
copy(
"perl.exe"
,
"$installbin/$perl.exe"
);
}
safe_unlink(
"$installbin/s$perl$ver$exe_ext"
);
if
(
$d_dosuid
) {
copy(
"suidperl$exe_ext"
,
"$installbin/s$perl$ver$exe_ext"
);
chmod
(04711,
"$installbin/s$perl$ver$exe_ext"
);
}
my
(
$do_installarchlib
,
$do_installprivlib
) = (0, 0);
mkpath(
$installprivlib
, 1, 0777);
mkpath(
$installarchlib
, 1, 0777);
mkpath(
$installsitelib
, 1, 0777)
if
(
$installsitelib
);
mkpath(
$installsitearch
, 1, 0777)
if
(
$installsitearch
);
if
(
chdir
"lib"
) {
$do_installarchlib
= ! samepath(
$installarchlib
,
'.'
);
$do_installprivlib
= ! samepath(
$installprivlib
,
'.'
);
$do_installprivlib
= 0
if
$versiononly
&& !(
$installprivlib
=~ m/\Q$]/);
if
(
$do_installarchlib
||
$do_installprivlib
) {
find(\
&installlib
,
'.'
);
}
chdir
".."
||
die
"Can't cd back to source directory: $!\n"
;
}
else
{
warn
"Can't cd to lib to install lib files: $!\n"
;
}
mkpath(
"$installarchlib/CORE"
, 1, 0777);
my
@corefiles
;
if
(
$Is_VMS
) {
my
$coredir
=
"lib/$Config{'arch'}/$]"
;
$coredir
=~
tr
/./_/;
@corefiles
= <
$coredir
/*.*>;
}
else
{
@corefiles
= <*.h libperl*.*>;
push
(
@corefiles
,
'perl.exp'
)
if
$^O eq
'aix'
;
push
(
@corefiles
,
'sperl.o'
)
if
-f
'sperl.o'
;
}
foreach
my
$file
(
@corefiles
) {
copy_if_diff(
$file
,
"$installarchlib/CORE/$file"
)
and
chmod
(
$file
=~ /\.(so|\Q
$dlext
\E)$/ ? 0555 : 0444,
"$installarchlib/CORE/$file"
);
}
if
(!
$versiononly
&& ! samepath(
$installbin
,
'.'
) && ($^O ne
'dos'
) && !
$Is_VMS
) {
safe_unlink(
"$installbin/$perl$exe_ext"
,
"$installbin/suid$perl$exe_ext"
);
if
($^O eq
'mpeix'
) {
symlink
(
$Config
{perlpath},
"$installbin/perl$exe_ext"
);
}
else
{
link
(
"$installbin/$perl$ver$exe_ext"
,
"$installbin/$perl$exe_ext"
);
}
link
(
"$installbin/s$perl$ver$exe_ext"
,
"$installbin/suid$perl$exe_ext"
)
if
$d_dosuid
;
}
my
$mainperl_is_instperl
= 0;
if
(!
$versiononly
&& !
$nonono
&& !
$Is_W32
&& !
$Is_VMS
&& -t STDIN && -t STDERR
&& -w
$mainperldir
&& ! samepath(
$mainperldir
,
$installbin
)) {
my
(
$usrbinperl
) =
"$mainperldir/$perl$exe_ext"
;
my
(
$instperl
) =
"$installbin/$perl$exe_ext"
;
my
(
$expinstperl
) =
"$binexp/$perl$exe_ext"
;
if
(-x
$usrbinperl
) {
$mainperl_is_instperl
=
samepath(
$usrbinperl
,
$instperl
) ||
samepath(
$usrbinperl
,
$expinstperl
) ||
((
$binexp
ne
$installbin
) &&
(-l
$usrbinperl
) &&
((
readlink
$usrbinperl
) eq
$expinstperl
));
}
if
((!
$mainperl_is_instperl
) &&
(yn(
"Many scripts expect perl to be installed as $usrbinperl.\n"
.
"Do you wish to have $usrbinperl be the same as\n"
.
"$expinstperl? [y] "
)))
{
unlink
(
$usrbinperl
);
(
$Config
{
'd_link'
} eq
'define'
&&
eval
{ CORE::
link
$instperl
,
$usrbinperl
} ) ||
eval
{
symlink
$expinstperl
,
$usrbinperl
} ||
copy(
$instperl
,
$usrbinperl
);
$mainperl_is_instperl
= 1;
}
}
if
(!
$versiononly
&& ! samepath(
$installbin
,
'x2p'
)) {
safe_unlink(
"$installbin/a2p$exe_ext"
);
copy(
"x2p/a2p$exe_ext"
,
"$installbin/a2p$exe_ext"
);
chmod
(0755,
"$installbin/a2p$exe_ext"
);
}
if
(!
$versiononly
&& (-f
'cppstdin'
) && (! samepath(
$installbin
,
'.'
))) {
safe_unlink(
"$installbin/cppstdin"
);
copy(
"cppstdin"
,
"$installbin/cppstdin"
);
chmod
(0755,
"$installbin/cppstdin"
);
}
mkpath(
$installscript
, 1, 0777);
if
(!
$versiononly
) {
for
(
@scripts
) {
(
my
$base
=
$_
) =~ s
copy(
$_
,
"$installscript/$base"
);
chmod
(0755,
"$installscript/$base"
);
}
}
if
(!
$versiononly
) {
safe_unlink(
"$installscript/pstruct$scr_ext"
);
if
($^O eq
'dos'
or
$Is_VMS
) {
copy(
"$installscript/c2ph$scr_ext"
,
"$installscript/pstruct$scr_ext"
);
}
else
{
link
(
"$installscript/c2ph$scr_ext"
,
"$installscript/pstruct$scr_ext"
);
}
}
if
(!
$versiononly
|| !(
$installprivlib
=~ m/\Q$]/)) {
mkpath(
"${installprivlib}/pod"
, 1, 0777);
if
(
open
POD,
"${installprivlib}/pod/perldiag.pod"
) {
read
POD,
$_
, 4000;
close
POD;
if
(/^=.*\.$/m) {
my
(
$from
,
$to
) = (
"${installprivlib}/pod/perldiag.pod"
,
"${installprivlib}/pod/perldiag-5.003.pod"
);
print
STDERR
" rename $from $to"
;
rename
(
$from
,
$to
)
or
warn
"Couldn't rename $from to $to: $!\n"
unless
$nonono
;
}
}
foreach
my
$file
(
@pods
) {
copy_if_diff(
$file
,
"${installprivlib}/${file}"
);
}
}
if
(!
$versiononly
) {
my
(
$path
,
@path
);
my
$dirsep
= (
$Is_OS2
||
$Is_W32
) ?
';'
:
':'
;
(
$path
=
$ENV
{
"PATH"
}) =~ s:\\:/:g ;
@path
=
split
(/
$dirsep
/,
$path
);
if
(
$Is_VMS
) {
my
$i
= 0;
while
(
exists
$ENV
{
'DCL$PATH'
.
$i
}) {
my
$dir
= unixpath(
$ENV
{
'DCL$PATH'
.
$i
});
$dir
=~ s-/$--;
push
(
@path
,
$dir
);
}
}
my
@otherperls
;
for
(
@path
) {
next
unless
m,^/,;
next
if
samepath(
$_
,
$binexp
);
next
if
(
$mainperl_is_instperl
&& samepath(
$_
,
$mainperldir
));
push
(
@otherperls
,
"$_/$perl$exe_ext"
)
if
(-x
"$_/$perl$exe_ext"
&& ! -d
"$_/$perl$exe_ext"
);
}
if
(
@otherperls
) {
print
STDERR
"\nWarning: $perl appears in your path in the following "
.
"locations beyond where\nwe just installed it:\n"
;
for
(
@otherperls
) {
print
STDERR
" "
,
$_
,
"\n"
;
}
print
STDERR
"\n"
;
}
}
$packlist
->
write
()
unless
$nonono
;
print
STDERR
" Installation complete\n"
;
exit
0;
sub
yn {
my
(
$prompt
) =
@_
;
my
(
$answer
);
my
(
$default
) =
$prompt
=~ m/\[([yn])\]\s*$/i;
print
STDERR
$prompt
;
chop
(
$answer
= <STDIN>);
$answer
=
$default
if
$answer
=~ m/^\s*$/;
(
$answer
=~ m/^[yY]/);
}
sub
unlink
{
my
(
@names
) =
@_
;
my
(
$cnt
) = 0;
return
scalar
(
@names
)
if
$Is_VMS
;
foreach
my
$name
(
@names
) {
next
unless
-e
$name
;
chmod
0777,
$name
if
(
$Is_OS2
||
$Is_W32
);
print
STDERR
" unlink $name\n"
;
( CORE::
unlink
(
$name
) and ++
$cnt
or
warn
"Couldn't unlink $name: $!\n"
)
unless
$nonono
;
}
return
$cnt
;
}
sub
safe_unlink {
return
if
$nonono
or
$Is_VMS
;
my
@names
=
@_
;
foreach
my
$name
(
@names
) {
next
unless
-e
$name
;
chmod
0777,
$name
if
(
$Is_OS2
||
$Is_W32
);
print
STDERR
" unlink $name\n"
;
next
if
CORE::
unlink
(
$name
);
warn
"Couldn't unlink $name: $!\n"
;
if
($! =~ /busy/i) {
print
STDERR
" mv $name $name.old\n"
;
safe_rename(
$name
,
"$name.old"
)
or
warn
"Couldn't rename $name: $!\n"
;
}
}
}
sub
safe_rename {
my
(
$from
,
$to
) =
@_
;
if
(-f
$to
and not
unlink
(
$to
)) {
my
(
$i
);
for
(
$i
= 1;
$i
< 50;
$i
++) {
last
if
rename
(
$to
,
"$to.$i"
);
}
warn
(
"Cannot rename to `$to.$i': $!"
),
return
0
if
$i
>= 50;
}
link
(
$from
,
$to
) ||
return
0;
unlink
(
$from
);
}
sub
link
{
my
(
$from
,
$to
) =
@_
;
my
(
$success
) = 0;
print
STDERR
" ln $from $to\n"
;
eval
{
CORE::
link
(
$from
,
$to
)
?
$success
++
: (
$from
=~ m
?
die
"AFS"
:
warn
"Couldn't link $from to $to: $!\n"
unless
$nonono
;
$packlist
->{
$to
} = {
from
=>
$from
,
type
=>
'link'
};
};
if
($@) {
print
STDERR
" creating new version of $to\n"
if
$Is_VMS
and -e
$to
;
File::Copy::copy(
$from
,
$to
)
?
$success
++
:
warn
"Couldn't copy $from to $to: $!\n"
unless
$nonono
;
$packlist
->{
$to
} = {
type
=>
'file'
};
}
$success
;
}
sub
chmod
{
my
(
$mode
,
$name
) =
@_
;
return
if
($^O eq
'dos'
);
printf
STDERR
" chmod %o %s\n"
,
$mode
,
$name
;
CORE::
chmod
(
$mode
,
$name
)
||
warn
sprintf
(
"Couldn't chmod %o %s: $!\n"
,
$mode
,
$name
)
unless
$nonono
;
}
sub
copy {
my
(
$from
,
$to
) =
@_
;
print
STDERR
" cp $from $to\n"
;
print
STDERR
" creating new version of $to\n"
if
$Is_VMS
and -e
$to
;
File::Copy::copy(
$from
,
$to
)
||
warn
"Couldn't copy $from to $to: $!\n"
unless
$nonono
;
$packlist
->{
$to
} = {
type
=>
'file'
};
}
sub
samepath {
my
(
$p1
,
$p2
) =
@_
;
return
(
lc
(
$p1
) eq
lc
(
$p2
))
if
$Is_W32
;
if
(
$p1
ne
$p2
) {
my
(
$dev1
,
$ino1
,
$dev2
,
$ino2
);
(
$dev1
,
$ino1
) =
stat
(
$p1
);
(
$dev2
,
$ino2
) =
stat
(
$p2
);
(
$dev1
==
$dev2
&&
$ino1
==
$ino2
);
}
else
{
1;
}
}
sub
installlib {
my
$dir
=
$File::Find::dir
;
$dir
=~ s
local
(
$depth
) =
$dir
?
"lib/$dir"
:
"lib"
;
my
$name
=
$_
;
if
(
$name
eq
'CVS'
&& -d
$name
) {
$File::Find::prune
= 1;
return
;
}
return
if
$name
=~ m{\.orig$|~$|^\.
exists
};
$name
=
"$dir/$name"
if
$dir
ne
''
;
my
$installlib
=
$installprivlib
;
if
(
$dir
=~ /^auto/ ||
(
$name
=~ /^(.*)\.(?:pm|pod)$/ &&
$archpms
{$1}) ||
(
$name
=~ /^(.*)\.(?:h|lib)$/i &&
$Is_W32
)
) {
$installlib
=
$installarchlib
;
return
unless
$do_installarchlib
;
}
else
{
return
unless
$do_installprivlib
;
}
if
(-f
$_
) {
if
(/\.(?:al|ix)$/ && !(
$dir
=~ m[^auto/(.*)$] &&
$archpms
{$1})) {
$installlib
=
$installprivlib
;
unlink
(
"$installarchlib/$name"
);
}
$packlist
->{
"$installlib/$name"
} = {
type
=>
'file'
};
if
(compare(
$_
,
"$installlib/$name"
) ||
$nonono
) {
unlink
(
"$installlib/$name"
);
mkpath(
"$installlib/$dir"
, 1, 0777);
copy_if_diff(
$_
,
"$installlib/$name"
)
and
chmod
(
$name
=~ /\.(so|
$dlext
)$/o ? 0555 : 0444,
"$installlib/$name"
);
}
}
}
sub
copy_if_diff {
my
(
$from
,
$to
)=
@_
;
return
1
if
(($^O eq
'VMS'
) && (-d
$from
));
-f
$from
||
die
"$0: $from not found"
;
$packlist
->{
$to
} = {
type
=>
'file'
};
if
(compare(
$from
,
$to
) ||
$nonono
) {
safe_unlink(
$to
);
if
(
$nonono
) {
$from
=
$depth
.
"/"
.
$from
if
$depth
;
}
copy(
$from
,
$to
);
if
(!
$nonono
&& (
$Is_OS2
||
$to
=~ /\.a$/)) {
my
(
$atime
,
$mtime
) = (
stat
$from
)[8,9];
utime
$atime
,
$mtime
,
$to
;
}
1;
}
}