require
5.006;
our
%Config_Override
;
$VERSION
=
'7.61_01'
;
$VERSION
=~
tr
/_//d;
our
@ISA
=
qw(ExtUtils::MM_Any)
;
my
%Is
;
BEGIN {
$Is
{OS2} = $^O eq
'os2'
;
$Is
{Win32} = $^O eq
'MSWin32'
||
$Config
{osname} eq
'NetWare'
;
$Is
{Dos} = $^O eq
'dos'
;
$Is
{VMS} = $^O eq
'VMS'
;
$Is
{OSF} = $^O eq
'dec_osf'
;
$Is
{IRIX} = $^O eq
'irix'
;
$Is
{NetBSD} = $^O eq
'netbsd'
;
$Is
{Interix} = $^O eq
'interix'
;
$Is
{SunOS4} = $^O eq
'sunos'
;
$Is
{Solaris} = $^O eq
'solaris'
;
$Is
{SunOS} =
$Is
{SunOS4} ||
$Is
{Solaris};
$Is
{BSD} = ($^O =~ /^(?:free|net|
open
)bsd$/ or
grep
( $^O eq
$_
,
qw(bsdos interix dragonfly)
)
);
$Is
{Android} = $^O =~ /android/;
if
( $^O eq
'darwin'
&& $^X eq
'/usr/bin/perl'
) {
my
@osvers
=
split
/\./,
$Config
{osvers};
$Is
{ApplCor} = (
$osvers
[0] >= 18 );
}
}
BEGIN {
if
(
$Is
{VMS} ) {
VMS::Filespec->
import
;
}
}
my
$Curdir
= __PACKAGE__->curdir;
my
$Updir
= __PACKAGE__->updir;
sub
os_flavor {
return
(
'Unix'
);
}
sub
c_o {
my
(
$self
) =
shift
;
return
''
unless
$self
->needs_linking();
my
(
@m
);
my
$command
=
'$(CCCMD)'
;
my
$flags
=
'$(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE)'
;
if
(
$Is
{ApplCor} ) {
$flags
=~ s/
"-I(\$\(PERL_INC\))"
/-iwithsysroot
"$1"
/;
}
if
(
my
$cpp
=
$Config
{cpprun}) {
my
$cpp_cmd
=
$self
->const_cccmd;
$cpp_cmd
=~ s/^CCCMD\s*=\s*\$\(CC\)/
$cpp
/;
push
@m
,
qq{
.c.i:
$cpp_cmd $flags \$*.c > \$*.i
}
;
}
my
$m_o
=
$self
->{XSMULTI} ?
$self
->xs_obj_opt(
'$*.s'
) :
''
;
push
@m
,
sprintf
<<'EOF', $command, $flags, $m_o;
.c.s :
%s -S %s $*.c %s
EOF
my
@exts
=
qw(c cpp cxx cc)
;
push
@exts
,
'C'
if
!
$Is
{OS2} and !
$Is
{Win32} and !
$Is
{Dos};
$m_o
=
$self
->{XSMULTI} ?
$self
->xs_obj_opt(
'$*$(OBJ_EXT)'
) :
''
;
my
$dbgout
=
$self
->dbgoutflag;
for
my
$ext
(
@exts
) {
push
@m
,
"\n.$ext\$(OBJ_EXT) :\n\t$command $flags "
.(
$dbgout
?
"$dbgout "
:
''
)
.
"\$*.$ext"
. (
$m_o
?
" $m_o"
:
''
) .
"\n"
;
}
return
join
""
,
@m
;
}
sub
xs_obj_opt {
my
(
$self
,
$output_file
) =
@_
;
"-o $output_file"
;
}
sub
dbgoutflag {
''
;
}
sub
cflags {
my
(
$self
,
$libperl
)=
@_
;
return
$self
->{CFLAGS}
if
$self
->{CFLAGS};
return
''
unless
$self
->needs_linking();
my
(
$prog
,
$uc
,
$perltype
,
%cflags
);
$libperl
||=
$self
->{LIBPERL_A} ||
"libperl$self->{LIB_EXT}"
;
$libperl
=~ s/\.\$\(A\)$/
$self
->{LIB_EXT}/;
@cflags
{
qw(cc ccflags optimize shellflags)
}
=
@Config
{
qw(cc ccflags optimize shellflags)
};
my
@ccextraflags
=
qw(ccwarnflags)
;
if
(
$ENV
{PERL_CORE}) {
for
my
$x
(
@ccextraflags
) {
if
(
exists
$Config
{
$x
}) {
$cflags
{
$x
} =
$Config
{
$x
};
}
}
}
my
(
$optdebug
) =
""
;
$cflags
{shellflags} ||=
''
;
my
(
%map
) = (
D
=>
'-DDEBUGGING'
,
E
=>
'-DEMBED'
,
DE
=>
'-DDEBUGGING -DEMBED'
,
M
=>
'-DEMBED -DMULTIPLICITY'
,
DM
=>
'-DDEBUGGING -DEMBED -DMULTIPLICITY'
,
);
if
(
$libperl
=~ /libperl(\w*)\Q
$self
->{LIB_EXT}/){
$uc
=
uc
($1);
}
else
{
$uc
=
""
;
}
$perltype
=
$map
{
$uc
} ?
$map
{
$uc
} :
""
;
if
(
$uc
=~ /^D/) {
$optdebug
=
"-g"
;
}
my
(
$name
);
(
$name
=
$self
->{NAME} .
"_cflags"
) =~ s/:/_/g ;
if
(
$prog
=
$Config
{
$name
}) {
print
"Processing $name hint:\n"
if
$Verbose
;
my
(
@o
)=`cc=\"
$cflags
{cc}\"
ccflags=\"
$cflags
{ccflags}\"
optimize=\"
$cflags
{optimize}\"
perltype=\"
$cflags
{perltype}\"
optdebug=\"
$cflags
{optdebug}\"
eval
'$prog'
echo cc=\
$cc
echo ccflags=\
$ccflags
echo optimize=\
$optimize
echo perltype=\
$perltype
echo optdebug=\
$optdebug
`;
foreach
my
$line
(
@o
){
chomp
$line
;
if
(
$line
=~ /(.*?)=\s*(.*)\s*$/){
$cflags
{$1} = $2;
print
" $1 = $2\n"
if
$Verbose
;
}
else
{
print
"Unrecognised result from hint: '$line'\n"
;
}
}
}
if
(
$optdebug
) {
$cflags
{optimize} =
$optdebug
;
}
for
(
qw(ccflags optimize perltype)
) {
$cflags
{
$_
} ||=
''
;
$cflags
{
$_
} =~ s/^\s+//;
$cflags
{
$_
} =~ s/\s+/ /g;
$cflags
{
$_
} =~ s/\s+$//;
$self
->{
uc
$_
} ||=
$cflags
{
$_
};
}
if
(
$self
->{POLLUTE}) {
$self
->{CCFLAGS} .=
' -DPERL_POLLUTE '
;
}
for
my
$x
(
@ccextraflags
) {
next
unless
exists
$cflags
{
$x
};
$self
->{CCFLAGS} .=
$cflags
{
$x
} =~ m!^\s! ?
$cflags
{
$x
} :
' '
.
$cflags
{
$x
};
}
my
$pollute
=
''
;
if
(
$Config
{usemymalloc} and not
$Config
{bincompat5005}
and not
$Config
{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
and
$self
->{PERL_MALLOC_OK}) {
$pollute
=
'$(PERL_MALLOC_DEF)'
;
}
return
$self
->{CFLAGS} =
qq{
CCFLAGS = $self->{CCFLAGS}
OPTIMIZE =
$self
->{OPTIMIZE}
PERLTYPE =
$self
->{PERLTYPE}
MPOLLUTE =
$pollute
};
}
sub
const_cccmd {
my
(
$self
,
$libperl
)=
@_
;
return
$self
->{CONST_CCCMD}
if
$self
->{CONST_CCCMD};
return
''
unless
$self
->needs_linking();
return
$self
->{CONST_CCCMD} =
q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
$(CCFLAGS) $(OPTIMIZE) \\
$(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
$(XS_DEFINE_VERSION)}
;
}
sub
const_config {
my
(
$self
) =
shift
;
my
@m
=
$self
->specify_shell();
push
@m
,
<<"END";
# These definitions are from config.sh (via $INC{'Config.pm'}).
# They may have been overridden via Makefile.PL or on the command line.
END
my
(
%once_only
);
foreach
my
$key
(@{
$self
->{CONFIG}}){
next
if
$once_only
{
$key
};
push
@m
,
uc
(
$key
) ,
' = '
,
$self
->{
uc
$key
},
"\n"
;
$once_only
{
$key
} = 1;
}
join
(
''
,
@m
);
}
sub
const_loadlibs {
my
(
$self
) =
shift
;
return
""
unless
$self
->needs_linking;
my
@m
;
push
@m
,
qq{
# $self->{NAME}
might depend on some other libraries:
};
for
my
$tmp
(
qw/
EXTRALIBS LDLOADLIBS BSLOADLIBS
/
) {
next
unless
defined
$self
->{
$tmp
};
push
@m
,
"$tmp = $self->{$tmp}\n"
;
}
for
my
$tmp
(
qw/
LD_RUN_PATH
/
) {
next
unless
$self
->{
$tmp
};
push
@m
,
"$tmp = $self->{$tmp}\n"
;
}
return
join
""
,
@m
;
}
sub
constants {
my
(
$self
) =
@_
;
my
@m
= ();
$self
->{DFSEP} =
'$(DIRFILESEP)'
;
for
my
$macro
(
qw(
AR_STATIC_ARGS DIRFILESEP DFSEP
NAME NAME_SYM
VERSION VERSION_MACRO VERSION_SYM DEFINE_VERSION
XS_VERSION XS_VERSION_MACRO XS_DEFINE_VERSION
INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB
INST_MAN1DIR INST_MAN3DIR
MAN1EXT MAN3EXT
MAN1SECTION MAN3SECTION
INSTALLDIRS INSTALL_BASE DESTDIR PREFIX
PERLPREFIX SITEPREFIX VENDORPREFIX
)
,
(
map
{ (
"INSTALL"
.
$_
,
"DESTINSTALL"
.
$_
)
}
$self
->installvars),
qw(
PERL_LIB
PERL_ARCHLIB PERL_ARCHLIBDEP
LIBPERL_A MYEXTLIB
FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE
PERLMAINCC PERL_SRC PERL_INC PERL_INCDEP
PERL FULLPERL ABSPERL
PERLRUN FULLPERLRUN ABSPERLRUN
PERLRUNINST FULLPERLRUNINST ABSPERLRUNINST
PERL_CORE
PERM_DIR PERM_RW PERM_RWX
)
)
{
next
unless
defined
$self
->{
$macro
};
$self
->{
$macro
} =~ s/
$self
->{
$macro
} =
$self
->quote_dep(
$self
->{
$macro
})
if
$ExtUtils::MakeMaker::macro_dep
{
$macro
};
push
@m
,
"$macro = $self->{$macro}\n"
;
}
push
@m
,
qq{
MAKEMAKER = $self->{MAKEMAKER}
MM_VERSION =
$self
->{MM_VERSION}
MM_REVISION =
$self
->{MM_REVISION}
};
push
@m
,
q{
# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
}
;
for
my
$macro
(
qw/
MAKE
FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
LDFROM LINKTYPE BOOTDEP
/
)
{
next
unless
defined
$self
->{
$macro
};
push
@m
,
"$macro = $self->{$macro}\n"
;
}
push
@m
, "
XS_FILES =
".$self->wraplist(sort keys %{$self->{XS}})."
C_FILES =
".$self->wraplist(sort @{$self->{C}})."
O_FILES =
".$self->wraplist(sort @{$self->{O_FILES}})."
H_FILES =
".$self->wraplist(sort @{$self->{H}})."
MAN1PODS =
".$self->wraplist(sort keys %{$self->{MAN1PODS}})."
MAN3PODS =
".$self->wraplist(sort keys %{$self->{MAN3PODS}})."
";
push
@m
,
q{
SDKROOT := $(shell xcrun --show-sdk-path)
PERL_SYSROOT = $(SDKROOT)
}
if
$Is
{ApplCor} &&
$self
->{
'PERL_INC'
} =~ m!^/System/Library/Perl/!;
push
@m
,
q{
# Where is the Config information that we are using/depend on
CONFIGDEP = $(PERL_ARCHLIBDEP)$(DFSEP)Config.pm $(PERL_SYSROOT)$(PERL_INCDEP)$(DFSEP)config.h
}
if
$Is
{ApplCor};
push
@m
,
q{
# Where is the Config information that we are using/depend on
CONFIGDEP = $(PERL_ARCHLIBDEP)$(DFSEP)Config.pm $(PERL_INCDEP)$(DFSEP)config.h
}
if
-e
$self
->catfile(
$self
->{PERL_INC},
'config.h'
) && !
$Is
{ApplCor};
push
@m
,
qq{
# Where to build things
INST_LIBDIR = $self->{INST_LIBDIR}
INST_ARCHLIBDIR =
$self
->{INST_ARCHLIBDIR}
INST_AUTODIR =
$self
->{INST_AUTODIR}
INST_ARCHAUTODIR =
$self
->{INST_ARCHAUTODIR}
INST_STATIC =
$self
->{INST_STATIC}
INST_DYNAMIC =
$self
->{INST_DYNAMIC}
INST_BOOT =
$self
->{INST_BOOT}
};
push
@m
,
qq{
# Extra linker info
EXPORT_LIST = $self->{EXPORT_LIST}
PERL_ARCHIVE =
$self
->{PERL_ARCHIVE}
PERL_ARCHIVEDEP =
$self
->{PERL_ARCHIVEDEP}
PERL_ARCHIVE_AFTER =
$self
->{PERL_ARCHIVE_AFTER}
};
push
@m
, "
TO_INST_PM =
".$self->wraplist(map $self->quote_dep($_), sort keys %{$self->{PM}})."
\n";
join
(
''
,
@m
);
}
sub
depend {
my
(
$self
,
%attribs
) =
@_
;
my
(
@m
,
$key
,
$val
);
for
my
$key
(
sort
keys
%attribs
){
my
$val
=
$attribs
{
$key
};
next
unless
defined
$key
and
defined
$val
;
push
@m
,
"$key : $val\n"
;
}
join
""
,
@m
;
}
sub
init_DEST {
my
$self
=
shift
;
$self
->{DESTDIR} ||=
''
;
foreach
my
$var
(
$self
->installvars) {
my
$destvar
=
'DESTINSTALL'
.
$var
;
$self
->{
$destvar
} ||=
'$(DESTDIR)$(INSTALL'
.
$var
.
')'
;
}
}
sub
init_dist {
my
$self
=
shift
;
$self
->{TAR} ||=
'tar'
;
$self
->{TARFLAGS} ||=
'cvf'
;
$self
->{ZIP} ||=
'zip'
;
$self
->{ZIPFLAGS} ||=
'-r'
;
$self
->{COMPRESS} ||=
'gzip --best'
;
$self
->{SUFFIX} ||=
'.gz'
;
$self
->{SHAR} ||=
'shar'
;
$self
->{PREOP} ||=
'$(NOECHO) $(NOOP)'
;
$self
->{POSTOP} ||=
'$(NOECHO) $(NOOP)'
;
$self
->{TO_UNIX} ||=
'$(NOECHO) $(NOOP)'
;
$self
->{CI} ||=
'ci -u'
;
$self
->{RCS_LABEL}||=
'rcs -Nv$(VERSION_SYM): -q'
;
$self
->{DIST_CP} ||=
'best'
;
$self
->{DIST_DEFAULT} ||=
'tardist'
;
(
$self
->{DISTNAME} =
$self
->{NAME}) =~ s{::}{-}g
unless
$self
->{DISTNAME};
$self
->{DISTVNAME} ||=
$self
->{DISTNAME}.
'-'
.
$self
->{VERSION};
}
sub
dist {
my
(
$self
,
%attribs
) =
@_
;
my
$make
=
''
;
if
(
$attribs
{SUFFIX} &&
$attribs
{SUFFIX} !~ m!^\.! ) {
$attribs
{SUFFIX} =
'.'
.
$attribs
{SUFFIX};
}
foreach
my
$key
(
qw(
TAR TARFLAGS ZIP ZIPFLAGS COMPRESS SUFFIX SHAR
PREOP POSTOP TO_UNIX
CI RCS_LABEL DIST_CP DIST_DEFAULT
DISTNAME DISTVNAME
)
)
{
my
$value
=
$attribs
{
$key
} ||
$self
->{
$key
};
$make
.=
"$key = $value\n"
;
}
return
$make
;
}
sub
dist_basics {
my
(
$self
) =
shift
;
return
<<'MAKE_FRAG';
distclean :: realclean distcheck
$(NOECHO) $(NOOP)
distcheck :
$(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
skipcheck :
$(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
manifest :
$(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
veryclean : realclean
$(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old
MAKE_FRAG
}
sub
dist_ci {
my
(
$self
) =
shift
;
return
sprintf
"ci :\n\t%s\n"
,
$self
->oneliner(
<<'EOF', [qw(-MExtUtils::Manifest=maniread)]);
@all = sort keys %{ maniread() };
print(qq{Executing $(CI) @all\n});
system(qq{$(CI) @all}) == 0 or die $!;
print(qq{Executing $(RCS_LABEL) ...\n});
system(qq{$(RCS_LABEL) @all}) == 0 or die $!;
EOF
}
sub
dist_core {
my
(
$self
) =
shift
;
my
$make_frag
=
''
;
foreach
my
$target
(
qw(dist tardist uutardist tarfile zipdist zipfile
shdist)
)
{
my
$method
=
$target
.
'_target'
;
$make_frag
.=
"\n"
;
$make_frag
.=
$self
->
$method
();
}
return
$make_frag
;
}
sub
dist_target {
my
(
$self
) =
shift
;
my
$date_check
=
$self
->oneliner(
<<'CODE', ['-l']);
print 'Warning: Makefile possibly out of date with $(VERSION_FROM)'
if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)';
CODE
return
sprintf
<<'MAKE_FRAG', $date_check;
dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
$(NOECHO) %s
MAKE_FRAG
}
sub
tardist_target {
my
(
$self
) =
shift
;
return
<<'MAKE_FRAG';
tardist : $(DISTVNAME).tar$(SUFFIX)
$(NOECHO) $(NOOP)
MAKE_FRAG
}
sub
zipdist_target {
my
(
$self
) =
shift
;
return
<<'MAKE_FRAG';
zipdist : $(DISTVNAME).zip
$(NOECHO) $(NOOP)
MAKE_FRAG
}
sub
tarfile_target {
my
(
$self
) =
shift
;
return
<<'MAKE_FRAG';
$(DISTVNAME).tar$(SUFFIX) : distdir
$(PREOP)
$(TO_UNIX)
$(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
$(RM_RF) $(DISTVNAME)
$(COMPRESS) $(DISTVNAME).tar
$(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)'
$(POSTOP)
MAKE_FRAG
}
sub
zipfile_target {
my
(
$self
) =
shift
;
return
<<'MAKE_FRAG';
$(DISTVNAME).zip : distdir
$(PREOP)
$(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
$(RM_RF) $(DISTVNAME)
$(NOECHO) $(ECHO) 'Created $(DISTVNAME).zip'
$(POSTOP)
MAKE_FRAG
}
sub
uutardist_target {
my
(
$self
) =
shift
;
return
<<'MAKE_FRAG';
uutardist : $(DISTVNAME).tar$(SUFFIX)
uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
$(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)_uu'
MAKE_FRAG
}
sub
shdist_target {
my
(
$self
) =
shift
;
return
<<'MAKE_FRAG';
shdist : distdir
$(PREOP)
$(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
$(RM_RF) $(DISTVNAME)
$(NOECHO) $(ECHO) 'Created $(DISTVNAME).shar'
$(POSTOP)
MAKE_FRAG
}
sub
dlsyms {
return
''
;
}
sub
dynamic_bs {
my
(
$self
,
%attribs
) =
@_
;
return
"\nBOOTSTRAP =\n"
unless
$self
->has_link_code();
my
@exts
;
if
(
$self
->{XSMULTI}) {
@exts
=
$self
->_xs_list_basenames;
}
else
{
@exts
=
'$(BASEEXT)'
;
}
return
join
"\n"
,
"BOOTSTRAP = @{[map { qq{$_.bs} } @exts]}\n"
,
map
{
$self
->_xs_make_bs(
$_
) }
@exts
;
}
sub
_xs_make_bs {
my
(
$self
,
$basename
) =
@_
;
my
(
$v
,
$d
,
$f
) = File::Spec->splitpath(
$basename
);
my
@d
= File::Spec->splitdir(
$d
);
shift
@d
if
$self
->{XSMULTI} and
$d
[0] eq
'lib'
;
my
$instdir
=
$self
->catdir(
'$(INST_ARCHLIB)'
,
'auto'
,
@d
,
$f
);
$instdir
=
'$(INST_ARCHAUTODIR)'
if
$basename
eq
'$(BASEEXT)'
;
my
$instfile
=
$self
->catfile(
$instdir
,
"$f.bs"
);
my
$exists
=
"$instdir\$(DFSEP).exists"
;
return
_sprintf562
<<'MAKE_FRAG', $basename, $instfile, $exists;
# As Mkbootstrap might not write a file (if none is required)
# we use touch to prevent make continually trying to remake it.
# The DynaLoader only reads a non-empty file.
%1$s.bs : $(FIRST_MAKEFILE) $(BOOTDEP)
$(NOECHO) $(ECHO) "Running Mkbootstrap for %1$s ($(BSLOADLIBS))"
$(NOECHO) $(PERLRUN) \
"-MExtUtils::Mkbootstrap" \
-e "Mkbootstrap('%1$s','$(BSLOADLIBS)');"
$(NOECHO) $(TOUCH) "%1$s.bs"
$(CHMOD) $(PERM_RW) "%1$s.bs"
%2$s : %1$s.bs %3$s
$(NOECHO) $(RM_RF) %2$s
- $(CP_NONEMPTY) %1$s.bs %2$s $(PERM_RW)
MAKE_FRAG
}
sub
dynamic_lib {
my
(
$self
,
%attribs
) =
@_
;
return
''
unless
$self
->needs_linking();
return
''
unless
$self
->has_link_code;
my
@m
=
$self
->xs_dynamic_lib_macros(\
%attribs
);
my
@libs
;
my
$dlsyms_ext
=
eval
{
$self
->xs_dlsyms_ext };
if
(
$self
->{XSMULTI}) {
my
@exts
=
$self
->_xs_list_basenames;
for
my
$ext
(
@exts
) {
my
(
$v
,
$d
,
$f
) = File::Spec->splitpath(
$ext
);
my
@d
= File::Spec->splitdir(
$d
);
shift
@d
if
$d
[0] eq
'lib'
;
pop
@d
if
$d
[
$#d
] eq
''
;
my
$instdir
=
$self
->catdir(
'$(INST_ARCHLIB)'
,
'auto'
,
@d
,
$f
);
if
(
defined
&DynaLoader::mod2fname
) {
$f
=
&DynaLoader::mod2fname
([
@d
,
$f
]);
}
my
$instfile
=
$self
->catfile(
$instdir
,
"$f.\$(DLEXT)"
);
my
$objfile
=
$self
->_xsbuild_value(
'xs'
,
$ext
,
'OBJECT'
);
$objfile
=
"$ext\$(OBJ_EXT)"
unless
defined
$objfile
;
my
$ldfrom
=
$self
->_xsbuild_value(
'xs'
,
$ext
,
'LDFROM'
);
$ldfrom
=
$objfile
unless
defined
$ldfrom
;
my
$exportlist
=
"$ext.def"
;
my
@libchunk
= (
$objfile
,
$instfile
,
$instdir
,
$ldfrom
,
$exportlist
);
push
@libchunk
,
$dlsyms_ext
?
$ext
.
$dlsyms_ext
:
undef
;
push
@libs
, \
@libchunk
;
}
}
else
{
my
@libchunk
=
qw($(OBJECT)
$(INST_DYNAMIC) $(INST_ARCHAUTODIR) $(LDFROM) $(EXPORT_LIST));
push
@libchunk
,
$dlsyms_ext
?
'$(BASEEXT)'
.
$dlsyms_ext
:
undef
;
@libs
= (\
@libchunk
);
}
push
@m
,
map
{
$self
->xs_make_dynamic_lib(\
%attribs
,
@$_
); }
@libs
;
return
join
(
"\n"
,
@m
);
}
sub
xs_dynamic_lib_macros {
my
(
$self
,
$attribs
) =
@_
;
my
$otherldflags
=
$attribs
->{OTHERLDFLAGS} ||
""
;
my
$inst_dynamic_dep
=
$attribs
->{INST_DYNAMIC_DEP} ||
""
;
my
$armaybe
=
$self
->_xs_armaybe(
$attribs
);
my
$ld_opt
=
$Is
{OS2} ?
'$(OPTIMIZE) '
:
''
;
my
$ld_fix
=
$Is
{OS2} ?
'|| ( $(RM_F) $@ && sh -c false )'
:
''
;
sprintf
<<'EOF', $armaybe, $ld_opt.$otherldflags, $inst_dynamic_dep, $ld_fix;
# This section creates the dynamically loadable objects from relevant
# objects and possibly $(MYEXTLIB).
ARMAYBE = %s
OTHERLDFLAGS = %s
INST_DYNAMIC_DEP = %s
INST_DYNAMIC_FIX = %s
EOF
}
sub
_xs_armaybe {
my
(
$self
,
$attribs
) =
@_
;
my
$armaybe
=
$attribs
->{ARMAYBE} ||
$self
->{ARMAYBE} ||
":"
;
$armaybe
=
'ar'
if
(
$Is
{OSF} and
$armaybe
eq
':'
);
$armaybe
;
}
sub
xs_make_dynamic_lib {
my
(
$self
,
$attribs
,
$object
,
$to
,
$todir
,
$ldfrom
,
$exportlist
,
$dlsyms
) =
@_
;
$exportlist
=
''
if
$exportlist
ne
'$(EXPORT_LIST)'
;
my
$armaybe
=
$self
->_xs_armaybe(
$attribs
);
my
@m
=
sprintf
'%s : %s $(MYEXTLIB) %s$(DFSEP).exists %s $(PERL_ARCHIVEDEP) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP) %s'
.
"\n"
,
$to
,
$object
,
$todir
,
$exportlist
, (
$dlsyms
||
''
);
my
$dlsyms_arg
=
$self
->xs_dlsyms_arg(
$dlsyms
);
if
(
$armaybe
ne
':'
){
$ldfrom
=
'tmp$(LIB_EXT)'
;
push
(
@m
,
" \$(ARMAYBE) cr $ldfrom $object\n"
);
push
(
@m
,
" \$(RANLIB) $ldfrom\n"
);
}
$ldfrom
=
"-all $ldfrom -none"
if
$Is
{OSF};
my
$ldrun
=
$Is
{IRIX} &&
$self
->{LD_RUN_PATH} ?
qq{-rpath "$self->{LD_RUN_PATH}
"} :
''
;
push
(
@m
,
" \$(RM_F) \$\@\n"
);
my
$libs
=
'$(LDLOADLIBS)'
;
if
((
$Is
{NetBSD} ||
$Is
{Interix} ||
$Is
{Android}) &&
$Config
{
'useshrplib'
} eq
'true'
) {
if
(
$Config
{
'lddlflags'
} =~ /-Wl,-R/) {
$libs
.=
' "-L$(PERL_INC)" "-Wl,-R$(INSTALLARCHLIB)/CORE" "-Wl,-R$(PERL_ARCHLIB)/CORE" -lperl'
;
}
elsif
(
$Config
{
'lddlflags'
} =~ /-R/) {
$libs
.=
' "-L$(PERL_INC)" "-R$(INSTALLARCHLIB)/CORE" "-R$(PERL_ARCHLIB)/CORE" -lperl'
;
}
elsif
(
$Is
{Android} ) {
$libs
.=
' "-L$(PERL_INC)" -lperl'
;
}
}
my
$ld_run_path_shell
=
""
;
if
(
$self
->{LD_RUN_PATH} ne
""
) {
$ld_run_path_shell
=
'LD_RUN_PATH="$(LD_RUN_PATH)" '
;
}
push
@m
,
sprintf
<<'MAKE', $ld_run_path_shell, $ldrun, $dlsyms_arg, $ldfrom, $self->xs_obj_opt('$@'), $libs, $exportlist;
%s$(LD) %s $(LDDLFLAGS) %s %s $(OTHERLDFLAGS) %s $(MYEXTLIB) \
$(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) %s \
$(INST_DYNAMIC_FIX)
$(CHMOD) $(PERM_RWX) $@
MAKE
join
''
,
@m
;
}
sub
exescan {
my
(
$self
,
$path
) =
@_
;
$path
;
}
sub
extliblist {
my
(
$self
,
$libs
) =
@_
;
$self
->ext(
$libs
,
$Verbose
);
}
sub
find_perl {
my
(
$self
,
$ver
,
$names
,
$dirs
,
$trace
) =
@_
;
if
(
$trace
>= 2){
print
"Looking
for
perl
$ver
by these names:
@$names
in these dirs:
@$dirs
";
}
my
$stderr_duped
= 0;
local
*STDERR_COPY
;
unless
(
$Is
{BSD}) {
if
(
open
(STDERR_COPY,
'>&STDERR'
) ) {
$stderr_duped
= 1;
}
else
{
warn
<<WARNING;
find_perl() can't dup STDERR: $!
You might see some garbage while we search for Perl
WARNING
}
}
foreach
my
$name
(
@$names
){
my
(
$abs
,
$use_dir
);
if
(
$self
->file_name_is_absolute(
$name
)) {
$abs
=
$name
;
}
elsif
(
$self
->canonpath(
$name
) eq
$self
->canonpath(basename(
$name
))) {
$use_dir
= 1;
}
else
{
$abs
=
$self
->catfile(
$Curdir
,
$name
);
}
foreach
my
$dir
(
$use_dir
?
@$dirs
: 1){
next
unless
defined
$dir
;
$abs
=
$self
->catfile(
$dir
,
$name
)
if
$use_dir
;
print
"Checking $abs\n"
if
(
$trace
>= 2);
next
unless
$self
->maybe_command(
$abs
);
print
"Executing $abs\n"
if
(
$trace
>= 2);
my
$val
;
my
$version_check
=
qq{"$abs" -le "require $ver; print qq{VER_OK}
"};
if
(
$Is
{BSD}) {
$val
= `
$version_check
2>&1`;
}
else
{
close
STDERR
if
$stderr_duped
;
$val
= `
$version_check
`;
open
STDERR,
">&STDERR_COPY"
if
$stderr_duped
;
}
if
(
$val
=~ /^VER_OK/m) {
print
"Using PERL=$abs\n"
if
$trace
;
return
$abs
;
}
elsif
(
$trace
>= 2) {
print
"Result: '$val' "
.($? >> 8).
"\n"
;
}
}
}
print
"Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n"
;
0;
}
sub
fixin {
my
(
$self
,
@files
) =
@_
;
for
my
$file
(
@files
) {
my
$file_new
=
"$file.new"
;
my
$file_bak
=
"$file.bak"
;
open
(
my
$fixin
,
'<'
,
$file
) or croak
"Can't process '$file': $!"
;
local
$/ =
"\n"
;
chomp
(
my
$line
= <
$fixin
> );
next
unless
$line
=~ s/^\s*\
my
$shb
=
$self
->_fixin_replace_shebang(
$file
,
$line
);
next
unless
defined
$shb
;
open
(
my
$fixout
,
">"
,
"$file_new"
) or
do
{
warn
"Can't create new $file: $!\n"
;
next
;
};
local
$\;
local
$/;
print
$fixout
$shb
, <
$fixin
>;
close
$fixin
;
close
$fixout
;
chmod
0666,
$file_bak
;
unlink
$file_bak
;
unless
( _rename(
$file
,
$file_bak
) ) {
warn
"Can't rename $file to $file_bak: $!"
;
next
;
}
unless
( _rename(
$file_new
,
$file
) ) {
warn
"Can't rename $file_new to $file: $!"
;
unless
( _rename(
$file_bak
,
$file
) ) {
warn
"Can't rename $file_bak back to $file either: $!"
;
warn
"Leaving $file renamed as $file_bak\n"
;
}
next
;
}
unlink
$file_bak
;
}
continue
{
system
(
"$Config{'eunicefix'} $file"
)
if
$Config
{
'eunicefix'
} ne
':'
;
}
}
sub
_rename {
my
(
$old
,
$new
) =
@_
;
foreach
my
$file
(
$old
,
$new
) {
if
(
$Is
{VMS} and basename(
$file
) !~ /\./ ) {
$file
=
"$file."
;
}
}
return
rename
(
$old
,
$new
);
}
sub
_fixin_replace_shebang {
my
(
$self
,
$file
,
$line
) =
@_
;
my
(
$origcmd
,
$arg
) =
split
' '
,
$line
, 2;
(
my
$cmd
=
$origcmd
) =~ s!^.*/!!;
my
$interpreter
;
if
(
defined
$ENV
{PERL_MM_SHEBANG} &&
$ENV
{PERL_MM_SHEBANG} eq
"relocatable"
) {
$interpreter
=
"/usr/bin/env perl"
;
}
elsif
(
$cmd
=~ m{^perl(?:\z|[^a-z])} ) {
if
(
$Config
{startperl} =~ m,^\
$interpreter
=
$Config
{startperl};
$interpreter
=~ s,^\
}
else
{
$interpreter
=
$Config
{perlpath};
}
}
else
{
my
(
@absdirs
)
=
reverse
grep
{
$self
->file_name_is_absolute(
$_
) }
$self
->path;
$interpreter
=
''
;
foreach
my
$dir
(
@absdirs
) {
my
$maybefile
=
$self
->catfile(
$dir
,
$cmd
);
if
(
$self
->maybe_command(
$maybefile
) ) {
warn
"Ignoring $interpreter in $file\n"
if
$Verbose
&&
$interpreter
;
$interpreter
=
$maybefile
;
}
}
if
(
$origcmd
ne
$interpreter
and
$self
->file_name_is_absolute(
$origcmd
)) {
my
$origdir
= dirname(
$origcmd
);
if
(
$self
->maybe_command(
$origcmd
) &&
grep
{
$_
eq
$origdir
}
@absdirs
) {
my
(
$odev
,
$oino
) =
stat
$origcmd
;
my
(
$idev
,
$iino
) =
stat
$interpreter
;
if
(
$odev
==
$idev
&&
$oino
==
$iino
) {
warn
"$origcmd is the same as $interpreter, leaving alone"
if
$Verbose
;
$interpreter
=
$origcmd
;
}
}
}
}
my
(
$does_shbang
) =
$Config
{
'sharpbang'
} =~ /^\s*\
my
(
$shb
) =
""
;
if
(
$interpreter
) {
print
"Changing sharpbang in $file to $interpreter"
if
$Verbose
;
if
(
$does_shbang
) {
$shb
.=
"$Config{'sharpbang'}$interpreter"
;
$shb
.=
' '
.
$arg
if
defined
$arg
;
$shb
.=
"\n"
;
}
}
else
{
warn
"Can't find $cmd in PATH, $file unchanged"
if
$Verbose
;
return
;
}
return
$shb
}
sub
force {
my
(
$self
) =
shift
;
'
FORCE :
$(NOECHO) $(NOOP)
';
}
sub
guess_name {
my
(
$self
) =
@_
;
my
$name
= basename(cwd());
$name
=~ s|[\-_][\d\.\-]+\z||;
print
"Warning: Guessing NAME [$name] from current directory name.\n"
;
$name
;
}
sub
has_link_code {
my
(
$self
) =
shift
;
return
$self
->{HAS_LINK_CODE}
if
defined
$self
->{HAS_LINK_CODE};
if
(
$self
->{OBJECT} or @{
$self
->{C} || []} or
$self
->{MYEXTLIB}){
$self
->{HAS_LINK_CODE} = 1;
return
1;
}
return
$self
->{HAS_LINK_CODE} = 0;
}
sub
init_dirscan {
my
(
$self
) =
@_
;
my
(
%dir
,
%xs
,
%c
,
%o
,
%h
,
%pl_files
,
%pm
);
my
%ignore
=
map
{(
$_
=> 1 )}
qw(Makefile.PL Build.PL test.pl t)
;
$Is
{VMS} ?
$ignore
{
"$self->{DISTVNAME}.dir"
} = 1
:
$ignore
{
$self
->{DISTVNAME}} = 1;
my
$distprefix
=
$Is
{VMS} ?
qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+\.dir$/
i
:
qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+$/
;
@ignore
{
map
lc
,
keys
%ignore
} =
values
%ignore
if
$Is
{VMS};
if
(
defined
$self
->{XS} and !
defined
$self
->{C} ) {
my
@c_files
=
grep
{ m/\.c(pp|xx)?\z/i }
values
%{
$self
->{XS}};
my
@o_files
=
grep
{ m/(?:.(?:o(?:bj)?)|\$\(OBJ_EXT\))\z/i }
values
%{
$self
->{XS}};
%c
=
map
{
$_
=> 1 }
@c_files
;
%o
=
map
{
$_
=> 1 }
@o_files
;
}
foreach
my
$name
(
$self
->lsdir(
$Curdir
)){
next
if
$name
=~ /\
next
if
$name
=~
$distprefix
&& -d
$name
;
$name
=
lc
(
$name
)
if
$Is
{VMS};
next
if
$name
eq
$Curdir
or
$name
eq
$Updir
or
$ignore
{
$name
};
next
unless
$self
->libscan(
$name
);
if
(-d
$name
){
next
if
-l
$name
;
next
if
$self
->{NORECURS};
$dir
{
$name
} =
$name
if
(-f
$self
->catfile(
$name
,
"Makefile.PL"
));
}
elsif
(
$name
=~ /\.xs\z/){
my
(
$c
); (
$c
=
$name
) =~ s/\.xs\z/.c/;
$xs
{
$name
} =
$c
;
$c
{
$c
} = 1;
}
elsif
(
$name
=~ /\.c(pp|xx|c)?\z/i){
$c
{
$name
} = 1
unless
$name
=~ m/perlmain\.c/;
}
elsif
(
$name
=~ /\.h\z/i){
$h
{
$name
} = 1;
}
elsif
(
$name
=~ /\.PL\z/) {
(
$pl_files
{
$name
} =
$name
) =~ s/\.PL\z// ;
}
elsif
((
$Is
{VMS} ||
$Is
{Dos}) &&
$name
=~ /[._]pl$/i) {
local
($/);
open
(
my
$pl
,
'<'
,
$name
);
my
$txt
= <
$pl
>;
close
$pl
;
if
(
$txt
=~ /Extracting \S+ \(
with
variable substitutions/) {
(
$pl_files
{
$name
} =
$name
) =~ s/[._]pl\z//i ;
}
else
{
$pm
{
$name
} =
$self
->catfile(
$self
->{INST_LIBDIR},
$name
);
}
}
elsif
(
$name
=~ /\.(p[ml]|pod)\z/){
$pm
{
$name
} =
$self
->catfile(
$self
->{INST_LIBDIR},
$name
);
}
}
$self
->{PL_FILES} ||= \
%pl_files
;
$self
->{DIR} ||= [
sort
keys
%dir
];
$self
->{XS} ||= \
%xs
;
$self
->{C} ||= [
sort
keys
%c
];
$self
->{H} ||= [
sort
keys
%h
];
$self
->{PM} ||= \
%pm
;
my
@o_files
= @{
$self
->{C}};
%o
= (
%o
,
map
{
$_
=> 1 }
grep
s/\.c(pp|xx|c)?\z/
$self
->{OBJ_EXT}/i,
@o_files
);
$self
->{O_FILES} = [
sort
keys
%o
];
}
sub
init_MANPODS {
my
$self
=
shift
;
foreach
my
$man
(
qw(MAN1 MAN3)
) {
if
(
$self
->{
"${man}PODS"
}
or
$self
->{
"INSTALL${man}DIR"
} =~ /^(none|\s*)$/
) {
$self
->{
"${man}PODS"
} ||= {};
}
else
{
my
$init_method
=
"init_${man}PODS"
;
$self
->
$init_method
();
}
}
foreach
my
$num
(1,3) {
my
$installdirs
=
uc
$self
->{INSTALLDIRS};
$installdirs
=
''
if
$installdirs
eq
'PERL'
;
my
@mandirs
= File::Spec->splitdir(
$self
->_expand_macros(
$self
->{
"INSTALL${installdirs}MAN${num}DIR"
} ) );
my
$mandir
=
pop
@mandirs
;
my
$section
=
$num
;
foreach
(
$num
,
"${num}p"
,
"${num}pm"
,
qw< l n o C L >
,
"L$num"
) {
if
(
$mandir
=~ /^(?:man|cat)
$_
$/ ) {
$section
=
$_
;
last
;
}
}
$self
->{
"MAN${num}SECTION"
} =
$section
;
}
}
sub
_has_pod {
my
(
$self
,
$file
) =
@_
;
my
(
$ispod
)=0;
if
(
open
(
my
$fh
,
'<'
,
$file
)) {
while
(<
$fh
>) {
if
(/^=(?:head\d+|item|pod)\b/) {
$ispod
=1;
last
;
}
}
close
$fh
;
}
else
{
$ispod
= 1;
}
return
$ispod
;
}
sub
init_MAN1PODS {
my
(
$self
) =
@_
;
if
(
exists
$self
->{EXE_FILES} ) {
foreach
my
$name
(@{
$self
->{EXE_FILES}}) {
next
unless
$self
->_has_pod(
$name
);
$self
->{MAN1PODS}->{
$name
} =
$self
->catfile(
"\$(INST_MAN1DIR)"
,
basename(
$name
).
".\$(MAN1EXT)"
);
}
}
}
sub
init_MAN3PODS {
my
$self
=
shift
;
my
%manifypods
= ();
foreach
my
$name
(
keys
%{
$self
->{PM}}) {
if
(
$name
=~ /\.pod\z/ ) {
$manifypods
{
$name
} =
$self
->{PM}{
$name
};
}
elsif
(
$name
=~ /\.p[ml]\z/ ) {
if
(
$self
->_has_pod(
$name
) ) {
$manifypods
{
$name
} =
$self
->{PM}{
$name
};
}
}
}
my
$parentlibs_re
=
join
'|'
, @{
$self
->{PMLIBPARENTDIRS}};
foreach
my
$name
(
keys
%manifypods
) {
if
(
(
$self
->{PERL_CORE} and
$name
=~ /(config|setup).*\.pm/is) or
(
$name
=~ m/^README\.pod$/i )
) {
delete
$manifypods
{
$name
};
next
;
}
my
(
$manpagename
) =
$name
;
$manpagename
=~ s/\.p(od|m|l)\z//;
unless
(
$manpagename
=~ s!^\W*(
$parentlibs_re
)\W+!!s) {
$manpagename
=
$self
->catfile(
split
(/::/,
$self
->{PARENT_NAME}),
$manpagename
);
}
$manpagename
=
$self
->replace_manpage_separator(
$manpagename
);
$self
->{MAN3PODS}->{
$name
} =
$self
->catfile(
"\$(INST_MAN3DIR)"
,
"$manpagename.\$(MAN3EXT)"
);
}
}
sub
init_PM {
my
$self
=
shift
;
unless
(
$self
->{PMLIBDIRS} ) {
if
(
$Is
{VMS} ) {
$self
->{PMLIBDIRS} = [
'./lib'
,
"./$self->{BASEEXT}"
];
}
else
{
$self
->{PMLIBDIRS} = [
'lib'
,
$self
->{BASEEXT}];
}
}
my
(
@pmlibdirs
) = @{
$self
->{PMLIBDIRS}};
@{
$self
->{PMLIBDIRS}} = ();
my
%dir
=
map
{ (
$_
=>
$_
) } @{
$self
->{DIR}};
foreach
my
$pmlibdir
(
@pmlibdirs
) {
-d
$pmlibdir
&& !
$dir
{
$pmlibdir
} &&
push
@{
$self
->{PMLIBDIRS}},
$pmlibdir
;
}
unless
(
$self
->{PMLIBPARENTDIRS} ) {
@{
$self
->{PMLIBPARENTDIRS}} = (
'lib'
);
}
return
if
$self
->{PM} and
$self
->{ARGS}{PM};
if
(@{
$self
->{PMLIBDIRS}}){
print
"Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
if
(
$Verbose
>= 2);
File::Find::find(
sub
{
if
(-d
$_
){
unless
(
$self
->libscan(
$_
)){
$File::Find::prune
= 1;
}
return
;
}
return
if
/\
return
if
/~$/;
return
if
/,v$/;
return
if
m{\.swp$};
my
$path
=
$File::Find::name
;
my
$prefix
=
$self
->{INST_LIBDIR};
my
$striplibpath
;
my
$parentlibs_re
=
join
'|'
, @{
$self
->{PMLIBPARENTDIRS}};
$prefix
=
$self
->{INST_LIB}
if
(
$striplibpath
=
$path
) =~ s{^(\W*)(
$parentlibs_re
)\W}
{$1}i;
my
(
$inst
) =
$self
->catfile(
$prefix
,
$striplibpath
);
local
(
$_
) =
$inst
;
$inst
=
$self
->libscan(
$inst
);
print
"libscan($path) => '$inst'\n"
if
(
$Verbose
>= 2);
return
unless
$inst
;
if
(
$self
->{XSMULTI} and
$inst
=~ /\.xs\z/) {
my
(
$base
); (
$base
=
$path
) =~ s/\.xs\z//;
$self
->{XS}{
$path
} =
"$base.c"
;
push
@{
$self
->{C}},
"$base.c"
;
push
@{
$self
->{O_FILES}},
"$base$self->{OBJ_EXT}"
;
}
else
{
$self
->{PM}{
$path
} =
$inst
;
}
}, @{
$self
->{PMLIBDIRS}});
}
}
sub
init_DIRFILESEP {
my
(
$self
) =
shift
;
$self
->{DIRFILESEP} =
'/'
;
}
sub
init_main {
my
(
$self
) =
@_
;
$self
->{FULLEXT} =
$self
->catdir(
split
/::/,
$self
->{NAME});
my
(
@modparts
) =
split
(/::/,
$self
->{NAME});
my
(
$modfname
) =
$modparts
[-1];
if
(
defined
&DynaLoader::mod2fname
) {
$modfname
=
&DynaLoader::mod2fname
(\
@modparts
);
}
(
$self
->{PARENT_NAME},
$self
->{BASEEXT}) =
$self
->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
$self
->{PARENT_NAME} ||=
''
;
if
(
defined
&DynaLoader::mod2fname
) {
$self
->{DLBASE} =
$modfname
;
}
else
{
$self
->{DLBASE} =
'$(BASEEXT)'
;
}
my
$inc_config_dir
= dirname(
$INC
{
'Config.pm'
});
my
$inc_carp_dir
= dirname(
$INC
{
'Carp.pm'
});
unless
(
$self
->{PERL_SRC}){
foreach
my
$dir_count
(1..8) {
my
$dir
=
$self
->catdir((
$Updir
) x
$dir_count
);
if
(-f
$self
->catfile(
$dir
,
"config_h.SH"
) &&
-f
$self
->catfile(
$dir
,
"perl.h"
) &&
-f
$self
->catfile(
$dir
,
"lib"
,
"strict.pm"
)
) {
$self
->{PERL_SRC}=
$dir
;
last
;
}
}
}
warn
"PERL_CORE is set but I can't find your PERL_SRC!\n"
if
$self
->{PERL_CORE} and !
$self
->{PERL_SRC};
if
(
$self
->{PERL_SRC}){
$self
->{PERL_LIB} ||=
$self
->catdir(
"$self->{PERL_SRC}"
,
"lib"
);
$self
->{PERL_ARCHLIB} =
$self
->{PERL_LIB};
$self
->{PERL_INC} = (
$Is
{Win32}) ?
$self
->catdir(
$self
->{PERL_LIB},
"CORE"
) :
$self
->{PERL_SRC};
unless
(
-s
$self
->catfile(
$self
->{PERL_SRC},
'cflags'
)
or
$Is
{VMS}
&&
-s
$self
->catfile(
$self
->{PERL_SRC},
'vmsish.h'
)
or
$Is
{Win32}
){
warn
qq{
You cannot build extensions below the perl source tree after executing
a 'make clean' in the perl source tree.
To rebuild extensions distributed with the perl source you should
simply Configure (to include those extensions) and then build perl as
normal. After installing perl the source tree can be deleted. It is
not needed for building extensions by running 'perl Makefile.PL'
usually without extra arguments.
It is recommended that you unpack and build additional extensions away
from the perl source tree.
}
;
}
}
else
{
my
$old
=
$self
->{PERL_LIB} ||
$self
->{PERL_ARCHLIB} ||
$self
->{PERL_INC};
$self
->{PERL_LIB} ||=
$Config
{privlibexp};
$self
->{PERL_ARCHLIB} ||=
$Config
{archlibexp};
$self
->{PERL_INC} =
$self
->catdir(
"$self->{PERL_ARCHLIB}"
,
"CORE"
);
my
$perl_h
;
if
(not -f (
$perl_h
=
$self
->catfile(
$self
->{PERL_INC},
"perl.h"
))
and not
$old
){
my
$lib
;
for
my
$dir
(
@INC
) {
$lib
=
$dir
,
last
if
-e
$self
->catfile(
$dir
,
"Config.pm"
);
}
if
(
$lib
) {
my
$inc
=
$Is
{Win32} ?
$self
->catdir(
$lib
,
"CORE"
)
: dirname
$lib
;
if
(-e
$self
->catfile(
$inc
,
"perl.h"
)) {
$self
->{PERL_LIB} =
$lib
;
$self
->{PERL_ARCHLIB} =
$lib
;
$self
->{PERL_INC} =
$inc
;
$self
->{UNINSTALLED_PERL} = 1;
print
<<EOP;
... Detected uninstalled Perl. Trying to continue.
EOP
}
}
}
}
if
(
$Is
{Android}) {
$self
->{PERL_LIB} = File::Spec->rel2abs(
$self
->{PERL_LIB});
$self
->{PERL_ARCHLIB} = File::Spec->rel2abs(
$self
->{PERL_ARCHLIB});
}
$self
->{PERL_INCDEP} =
$self
->{PERL_INC};
$self
->{PERL_ARCHLIBDEP} =
$self
->{PERL_ARCHLIB};
$self
->{INSTALLDIRS} ||=
"site"
;
$self
->{MAN1EXT} ||=
$Config
{man1ext};
$self
->{MAN3EXT} ||=
$Config
{man3ext};
print
"CONFIG must be an array ref\n"
if
(
$self
->{CONFIG} and
ref
$self
->{CONFIG} ne
'ARRAY'
);
$self
->{CONFIG} = []
unless
(
ref
$self
->{CONFIG});
push
(@{
$self
->{CONFIG}},
@ExtUtils::MakeMaker::Get_from_Config
);
push
(@{
$self
->{CONFIG}},
'shellflags'
)
if
$Config
{shellflags};
my
(
%once_only
);
foreach
my
$m
(@{
$self
->{CONFIG}}){
next
if
$once_only
{
$m
};
print
"CONFIG key '$m' does not exist in Config.pm\n"
unless
exists
$Config
{
$m
};
$self
->{
uc
$m
} ||=
$Config
{
$m
};
$once_only
{
$m
} = 1;
}
$self
->{AR_STATIC_ARGS} ||=
"cr"
;
$self
->{OBJ_EXT} ||=
'.o'
;
$self
->{LIB_EXT} ||=
'.a'
;
$self
->{MAP_TARGET} ||=
"perl"
;
$self
->{LIBPERL_A} ||=
"libperl$self->{LIB_EXT}"
;
warn
"Warning: PERL_LIB (
$self
->{PERL_LIB}) seems not to be a perl library directory
(strict.pm not found)"
unless
-f
$self
->catfile(
"$self->{PERL_LIB}"
,
"strict.pm"
) ||
$self
->{NAME} eq
"ExtUtils::MakeMaker"
;
}
sub
init_tools {
my
$self
=
shift
;
$self
->{ECHO} ||=
'echo'
;
$self
->{ECHO_N} ||=
'echo -n'
;
$self
->{RM_F} ||=
"rm -f"
;
$self
->{RM_RF} ||=
"rm -rf"
;
$self
->{TOUCH} ||=
"touch"
;
$self
->{TEST_F} ||=
"test -f"
;
$self
->{TEST_S} ||=
"test -s"
;
$self
->{CP} ||=
"cp"
;
$self
->{MV} ||=
"mv"
;
$self
->{CHMOD} ||=
"chmod"
;
$self
->{FALSE} ||=
'false'
;
$self
->{TRUE} ||=
'true'
;
$self
->{LD} ||=
'ld'
;
return
$self
->SUPER::init_tools(
@_
);
$self
->{SHELL} ||=
'/bin/sh'
;
return
;
}
sub
init_linker {
my
(
$self
) =
shift
;
$self
->{PERL_ARCHIVE} ||=
''
;
$self
->{PERL_ARCHIVEDEP} ||=
''
;
$self
->{PERL_ARCHIVE_AFTER} ||=
''
;
$self
->{EXPORT_LIST} ||=
''
;
}
sub
init_lib2arch {
my
(
$self
) =
shift
;
for
my
$libpair
({
l
=>
"privlib"
,
a
=>
"archlib"
},
{
l
=>
"sitelib"
,
a
=>
"sitearch"
},
{
l
=>
"vendorlib"
,
a
=>
"vendorarch"
},
)
{
my
$lib
=
"install$libpair->{l}"
;
my
$Lib
=
uc
$lib
;
my
$Arch
=
uc
"install$libpair->{a}"
;
if
(
$self
->{
$Lib
} && !
$self
->{
$Arch
} ){
my
(
$ilib
) =
$Config
{
$lib
};
$self
->prefixify(
$Arch
,
$ilib
,
$self
->{
$Lib
});
unless
(-d
$self
->{
$Arch
}) {
print
"Directory $self->{$Arch} not found\n"
if
$Verbose
;
$self
->{
$Arch
} =
$self
->{
$Lib
};
}
print
"Defaulting $Arch to $self->{$Arch}\n"
if
$Verbose
;
}
}
}
sub
init_PERL {
my
(
$self
) =
shift
;
my
@defpath
= ();
foreach
my
$component
(
$self
->{PERL_SRC},
$self
->path(),
$Config
{binexp})
{
push
@defpath
,
$component
if
defined
$component
;
}
my
$thisperl
=
$self
->canonpath($^X);
$thisperl
.=
$Config
{exe_ext}
unless
$Is
{VMS} ?
$thisperl
=~ m/
$Config
{exe_ext}(;\d+)?$/i
:
$thisperl
=~ m/
$Config
{exe_ext}$/i;
$thisperl
=
$self
->abs2rel(
$thisperl
)
if
$self
->{PERL_CORE};
my
@perls
= (
$thisperl
);
push
@perls
,
map
{
"$_$Config{exe_ext}"
}
(
"perl$Config{version}"
,
'perl5'
,
'perl'
);
my
$miniperl
=
"miniperl$Config{exe_ext}"
;
if
(
$self
->{PERL_CORE} ) {
splice
@perls
, 1, 0,
$miniperl
;
}
else
{
push
@perls
,
$miniperl
;
}
$self
->{PERL} ||=
$self
->find_perl(5.0, \
@perls
, \
@defpath
,
$Verbose
);
my
$perl
=
$self
->{PERL};
$perl
=~ s/^"//;
my
$has_mcr
=
$perl
=~ s/^MCR\s*//;
my
$perlflags
=
''
;
my
$stripped_perl
;
while
(
$perl
) {
(
$stripped_perl
=
$perl
) =~ s/"$//;
last
if
-x
$stripped_perl
;
last
unless
$perl
=~ s/(\s+\S+)$//;
$perlflags
= $1.
$perlflags
;
}
$self
->{PERL} =
$stripped_perl
;
$self
->{PERL} =
'MCR '
.
$self
->{PERL}
if
$has_mcr
||
$Is
{VMS};
my
$perl_name
=
'perl'
;
$perl_name
=
'ndbgperl'
if
$Is
{VMS} &&
defined
$Config
{usevmsdebug} &&
$Config
{usevmsdebug} eq
'define'
;
unless
(
$self
->{FULLPERL}) {
(
$self
->{FULLPERL} =
$self
->{PERL}) =~ s/\Q
$miniperl
\E$/
$perl_name
$Config
{exe_ext}/i;
$self
->{FULLPERL} =
qq{"$self->{FULLPERL}
"}.
$perlflags
;
}
$self
->{FULLPERL} =~
tr
/"//d
if
$Is
{VMS};
$self
->{FULLPERL} =~ s/^
"(\S(:\\|:)?)/$1"
/
if
$self
->is_make_type(
'dmake'
);
$self
->{ABSPERL} =
$self
->{PERL};
$has_mcr
=
$self
->{ABSPERL} =~ s/^MCR\s*//;
if
(
$self
->file_name_is_absolute(
$self
->{ABSPERL}) ) {
$self
->{ABSPERL} =
'$(PERL)'
;
}
else
{
$self
->{ABSPERL} =
$self
->rel2abs(
$self
->{ABSPERL});
$self
->{ABSPERL} =
$self
->quote_literal(
$self
->{ABSPERL})
if
$self
->{ABSPERL} =~ /\s/;
$self
->{ABSPERL} =
'MCR '
.
$self
->{ABSPERL}
if
$has_mcr
;
}
$self
->{PERL} =
qq{"$self->{PERL}
"}.
$perlflags
;
$self
->{PERL} =~
tr
/"//d
if
$Is
{VMS};
$self
->{PERL} =~ s/^
"(\S(:\\|:)?)/$1"
/
if
$self
->is_make_type(
'dmake'
);
$self
->{PERL_CORE} =
$ENV
{PERL_CORE}
unless
exists
$self
->{PERL_CORE};
$self
->{PERL_CORE} = 0
unless
defined
$self
->{PERL_CORE};
my
$lib_paths
=
$self
->{UNINSTALLED_PERL} ||
$self
->{PERL_CORE}
? (
$self
->{PERL_ARCHLIB} &&
$self
->{PERL_LIB} &&
$self
->{PERL_ARCHLIB} ne
$self
->{PERL_LIB} ) ?
q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"}
:
q{ "-I$(PERL_LIB)"}
:
undef
;
my
$inst_lib_paths
=
$self
->{INST_ARCHLIB} ne
$self
->{INST_LIB}
?
'RUN)'
.
$perlflags
.
' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"'
:
'RUN)'
.
$perlflags
.
' "-I$(INST_LIB)"'
;
foreach
my
$perl
(
qw(PERL FULLPERL ABSPERL)
) {
my
$run
=
$perl
.
'RUN'
;
$self
->{
$run
} =
qq{\$($perl)}
;
$self
->{
$run
} .=
$lib_paths
if
$lib_paths
;
$self
->{
$perl
.
'RUNINST'
} =
'$('
.
$perl
.
$inst_lib_paths
;
}
return
1;
}
sub
init_platform {
my
(
$self
) =
shift
;
$self
->{MM_Unix_VERSION} =
$VERSION
;
$self
->{PERL_MALLOC_DEF} =
'-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '
.
'-Dfree=Perl_mfree -Drealloc=Perl_realloc '
.
'-Dcalloc=Perl_calloc'
;
}
sub
platform_constants {
my
(
$self
) =
shift
;
my
$make_frag
=
''
;
foreach
my
$macro
(
qw(MM_Unix_VERSION PERL_MALLOC_DEF)
)
{
next
unless
defined
$self
->{
$macro
};
$make_frag
.=
"$macro = $self->{$macro}\n"
;
}
return
$make_frag
;
}
sub
init_PERM {
my
(
$self
) =
shift
;
$self
->{PERM_DIR} = 755
unless
defined
$self
->{PERM_DIR};
$self
->{PERM_RW} = 644
unless
defined
$self
->{PERM_RW};
$self
->{PERM_RWX} = 755
unless
defined
$self
->{PERM_RWX};
return
1;
}
sub
init_xs {
my
$self
=
shift
;
if
(
$self
->has_link_code()) {
$self
->{INST_STATIC} =
$self
->catfile(
'$(INST_ARCHAUTODIR)'
,
'$(BASEEXT)$(LIB_EXT)'
);
$self
->{INST_DYNAMIC} =
$self
->catfile(
'$(INST_ARCHAUTODIR)'
,
'$(DLBASE).$(DLEXT)'
);
$self
->{INST_BOOT} =
$self
->catfile(
'$(INST_ARCHAUTODIR)'
,
'$(BASEEXT).bs'
);
if
(
$self
->{XSMULTI}) {
my
@exts
=
$self
->_xs_list_basenames;
my
(
@statics
,
@dynamics
,
@boots
);
for
my
$ext
(
@exts
) {
my
(
$v
,
$d
,
$f
) = File::Spec->splitpath(
$ext
);
my
@d
= File::Spec->splitdir(
$d
);
shift
@d
if
defined
$d
[0] and
$d
[0] eq
'lib'
;
pop
@d
if
$d
[
$#d
] eq
''
;
my
$instdir
=
$self
->catdir(
'$(INST_ARCHLIB)'
,
'auto'
,
@d
,
$f
);
my
$instfile
=
$self
->catfile(
$instdir
,
$f
);
push
@statics
,
"$instfile\$(LIB_EXT)"
;
my
$dynfile
=
$instfile
;
if
(
defined
&DynaLoader::mod2fname
) {
$dynfile
=
$self
->catfile(
$instdir
,
&DynaLoader::mod2fname
([
@d
,
$f
]));
}
push
@dynamics
,
"$dynfile.\$(DLEXT)"
;
push
@boots
,
"$instfile.bs"
;
}
$self
->{INST_STATIC} =
join
' '
,
@statics
;
$self
->{INST_DYNAMIC} =
join
' '
,
@dynamics
;
$self
->{INST_BOOT} =
join
' '
,
@boots
;
}
}
else
{
$self
->{INST_STATIC} =
''
;
$self
->{INST_DYNAMIC} =
''
;
$self
->{INST_BOOT} =
''
;
}
}
sub
install {
my
(
$self
,
%attribs
) =
@_
;
my
(
@m
);
push
@m
,
q{
install :: pure_install doc_install
$(NOECHO) $(NOOP)
install_perl :: pure_perl_install doc_perl_install
$(NOECHO) $(NOOP)
install_site :: pure_site_install doc_site_install
$(NOECHO) $(NOOP)
install_vendor :: pure_vendor_install doc_vendor_install
$(NOECHO) $(NOOP)
pure_install :: pure_$(INSTALLDIRS)_install
$(NOECHO) $(NOOP)
doc_install :: doc_$(INSTALLDIRS)_install
$(NOECHO) $(NOOP)
pure__install : pure_site_install
$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
doc__install : doc_site_install
$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
pure_perl_install :: all
$(NOECHO) $(MOD_INSTALL) \
}
;
push
@m
,
q{ read "}
.
$self
->catfile(
'$(PERL_ARCHLIB)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{" \
write "}
.
$self
->catfile(
'$(DESTINSTALLARCHLIB)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{" \
}
unless
$self
->{NO_PACKLIST};
push
@m
,
q{ "$(INST_LIB)" "$(DESTINSTALLPRIVLIB)" \
"$(INST_ARCHLIB)" "$(DESTINSTALLARCHLIB)" \
"$(INST_BIN)" "$(DESTINSTALLBIN)" \
"$(INST_SCRIPT)" "$(DESTINSTALLSCRIPT)" \
"$(INST_MAN1DIR)" "$(DESTINSTALLMAN1DIR)" \
"$(INST_MAN3DIR)" "$(DESTINSTALLMAN3DIR)"
$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
"}
.
$self
->catdir(
'$(SITEARCHEXP)'
,
'auto'
,
'$(FULLEXT)'
).
q{"
pure_site_install :: all
$(NOECHO) $(MOD_INSTALL) \
}
;
push
@m
,
q{ read "}
.
$self
->catfile(
'$(SITEARCHEXP)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{" \
write "}
.
$self
->catfile(
'$(DESTINSTALLSITEARCH)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{" \
}
unless
$self
->{NO_PACKLIST};
push
@m
,
q{ "$(INST_LIB)" "$(DESTINSTALLSITELIB)" \
"$(INST_ARCHLIB)" "$(DESTINSTALLSITEARCH)" \
"$(INST_BIN)" "$(DESTINSTALLSITEBIN)" \
"$(INST_SCRIPT)" "$(DESTINSTALLSITESCRIPT)" \
"$(INST_MAN1DIR)" "$(DESTINSTALLSITEMAN1DIR)" \
"$(INST_MAN3DIR)" "$(DESTINSTALLSITEMAN3DIR)"
$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
"}
.
$self
->catdir(
'$(PERL_ARCHLIB)'
,
'auto'
,
'$(FULLEXT)'
).
q{"
pure_vendor_install :: all
$(NOECHO) $(MOD_INSTALL) \
}
;
push
@m
,
q{ read "}
.
$self
->catfile(
'$(VENDORARCHEXP)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{" \
write "}
.
$self
->catfile(
'$(DESTINSTALLVENDORARCH)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{" \
}
unless
$self
->{NO_PACKLIST};
push
@m
,
q{ "$(INST_LIB)" "$(DESTINSTALLVENDORLIB)" \
"$(INST_ARCHLIB)" "$(DESTINSTALLVENDORARCH)" \
"$(INST_BIN)" "$(DESTINSTALLVENDORBIN)" \
"$(INST_SCRIPT)" "$(DESTINSTALLVENDORSCRIPT)" \
"$(INST_MAN1DIR)" "$(DESTINSTALLVENDORMAN1DIR)" \
"$(INST_MAN3DIR)" "$(DESTINSTALLVENDORMAN3DIR)"
}
;
push
@m
,
q{
doc_perl_install :: all
$(NOECHO) $(NOOP)
doc_site_install :: all
$(NOECHO) $(NOOP)
doc_vendor_install :: all
$(NOECHO) $(NOOP)
}
if
$self
->{NO_PERLLOCAL};
push
@m
,
q{
doc_perl_install :: all
$(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
-$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
-$(NOECHO) $(DOC_INSTALL) \
"Module" "$(NAME)" \
"installed into" "$(INSTALLPRIVLIB)" \
LINKTYPE "$(LINKTYPE)" \
VERSION "$(VERSION)" \
EXE_FILES "$(EXE_FILES)" \
>> "}
.
$self
->catfile(
'$(DESTINSTALLARCHLIB)'
,
'perllocal.pod'
).
q{"
doc_site_install :: all
$(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
-$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
-$(NOECHO) $(DOC_INSTALL) \
"Module" "$(NAME)" \
"installed into" "$(INSTALLSITELIB)" \
LINKTYPE "$(LINKTYPE)" \
VERSION "$(VERSION)" \
EXE_FILES "$(EXE_FILES)" \
>> "}
.
$self
->catfile(
'$(DESTINSTALLARCHLIB)'
,
'perllocal.pod'
).
q{"
doc_vendor_install :: all
$(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
-$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
-$(NOECHO) $(DOC_INSTALL) \
"Module" "$(NAME)" \
"installed into" "$(INSTALLVENDORLIB)" \
LINKTYPE "$(LINKTYPE)" \
VERSION "$(VERSION)" \
EXE_FILES "$(EXE_FILES)" \
>> "}
.
$self
->catfile(
'$(DESTINSTALLARCHLIB)'
,
'perllocal.pod'
).
q{"
}
unless
$self
->{NO_PERLLOCAL};
push
@m
,
q{
uninstall :: uninstall_from_$(INSTALLDIRS)dirs
$(NOECHO) $(NOOP)
uninstall_from_perldirs ::
$(NOECHO) $(UNINSTALL) "}
.
$self
->catfile(
'$(PERL_ARCHLIB)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{"
uninstall_from_sitedirs ::
$(NOECHO) $(UNINSTALL) "}
.
$self
->catfile(
'$(SITEARCHEXP)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{"
uninstall_from_vendordirs ::
$(NOECHO) $(UNINSTALL) "}
.
$self
->catfile(
'$(VENDORARCHEXP)'
,
'auto'
,
'$(FULLEXT)'
,
'.packlist'
).
q{"
}
;
join
(
""
,
@m
);
}
sub
installbin {
my
(
$self
) =
shift
;
return
""
unless
$self
->{EXE_FILES} &&
ref
$self
->{EXE_FILES} eq
"ARRAY"
;
my
@exefiles
=
sort
@{
$self
->{EXE_FILES}};
return
""
unless
@exefiles
;
@exefiles
=
map
vmsify(
$_
),
@exefiles
if
$Is
{VMS};
my
%fromto
;
for
my
$from
(
@exefiles
) {
my
(
$path
)=
$self
->catfile(
'$(INST_SCRIPT)'
, basename(
$from
));
local
(
$_
) =
$path
;
my
$to
=
$self
->libscan(
$path
);
print
"libscan($from) => '$to'\n"
if
(
$Verbose
>=2);
$to
= vmsify(
$to
)
if
$Is
{VMS};
$fromto
{
$from
} =
$to
;
}
my
@to
=
sort
values
%fromto
;
my
@m
;
push
(
@m
,
qq{
EXE_FILES = @exefiles
pure_all :: @to
\$(NOECHO) \$(NOOP)
realclean ::
}
);
push
@m
,
map
"\t$_\n"
,
$self
->split_command(
'$(RM_F)'
,
@to
);
push
@m
,
"\n"
;
my
@froms
=
sort
keys
%fromto
;
for
my
$from
(
@froms
) {
push
@m
, _sprintf562
<<'MAKE', $from, $fromto{$from};
%2$s : %1$s $(FIRST_MAKEFILE) $(INST_SCRIPT)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists
$(NOECHO) $(RM_F) %2$s
$(CP) %1$s %2$s
$(FIXIN) %2$s
-$(NOECHO) $(CHMOD) $(PERM_RWX) %2$s
MAKE
}
join
""
,
@m
;
}
sub
linkext {
my
(
$self
,
%attribs
) =
@_
;
my
$linktype
=
$attribs
{LINKTYPE};
$linktype
=
$self
->{LINKTYPE}
unless
defined
$linktype
;
if
(
defined
$linktype
and
$linktype
eq
''
) {
warn
"Warning: LINKTYPE set to '', no longer necessary\n"
;
}
$linktype
=
'$(LINKTYPE)'
unless
defined
$linktype
;
"
linkext ::
$linktype
\$(NOECHO) \$(NOOP)
";
}
sub
lsdir {
my
(
undef
,
$dir
,
$regex
) =
@_
;
opendir
(
my
$dh
,
defined
(
$dir
) ?
$dir
:
"."
)
or
return
;
my
@ls
=
readdir
$dh
;
closedir
$dh
;
@ls
=
grep
(/
$regex
/,
@ls
)
if
defined
$regex
;
@ls
;
}
sub
macro {
my
(
$self
,
%attribs
) =
@_
;
my
@m
;
foreach
my
$key
(
sort
keys
%attribs
) {
my
$val
=
$attribs
{
$key
};
push
@m
,
"$key = $val\n"
;
}
join
""
,
@m
;
}
sub
makeaperl {
my
(
$self
,
%attribs
) =
@_
;
my
(
$makefilename
,
$searchdirs
,
$static
,
$extra
,
$perlinc
,
$target
,
$tmp
,
$libperl
) =
@attribs
{
qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)
};
s/^(.*)/
"-I$1"
/
for
@{
$perlinc
|| []};
my
(
@m
);
push
@m
, "
MAP_TARGET =
$target
FULLPERL =
$self
->{FULLPERL}
MAP_PERLINC = @{
$perlinc
|| []}
";
return
join
''
,
@m
if
$self
->{PARENT};
my
(
$dir
) =
join
":"
, @{
$self
->{DIR}};
unless
(
$self
->{MAKEAPERL}) {
push
@m
,
q{
$(MAP_TARGET) :: $(MAKE_APERL_FILE)
$(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
$(MAKE_APERL_FILE) : static $(FIRST_MAKEFILE) pm_to_blib
$(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
$(NOECHO) $(PERLRUNINST) \
Makefile.PL DIR="}
,
$dir
,
q{" \
MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=}
;
foreach
(
@ARGV
){
my
$arg
=
$_
;
if
(
$arg
=~ /(^.*?=)(.*['\s].*)/ ) {
$arg
= $1 .
$self
->quote_literal($2);
}
push
@m
,
" \\\n\t\t$arg"
;
}
push
@m
,
"\n"
;
return
join
''
,
@m
;
}
my
$cccmd
=
$self
->const_cccmd(
$libperl
);
$cccmd
=~ s/^CCCMD\s*=\s*//;
$cccmd
=~ s/\$\(INC\)/
"-I$self->{PERL_INC}"
/;
$cccmd
.=
" $Config{cccdlflags}"
if
(
$Config
{useshrplib} eq
'true'
);
$cccmd
=~ s/\(CC\)/\(PERLMAINCC\)/;
my
$linkcmd
=
join
' '
,
"\$(CC)"
,
grep
(
$_
,
@Config
{
qw(ldflags ccdlflags)
});
$linkcmd
=~ s/\s+/ /g;
$linkcmd
=~ s,(perl\.
exp
),\$(PERL_INC)/$1,;
my
$staticlib21
=
$self
->_find_static_libs(
$searchdirs
);
$static
= []
unless
$static
;
@$staticlib21
{@{
$static
}} = (1) x @{
$static
};
$extra
= []
unless
$extra
&&
ref
$extra
eq
'ARRAY'
;
for
(
sort
keys
%$staticlib21
) {
next
unless
/\Q
$self
->{LIB_EXT}\E\z/;
$_
= dirname(
$_
) .
"/extralibs.ld"
;
push
@$extra
,
$_
;
}
s/^(.*)/
"-I$1"
/
for
@{
$perlinc
|| []};
$target
||=
"perl"
;
$tmp
||=
"."
;
my
@map_static
=
reverse
sort
keys
%$staticlib21
;
push
@m
, "
MAP_LINKCMD =
$linkcmd
MAP_STATIC =
", join("
\\\n\t
", map { qq{"
$_
"} } @map_static), "
MAP_STATICDEP =
", join(' ', map { $self->quote_dep($_) } @map_static), "
MAP_PRELIBS =
$Config
{perllibs}
$Config
{cryptlib}
";
my
$lperl
;
if
(
defined
$libperl
) {
(
$lperl
=
$libperl
) =~ s/\$\(A\)/
$self
->{LIB_EXT}/;
}
unless
(
$libperl
&& -f
$lperl
) {
my
$dir
=
$self
->{PERL_SRC} ||
"$self->{PERL_ARCHLIB}/CORE"
;
$dir
=
"$self->{PERL_ARCHLIB}/.."
if
$self
->{UNINSTALLED_PERL};
$libperl
||=
"libperl$self->{LIB_EXT}"
;
$libperl
=
"$dir/$libperl"
;
$lperl
||=
"libperl$self->{LIB_EXT}"
;
$lperl
=
"$dir/$lperl"
;
if
(! -f
$libperl
and ! -f
$lperl
) {
if
(
$Is
{SunOS}) {
$lperl
=
$libperl
=
"$dir/$Config{libperl}"
;
$libperl
=
''
if
$Is
{SunOS4};
}
}
print
<<EOF unless -f $lperl || defined($self->{PERL_SRC});
Warning: $libperl not found
If you're going to build a static perl binary, make sure perl is installed
otherwise ignore this warning
EOF
}
my
$llibperl
=
$libperl
?
'$(MAP_LIBPERL)'
:
'-lperl'
;
my
$libperl_dep
=
$self
->quote_dep(
$libperl
);
push
@m
, "
MAP_LIBPERL =
$libperl
MAP_LIBPERLDEP =
$libperl_dep
LLIBPERL =
$llibperl
";
push
@m
, '
$(INST_ARCHAUTODIR)/extralibs.all : $(INST_ARCHAUTODIR)$(DFSEP).
exists
'.join(" \\\n\t", @$extra).'
$(NOECHO) $(RM_F) $@
$(NOECHO) $(TOUCH) $@
';
foreach
my
$catfile
(
@$extra
){
push
@m
,
"\tcat $catfile >> \$\@\n"
;
}
my
$ldfrom
=
$self
->{XSMULTI} ?
''
:
'$(LDFROM)'
;
push
@m
, _sprintf562
<<'EOF', $tmp, $ldfrom, $self->xs_obj_opt('$@'), $makefilename;
$(MAP_TARGET) :: %1$s/perlmain$(OBJ_EXT) $(MAP_LIBPERLDEP) $(MAP_STATICDEP) $(INST_ARCHAUTODIR)/extralibs.all
$(MAP_LINKCMD) %2$s $(OPTIMIZE) %1$s/perlmain$(OBJ_EXT) %3$s $(MAP_STATIC) "$(LLIBPERL)" `cat $(INST_ARCHAUTODIR)/extralibs.all` $(MAP_PRELIBS)
$(NOECHO) $(ECHO) "To install the new '$(MAP_TARGET)' binary, call"
$(NOECHO) $(ECHO) " $(MAKE) $(USEMAKEFILE) %4$s inst_perl MAP_TARGET=$(MAP_TARGET)"
$(NOECHO) $(ECHO) " $(MAKE) $(USEMAKEFILE) %4$s map_clean"
%1$s/perlmain\$(OBJ_EXT): %1$s/perlmain.c
EOF
push
@m
,
"\t"
.
$self
->cd(
$tmp
,
qq[$cccmd "-I\$(PERL_INC)" perlmain.c]
).
"\n"
;
my
$maybe_DynaLoader
=
$Config
{usedl} ?
'q(DynaLoader)'
:
''
;
push
@m
, _sprintf562
<<'EOF', $tmp, $makefilename, $maybe_DynaLoader;
%1$s/perlmain.c: %2$s
$(NOECHO) $(ECHO) Writing $@
$(NOECHO) $(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \
-e "writemain(grep(s#.*/auto/##s, @ARGV), %3$s)" $(MAP_STATIC) > $@t
$(MV) $@t $@
EOF
push
@m
,
"\t"
,
q{$(NOECHO) $(PERL) "$(INSTALLSCRIPT)/fixpmain"
}
if
(
defined
(
&Dos::UseLFN
) && Dos::UseLFN()==0);
push
@m
,
q{
doc_inst_perl :
$(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod"
-$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)"
-$(NOECHO) $(DOC_INSTALL) \
"Perl binary" "$(MAP_TARGET)" \
MAP_STATIC "$(MAP_STATIC)" \
MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
MAP_LIBPERL "$(MAP_LIBPERL)" \
>> "}
.
$self
->catfile(
'$(DESTINSTALLARCHLIB)'
,
'perllocal.pod'
).
q{"
}
;
push
@m
,
q{
inst_perl : pure_inst_perl doc_inst_perl
pure_inst_perl : $(MAP_TARGET)
}
.
$self
->{CP}.
q{ $(MAP_TARGET) "}
.
$self
->catfile(
'$(DESTINSTALLBIN)'
,
'$(MAP_TARGET)'
).
q{"
clean :: map_clean
map_clean :
}
.
$self
->{RM_F}.
qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
}
;
join
''
,
@m
;
}
sub
_find_static_libs {
my
(
$self
,
$searchdirs
) =
@_
;
my
$installed_version
=
join
(
'/'
,
'auto'
,
$self
->{FULLEXT},
"$self->{BASEEXT}$self->{LIB_EXT}"
);
my
%staticlib21
;
File::Find::find(
sub
{
if
(
$File::Find::name
=~ m{/auto/share\z}) {
$File::Find::prune
= 1;
return
;
}
return
unless
m/\Q
$self
->{LIB_EXT}\E$/;
return
unless
-f
'extralibs.ld'
;
return
if
m/^libperl/ or m/^perl\Q
$self
->{LIB_EXT}\E$/;
return
if
m/_pure_\w+_\w+_\w+\.\w+$/ and -f
"$File::Find::dir/.pure"
;
if
(
exists
$self
->{INCLUDE_EXT} ){
my
$found
= 0;
(
my
$xx
=
$File::Find::name
) =~ s,.*?/auto/,,s;
$xx
=~ s,/?
$_
,,;
$xx
=~ s,/,::,g;
foreach
my
$incl
((@{
$self
->{INCLUDE_EXT}},
'DynaLoader'
)){
if
(
$xx
eq
$incl
){
$found
++;
last
;
}
}
return
unless
$found
;
}
elsif
(
exists
$self
->{EXCLUDE_EXT} ){
(
my
$xx
=
$File::Find::name
) =~ s,.*?/auto/,,s;
$xx
=~ s,/?
$_
,,;
$xx
=~ s,/,::,g;
foreach
my
$excl
(@{
$self
->{EXCLUDE_EXT}}){
return
if
(
$xx
eq
$excl
);
}
}
return
if
$File::Find::name
=~ m:\Q
$installed_version
\E\z:;
return
if
!
$self
->xs_static_lib_is_xs(
$_
);
$staticlib21
{cwd() .
"/"
.
$_
}++;
},
grep
( -d
$_
,
map
{
$self
->catdir(
$_
,
'auto'
) } @{
$searchdirs
|| []}) );
return
\
%staticlib21
;
}
sub
xs_static_lib_is_xs {
my
(
$self
,
$libfile
) =
@_
;
my
$devnull
= File::Spec->devnull;
return
`nm
$libfile
2>
$devnull
` =~ /\b_?boot_/;
}
sub
makefile {
my
(
$self
) =
shift
;
my
$m
;
$m
= '
$(OBJECT) : $(FIRST_MAKEFILE)
'
if
$self
->{OBJECT};
my
$newer_than_target
=
$Is
{VMS} ?
'$(MMS$SOURCE_LIST)'
:
'$?'
;
my
$mpl_args
=
join
" "
,
map
qq["$_"]
,
@ARGV
;
my
$cross
=
''
;
if
(
defined
$::Cross::platform) {
$cross
=
"-MCross=$::Cross::platform "
;
}
$m
.=
sprintf
<<'MAKE_FRAG', $newer_than_target, $cross, $mpl_args;
# We take a very conservative approach here, but it's worth it.
# We move Makefile to Makefile.old here to avoid gnu make looping.
$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
$(NOECHO) $(ECHO) "Makefile out-of-date with respect to %s"
$(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
-$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
-$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
- $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
$(PERLRUN) %sMakefile.PL %s
$(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
$(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <=="
$(FALSE)
MAKE_FRAG
return
$m
;
}
sub
maybe_command {
my
(
$self
,
$file
) =
@_
;
return
$file
if
-x
$file
&& ! -d
$file
;
return
;
}
sub
needs_linking {
my
(
$self
) =
shift
;
my
$caller
= (
caller
(0))[3];
confess(
"needs_linking called too early"
)
if
$caller
=~ /^ExtUtils::MakeMaker::/;
return
$self
->{NEEDS_LINKING}
if
defined
$self
->{NEEDS_LINKING};
if
(
$self
->has_link_code or
$self
->{MAKEAPERL}){
$self
->{NEEDS_LINKING} = 1;
return
1;
}
foreach
my
$child
(
keys
%{
$self
->{CHILDREN}}) {
if
(
$self
->{CHILDREN}->{
$child
}->needs_linking) {
$self
->{NEEDS_LINKING} = 1;
return
1;
}
}
return
$self
->{NEEDS_LINKING} = 0;
}
sub
parse_abstract {
my
(
$self
,
$parsefile
) =
@_
;
my
$result
;
local
$/ =
"\n"
;
open
(
my
$fh
,
'<'
,
$parsefile
) or
die
"Could not open '$parsefile': $!"
;
binmode
$fh
;
my
$inpod
= 0;
my
$pod_encoding
;
my
$package
=
$self
->{DISTNAME};
$package
=~ s/-/::/g;
while
(<
$fh
>) {
$inpod
= /^=(?!cut)/ ? 1 : /^=cut/ ? 0 :
$inpod
;
next
if
!
$inpod
;
s
if
( /^=encoding\s*(.*)$/i ) {
$pod_encoding
= $1;
}
if
( /^(
$package
(?:\.pm)? \s+ -+ \s+)(.*)/x ) {
$result
= $2;
next
;
}
next
unless
$result
;
if
(
$result
&& ( /^\s*$/ || /^\=/ ) ) {
last
;
}
$result
=
join
' '
,
$result
,
$_
;
}
close
$fh
;
if
(
$pod_encoding
and !(
"$]"
< 5.008 or !
$Config
{useperlio} ) ) {
eval
{
$result
= Encode::decode(
$pod_encoding
,
$result
);
}
}
return
$result
;
}
sub
parse_version {
my
(
$self
,
$parsefile
) =
@_
;
my
$result
;
local
$/ =
"\n"
;
local
$_
;
open
(
my
$fh
,
'<'
,
$parsefile
) or
die
"Could not open '$parsefile': $!"
;
my
$inpod
= 0;
while
(<
$fh
>) {
$inpod
= /^=(?!cut)/ ? 1 : /^=cut/ ? 0 :
$inpod
;
next
if
$inpod
|| /^\s*
chop
;
next
if
/^\s*(
if
|
unless
|
elsif
)/;
if
( m{^ \s*
package
\s+ \w[\w\:\']* \s+ (v?[0-9._]+) \s* (;|\{) }x ) {
no
warnings;
$result
= $1;
}
elsif
( m{(?<!\\) ([\$*]) (([\w\:\']*) \bVERSION)\b .* (?<![<>=!])\=[^=]}x ) {
$result
=
$self
->get_version(
$parsefile
, $1, $2);
}
else
{
next
;
}
last
if
defined
$result
;
}
close
$fh
;
if
(
defined
$result
&&
$result
!~ /^v?[\d_\.]+$/ ) {
my
$normal
=
eval
{ version->new(
$result
) };
$result
=
$normal
if
defined
$normal
;
}
if
(
defined
$result
) {
$result
=
"undef"
unless
$result
=~ m!^v?[\d_\.]+$!
or
eval
{ version->parse(
$result
) };
}
$result
=
"undef"
unless
defined
$result
;
return
$result
;
}
sub
get_version {
my
(
$self
,
$parsefile
,
$sigil
,
$name
) =
@_
;
my
$line
=
$_
;
{
undef
*version
;
eval
{
version::->
import
;
};
no
strict;
no
warnings;
local
*{
$name
};
$line
= $1
if
$line
=~ m{^(.+)}s;
eval
(
$line
);
return
${
$name
};
}
}
sub
pasthru {
my
(
$self
) =
shift
;
my
(
@m
);
my
(
@pasthru
);
my
(
$sep
) =
$Is
{VMS} ?
','
:
''
;
$sep
.=
"\\\n\t"
;
foreach
my
$key
(
qw(LIB LIBPERL_A LINKTYPE OPTIMIZE
PREFIX INSTALL_BASE)
)
{
next
unless
defined
$self
->{
$key
};
push
@pasthru
,
"$key=\"\$($key)\""
;
}
foreach
my
$key
(
qw(DEFINE INC)
) {
my
$val
=
qq{\$($key)}
;
chomp
(
$val
=
$self
->{
$key
})
if
defined
$self
->{
$key
};
$val
.=
" \$(PASTHRU_$key)"
;
my
$quoted
=
$self
->quote_literal(
$val
);
push
@pasthru
,
qq{PASTHRU_$key=$quoted}
;
}
push
@m
,
"\nPASTHRU = "
,
join
(
$sep
,
@pasthru
),
"\n"
;
join
""
,
@m
;
}
sub
perl_script {
my
(
$self
,
$file
) =
@_
;
return
$file
if
-r
$file
&& -f _;
return
;
}
sub
perldepend {
my
(
$self
) =
shift
;
my
(
@m
);
my
$make_config
=
$self
->cd(
'$(PERL_SRC)'
,
'$(MAKE) lib/Config.pm'
);
push
@m
,
sprintf
<<'MAKE_FRAG', $make_config if $self->{PERL_SRC};
# Check for unpropogated config.sh changes. Should never happen.
# We do NOT just update config.h because that is not sufficient.
# An out of date config.h is not fatal but complains loudly!
$(PERL_INCDEP)/config.h: $(PERL_SRC)/config.sh
-$(NOECHO) $(ECHO) "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; $(FALSE)
$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
$(NOECHO) $(ECHO) "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
%s
MAKE_FRAG
return
join
""
,
@m
unless
$self
->needs_linking;
if
(
$self
->{OBJECT}) {
push
@m
,
$self
->_perl_header_files_fragment(
"/"
);
}
push
@m
,
join
(
" "
,
sort
values
%{
$self
->{XS}}).
" : \$(XSUBPPDEPS)\n"
if
%{
$self
->{XS}};
return
join
"\n"
,
@m
;
}
sub
pm_to_blib {
my
$self
=
shift
;
my
(
$autodir
) =
$self
->catdir(
'$(INST_LIB)'
,
'auto'
);
my
$r
=
q{
pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM)
}
;
my
$pm_to_blib
=
$self
->oneliner(
<<CODE, ['-MExtUtils::Install']);
pm_to_blib({\@ARGV}, '$autodir', q[\$(PM_FILTER)], '\$(PERM_DIR)')
CODE
my
@cmds
=
$self
->split_command(
$pm_to_blib
,
map
{ (
$self
->quote_literal(
$_
) =>
$self
->quote_literal(
$self
->{PM}->{
$_
})) }
sort
keys
%{
$self
->{PM}});
$r
.=
join
''
,
map
{
"\t\$(NOECHO) $_\n"
}
@cmds
;
$r
.=
qq{\t\$(NOECHO) \$(TOUCH) pm_to_blib\n}
;
return
$r
;
}
sub
_ppd_version {
my
(
$self
,
$string
) =
@_
;
return
join
','
, ((
split
/\./,
$string
), (0) x 4)[0..3];
}
sub
ppd {
my
(
$self
) =
@_
;
my
$abstract
=
$self
->{ABSTRACT} ||
''
;
$abstract
=~ s/\n/\\n/sg;
$abstract
=~ s/</
<
;/g;
$abstract
=~ s/>/
>
;/g;
my
$author
=
join
(
', '
,@{
ref
$self
->{AUTHOR} eq
'ARRAY'
?
$self
->{AUTHOR} : [
$self
->{AUTHOR} ||
''
]});
$author
=~ s/</
<
;/g;
$author
=~ s/>/
>
;/g;
my
$ppd_file
=
"$self->{DISTNAME}.ppd"
;
my
@ppd_chunks
=
qq(<SOFTPKG NAME="$self->{DISTNAME}" VERSION="$self->{VERSION}">\n)
;
push
@ppd_chunks
,
sprintf
<<'PPD_HTML', $abstract, $author;
<ABSTRACT>%s</ABSTRACT>
<AUTHOR>%s</AUTHOR>
PPD_HTML
push
@ppd_chunks
,
" <IMPLEMENTATION>\n"
;
if
(
$self
->{MIN_PERL_VERSION} ) {
my
$min_perl_version
=
$self
->_ppd_version(
$self
->{MIN_PERL_VERSION});
push
@ppd_chunks
,
sprintf
<<'PPD_PERLVERS', $min_perl_version;
<PERLCORE VERSION="%s" />
PPD_PERLVERS
}
my
%prereqs
= %{
$self
->{PREREQ_PM}};
delete
$prereqs
{perl};
foreach
my
$prereq
(
sort
keys
%prereqs
) {
my
$name
=
$prereq
;
$name
.=
'::'
unless
$name
=~ /::/;
my
$version
=
$prereqs
{
$prereq
};
my
%attrs
= (
NAME
=>
$name
);
$attrs
{VERSION} =
$version
if
$version
;
my
$attrs
=
join
" "
,
map
{
qq[$_="$attrs{$_}"]
}
sort
keys
%attrs
;
push
@ppd_chunks
,
qq( <REQUIRE $attrs />\n)
;
}
my
$archname
=
$Config
{archname};
if
(
"$]"
>= 5.008) {
$archname
.=
"-$Config{api_revision}.$Config{api_version}"
;
}
push
@ppd_chunks
,
sprintf
<<'PPD_OUT', $archname;
<ARCHITECTURE NAME="%s" />
PPD_OUT
if
(
$self
->{PPM_INSTALL_SCRIPT}) {
if
(
$self
->{PPM_INSTALL_EXEC}) {
push
@ppd_chunks
,
sprintf
qq{ <INSTALL EXEC="%s">%s</INSTALL>\n}
,
$self
->{PPM_INSTALL_EXEC},
$self
->{PPM_INSTALL_SCRIPT};
}
else
{
push
@ppd_chunks
,
sprintf
qq{ <INSTALL>%s</INSTALL>\n}
,
$self
->{PPM_INSTALL_SCRIPT};
}
}
if
(
$self
->{PPM_UNINSTALL_SCRIPT}) {
if
(
$self
->{PPM_UNINSTALL_EXEC}) {
push
@ppd_chunks
,
sprintf
qq{ <UNINSTALL EXEC="%s">%s</UNINSTALL>\n}
,
$self
->{PPM_UNINSTALL_EXEC},
$self
->{PPM_UNINSTALL_SCRIPT};
}
else
{
push
@ppd_chunks
,
sprintf
qq{ <UNINSTALL>%s</UNINSTALL>\n}
,
$self
->{PPM_UNINSTALL_SCRIPT};
}
}
my
(
$bin_location
) =
$self
->{BINARY_LOCATION} ||
''
;
$bin_location
=~ s/\\/\\\\/g;
push
@ppd_chunks
,
sprintf
<<'PPD_XML', $bin_location;
<CODEBASE HREF="%s" />
</IMPLEMENTATION>
</SOFTPKG>
PPD_XML
my
@ppd_cmds
=
$self
->stashmeta(
join
(
''
,
@ppd_chunks
),
$ppd_file
);
return
sprintf
<<'PPD_OUT', join "\n\t", @ppd_cmds;
# Creates a PPD (Perl Package Description) for a binary distribution.
ppd :
%s
PPD_OUT
}
sub
prefixify {
my
(
$self
,
$var
,
$sprefix
,
$rprefix
,
$default
) =
@_
;
my
$path
=
$self
->{
uc
$var
} ||
$Config_Override
{
lc
$var
} ||
$Config
{
lc
$var
} ||
''
;
$rprefix
.=
'/'
if
$sprefix
=~ m|/$|;
warn
" prefixify $var => $path\n"
if
$Verbose
>= 2;
warn
" from $sprefix to $rprefix\n"
if
$Verbose
>= 2;
if
(
$self
->{ARGS}{PREFIX} &&
$path
!~ s{^\Q
$sprefix
\E\b}{
$rprefix
}s )
{
warn
" cannot prefix, using default.\n"
if
$Verbose
>= 2;
warn
" no default!\n"
if
!
$default
&&
$Verbose
>= 2;
$path
=
$self
->catdir(
$rprefix
,
$default
)
if
$default
;
}
print
" now $path\n"
if
$Verbose
>= 2;
return
$self
->{
uc
$var
} =
$path
;
}
sub
processPL {
my
$self
=
shift
;
my
$pl_files
=
$self
->{PL_FILES};
return
""
unless
$pl_files
;
my
$m
=
''
;
foreach
my
$plfile
(
sort
keys
%$pl_files
) {
my
$targets
=
$pl_files
->{
$plfile
};
my
$list
=
ref
(
$targets
) eq
'HASH'
? [
sort
keys
%$targets
] :
ref
(
$targets
) eq
'ARRAY'
?
$pl_files
->{
$plfile
} :
[
$pl_files
->{
$plfile
}];
foreach
my
$target
(
@$list
) {
if
(
$Is
{VMS} ) {
$plfile
= vmsify(
$self
->eliminate_macros(
$plfile
));
$target
= vmsify(
$self
->eliminate_macros(
$target
));
}
my
$pm_dep
;
my
$perlrun
;
if
(
defined
$self
->{PM}{
$target
} ) {
$pm_dep
=
''
;
$perlrun
=
'PERLRUN'
;
}
else
{
$pm_dep
=
'pm_to_blib'
;
$perlrun
=
'PERLRUNINST'
;
}
my
$extra_inputs
=
''
;
if
(
ref
(
$targets
) eq
'HASH'
) {
my
$inputs
=
ref
(
$targets
->{
$target
})
?
$targets
->{
$target
}
: [
$targets
->{
$target
}];
for
my
$input
(
@$inputs
) {
if
(
$Is
{VMS} ) {
$input
= vmsify(
$self
->eliminate_macros(
$input
));
}
$extra_inputs
.=
' '
.
$input
;
}
}
$m
.=
<<MAKE_FRAG;
pure_all :: $target
\$(NOECHO) \$(NOOP)
$target :: $plfile $pm_dep $extra_inputs
\$($perlrun) $plfile $target $extra_inputs
MAKE_FRAG
}
}
return
$m
;
}
sub
specify_shell {
return
''
;
}
sub
quote_paren {
my
$arg
=
shift
;
$arg
=~ s{\$\((.+?)\)}{\$\\\\($1\\\\)}g;
$arg
=~ s{(?<!\\)([()])}{\\$1}g;
$arg
=~ s{\$\\\\\((.+?)\\\\\)}{\$($1)}g;
return
$arg
;
}
sub
replace_manpage_separator {
my
(
$self
,
$man
) =
@_
;
$man
=~ s,/+,::,g;
return
$man
;
}
sub
cd {
my
(
$self
,
$dir
,
@cmds
) =
@_
;
my
$make_frag
=
join
"\n\t"
,
map
{
"cd $dir && $_"
}
@cmds
;
return
$make_frag
;
}
sub
oneliner {
my
(
$self
,
$cmd
,
$switches
) =
@_
;
$switches
= []
unless
defined
$switches
;
$cmd
=~ s{^\n+}{};
$cmd
=~ s{\n+$}{};
my
@cmds
=
split
/\n/,
$cmd
;
$cmd
=
join
" \n\t -e "
,
map
$self
->quote_literal(
$_
),
@cmds
;
$cmd
=
$self
->escape_newlines(
$cmd
);
$switches
=
join
' '
,
@$switches
;
return
qq{\$(ABSPERLRUN) $switches -e $cmd --}
;
}
sub
quote_literal {
my
(
$self
,
$text
,
$opts
) =
@_
;
$opts
->{allow_variables} = 1
unless
defined
$opts
->{allow_variables};
$text
=~ s{
'}{'
\\
''
}g;
$text
=
$opts
->{allow_variables}
?
$self
->escape_dollarsigns(
$text
) :
$self
->escape_all_dollarsigns(
$text
);
return
"'$text'"
;
}
sub
escape_newlines {
my
(
$self
,
$text
) =
@_
;
$text
=~ s{\n}{\\\n}g;
return
$text
;
}
sub
max_exec_len {
my
$self
=
shift
;
if
(!
defined
$self
->{_MAX_EXEC_LEN}) {
if
(
my
$arg_max
=
eval
{
require
POSIX;
&POSIX::ARG_MAX
}) {
$self
->{_MAX_EXEC_LEN} =
$arg_max
;
}
else
{
$self
->{_MAX_EXEC_LEN} = 4096;
}
}
return
$self
->{_MAX_EXEC_LEN};
}
sub
static {
my
(
$self
) =
shift
;
'
static :: $(FIRST_MAKEFILE) $(INST_STATIC)
$(NOECHO) $(NOOP)
';
}
sub
static_lib {
my
(
$self
) =
@_
;
return
''
unless
$self
->has_link_code;
my
(
@m
);
my
@libs
;
if
(
$self
->{XSMULTI}) {
for
my
$ext
(
$self
->_xs_list_basenames) {
my
(
$v
,
$d
,
$f
) = File::Spec->splitpath(
$ext
);
my
@d
= File::Spec->splitdir(
$d
);
shift
@d
if
$d
[0] eq
'lib'
;
my
$instdir
=
$self
->catdir(
'$(INST_ARCHLIB)'
,
'auto'
,
@d
,
$f
);
my
$instfile
=
$self
->catfile(
$instdir
,
"$f\$(LIB_EXT)"
);
my
$objfile
=
"$ext\$(OBJ_EXT)"
;
push
@libs
, [
$objfile
,
$instfile
,
$instdir
];
}
}
else
{
@libs
= ([
qw($(OBJECT)
$(INST_STATIC) $(INST_ARCHAUTODIR)) ]);
}
push
@m
,
map
{
$self
->xs_make_static_lib(
@$_
); }
@libs
;
join
"\n"
,
@m
;
}
sub
xs_make_static_lib {
my
(
$self
,
$from
,
$to
,
$todir
) =
@_
;
my
@m
=
sprintf
'%s: %s $(MYEXTLIB) %s$(DFSEP).exists'
.
"\n"
,
$to
,
$from
,
$todir
;
push
@m
,
"\t\$(RM_F) \"\$\@\"\n"
;
push
@m
,
$self
->static_lib_fixtures;
push
@m
,
$self
->static_lib_pure_cmd(
$from
);
push
@m
,
"\t\$(CHMOD) \$(PERM_RWX) \$\@\n"
;
push
@m
,
$self
->static_lib_closures(
$todir
);
join
''
,
@m
;
}
sub
static_lib_closures {
my
(
$self
,
$todir
) =
@_
;
my
@m
=
sprintf
<<'MAKE_FRAG', $todir;
$(NOECHO) $(ECHO) "$(EXTRALIBS)" > %s$(DFSEP)extralibs.ld
MAKE_FRAG
push
@m
,
<<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
$(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)$(DFSEP)ext.libs
MAKE_FRAG
@m
;
}
sub
static_lib_fixtures {
my
(
$self
) =
@_
;
return
unless
$self
->{MYEXTLIB};
"\t\$(CP) \$(MYEXTLIB) \"\$\@\"\n"
;
}
sub
static_lib_pure_cmd {
my
(
$self
,
$from
) =
@_
;
my
$ar
;
if
(
exists
$self
->{FULL_AR} && -x
$self
->{FULL_AR}) {
$ar
=
'FULL_AR'
;
}
else
{
$ar
=
'AR'
;
}
sprintf
<<'MAKE_FRAG', $ar, $from;
$(%s) $(AR_STATIC_ARGS) "$@" %s
$(RANLIB) "$@"
MAKE_FRAG
}
sub
staticmake {
my
(
$self
,
%attribs
) =
@_
;
my
(
@static
);
my
(
@searchdirs
)=(
$self
->{PERL_ARCHLIB},
$self
->{SITEARCHEXP},
$self
->{INST_ARCHLIB});
if
(@{
$self
->{C}}) {
@static
=
$self
->catfile(
$self
->{INST_ARCHLIB},
"auto"
,
$self
->{FULLEXT},
"$self->{BASEEXT}$self->{LIB_EXT}"
);
}
my
(
@perlinc
) = (
$self
->{INST_ARCHLIB},
$self
->{INST_LIB},
$self
->{PERL_ARCHLIB},
$self
->{PERL_LIB});
$self
->makeaperl(
MAKE
=>
$self
->{MAKEFILE},
DIRS
=> \
@searchdirs
,
STAT
=> \
@static
,
INCL
=> \
@perlinc
,
TARGET
=>
$self
->{MAP_TARGET},
TMP
=>
""
,
LIBPERL
=>
$self
->{LIBPERL_A}
);
}
sub
subdir_x {
my
(
$self
,
$subdir
) =
@_
;
my
$subdir_cmd
=
$self
->cd(
$subdir
,
'$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)'
);
return
sprintf
<<'EOT', $subdir_cmd;
subdirs ::
$(NOECHO) %s
EOT
}
sub
subdirs {
my
(
$self
) =
shift
;
my
(
@m
);
foreach
my
$dir
(@{
$self
->{DIR}}){
push
@m
,
$self
->subdir_x(
$dir
);
}
if
(
@m
){
unshift
@m
,
<<'EOF';
# The default clean, realclean and test targets in this Makefile
# have automatically been given entries for each subdir.
EOF
}
else
{
push
(
@m
,
"\n# none"
)
}
join
(
''
,
@m
);
}
sub
test {
my
(
$self
,
%attribs
) =
@_
;
my
$tests
=
$attribs
{TESTS} ||
''
;
if
(!
$tests
&& -d
't'
&&
defined
$attribs
{RECURSIVE_TEST_FILES}) {
$tests
=
$self
->find_tests_recursive;
}
elsif
(!
$tests
&& -d
't'
) {
$tests
=
$self
->find_tests;
}
$tests
=~ s!/!\\!g
if
$self
->is_make_type(
'nmake'
);
my
@m
;
my
$default_testtype
=
$Config
{usedl} ?
'dynamic'
:
'static'
;
push
@m
,
<<EOF;
TEST_VERBOSE=0
TEST_TYPE=test_\$(LINKTYPE)
TEST_FILE = test.pl
TEST_FILES = $tests
TESTDB_SW = -d
testdb :: testdb_\$(LINKTYPE)
\$(NOECHO) \$(NOOP)
test :: \$(TEST_TYPE)
\$(NOECHO) \$(NOOP)
# Occasionally we may face this degenerate target:
test_ : test_$default_testtype
\$(NOECHO) \$(NOOP)
EOF
for
my
$linktype
(
qw(dynamic static)
) {
my
$directdeps
=
join
' '
,
grep
!
$self
->{SKIPHASH}{
$_
},
$linktype
,
"pure_all"
;
push
@m
,
"subdirs-test_$linktype :: $directdeps\n"
;
foreach
my
$dir
(@{
$self
->{DIR} }) {
my
$test
=
$self
->cd(
$dir
,
"\$(MAKE) test_$linktype \$(PASTHRU)"
);
push
@m
,
"\t\$(NOECHO) $test\n"
;
}
push
@m
,
"\n"
;
if
(
$tests
or -f
"test.pl"
) {
for
my
$testspec
([
''
,
''
], [
'db'
,
' $(TESTDB_SW)'
]) {
my
(
$db
,
$switch
) =
@$testspec
;
my
(
$command
,
$deps
);
$deps
=
$db
eq
'db'
?
$directdeps
:
"subdirs-test_$linktype"
;
if
(
$linktype
eq
'static'
and
$self
->needs_linking) {
my
$target
= File::Spec->rel2abs(
'$(MAP_TARGET)'
);
$command
=
qq{"$target" \$(MAP_PERLINC)}
;
$deps
.=
' $(MAP_TARGET)'
;
}
else
{
$command
=
'$(FULLPERLRUN)'
.
$switch
;
}
push
@m
,
"test${db}_$linktype :: $deps\n"
;
if
(
$db
eq
'db'
) {
push
@m
,
$self
->test_via_script(
$command
,
'$(TEST_FILE)'
)
}
else
{
push
@m
,
$self
->test_via_script(
$command
,
'$(TEST_FILE)'
)
if
-f
"test.pl"
;
push
@m
,
$self
->test_via_harness(
$command
,
'$(TEST_FILES)'
)
if
$tests
;
}
push
@m
,
"\n"
;
}
}
else
{
push
@m
, _sprintf562
<<'EOF', $linktype;
testdb_%1$s test_%1$s :: subdirs-test_%1$s
$(NOECHO) $(ECHO) 'No tests defined for $(NAME) extension.'
EOF
}
}
join
""
,
@m
;
}
sub
test_via_harness {
my
(
$self
,
$perl
,
$tests
) =
@_
;
return
$self
->SUPER::test_via_harness(
"PERL_DL_NONLAZY=1 $perl"
,
$tests
);
}
sub
test_via_script {
my
(
$self
,
$perl
,
$script
) =
@_
;
return
$self
->SUPER::test_via_script(
"PERL_DL_NONLAZY=1 $perl"
,
$script
);
}
sub
tool_xsubpp {
my
(
$self
) =
shift
;
return
""
unless
$self
->needs_linking;
my
$xsdir
;
my
@xsubpp_dirs
=
@INC
;
unshift
@xsubpp_dirs
,
$self
->{PERL_LIB}
if
$self
->{PERL_CORE};
my
$foundxsubpp
= 0;
foreach
my
$dir
(
@xsubpp_dirs
) {
$xsdir
=
$self
->catdir(
$dir
,
'ExtUtils'
);
if
( -r
$self
->catfile(
$xsdir
,
"xsubpp"
) ) {
$foundxsubpp
= 1;
last
;
}
}
die
"ExtUtils::MM_Unix::tool_xsubpp : Can't find xsubpp"
if
!
$foundxsubpp
;
my
$tmdir
=
$self
->catdir(
$self
->{PERL_LIB},
"ExtUtils"
);
my
(
@tmdeps
) =
$self
->catfile(
$tmdir
,
'typemap'
);
if
(
$self
->{TYPEMAPS} ){
foreach
my
$typemap
(@{
$self
->{TYPEMAPS}}){
if
( ! -f
$typemap
) {
warn
"Typemap $typemap not found.\n"
;
}
else
{
$typemap
= vmsify(
$typemap
)
if
$Is
{VMS};
push
(
@tmdeps
,
$typemap
);
}
}
}
push
(
@tmdeps
,
"typemap"
)
if
-f
"typemap"
;
my
@tmargs
=
map
{
'-typemap '
.
$self
->quote_literal(File::Spec->rel2abs(
$_
)) }
@tmdeps
;
$_
=
$self
->quote_dep(
$_
)
for
@tmdeps
;
if
(
exists
$self
->{XSOPT} ){
unshift
(
@tmargs
,
$self
->{XSOPT} );
}
if
(
$Is
{VMS} &&
$Config
{
'ldflags'
} &&
$Config
{
'ldflags'
} =~ m!/Debug!i &&
(!
exists
(
$self
->{XSOPT}) ||
$self
->{XSOPT} !~ /linenumbers/)
)
{
unshift
(
@tmargs
,
'-nolinenumbers'
);
}
$self
->{XSPROTOARG} =
""
unless
defined
$self
->{XSPROTOARG};
my
$xsdirdep
=
$self
->quote_dep(
$xsdir
);
return
qq{
XSUBPPDIR = $xsdir
XSUBPP = "\$(XSUBPPDIR)\$(DFSEP)xsubpp"
XSUBPPRUN = \$(PERLRUN) \$(XSUBPP)
XSPROTOARG = $self->{XSPROTOARG}
XSUBPPDEPS =
@tmdeps
$xsdirdep
\$(DFSEP)xsubpp
XSUBPPARGS =
@tmargs
XSUBPP_EXTRA_ARGS =
};
}
sub
all_target {
my
$self
=
shift
;
return
<<'MAKE_EXT';
all :: pure_all manifypods
$(NOECHO) $(NOOP)
MAKE_EXT
}
sub
top_targets {
my
(
$self
) =
shift
;
my
(
@m
);
push
@m
,
$self
->all_target,
"\n"
unless
$self
->{SKIPHASH}{
'all'
};
push
@m
,
sprintf
<<'EOF';
pure_all :: config pm_to_blib subdirs linkext
$(NOECHO) $(NOOP)
subdirs :: $(MYEXTLIB)
$(NOECHO) $(NOOP)
config :: $(FIRST_MAKEFILE) blibdirs
$(NOECHO) $(NOOP)
EOF
push
@m
, '
$(O_FILES) : $(H_FILES)
'
if
@{
$self
->{O_FILES} || []} && @{
$self
->{H} || []};
push
@m
,
q{
help :
perldoc ExtUtils::MakeMaker
}
;
join
(
''
,
@m
);
}
sub
writedoc {
my
(
$self
,
$what
,
$name
,
@attribs
)=
@_
;
my
$time
=
gmtime
(
$ENV
{SOURCE_DATE_EPOCH} ||
time
);
print
"=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n"
;
print
join
"\n\n=item *\n\n"
,
map
(
"C<$_>"
,
@attribs
);
print
"\n\n=back\n\n"
;
}
sub
xs_c {
my
(
$self
) =
shift
;
return
''
unless
$self
->needs_linking();
'
.xs.c:
$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc
$(MV) $*.xsc $*.c
';
}
sub
xs_cpp {
my
(
$self
) =
shift
;
return
''
unless
$self
->needs_linking();
'
.xs.cpp:
$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc
$(MV) $*.xsc $*.cpp
';
}
sub
xs_o {
my
(
$self
) =
@_
;
return
''
unless
$self
->needs_linking();
my
$m_o
=
$self
->{XSMULTI} ?
$self
->xs_obj_opt(
'$*$(OBJ_EXT)'
) :
''
;
my
$dbgout
=
$self
->dbgoutflag;
$dbgout
=
$dbgout
?
"$dbgout "
:
''
;
my
$frag
=
''
;
$frag
.=
sprintf
<<'EOF', $dbgout, $m_o unless $self->is_make_type('dmake');
.xs$(OBJ_EXT) :
$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc
$(MV) $*.xsc $*.c
$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) %s$*.c %s
EOF
if
(
$self
->{XSMULTI}) {
for
my
$ext
(
$self
->_xs_list_basenames) {
my
$pmfile
=
"$ext.pm"
;
croak
"$ext.xs has no matching $pmfile: $!"
unless
-f
$pmfile
;
my
$version
=
$self
->parse_version(
$pmfile
);
my
$cccmd
=
$self
->{CONST_CCCMD};
$cccmd
=~ s/^\s
*CCCMD
\s*=\s*//;
$cccmd
=~ s/\$\(DEFINE_VERSION\)/-DVERSION=\\
"$version\\"
/;
$cccmd
=~ s/\$\(XS_DEFINE_VERSION\)/-DXS_VERSION=\\
"$version\\"
/;
$self
->_xsbuild_replace_macro(
$cccmd
,
'xs'
,
$ext
,
'INC'
);
my
$define
=
'$(DEFINE)'
;
$self
->_xsbuild_replace_macro(
$define
,
'xs'
,
$ext
,
'DEFINE'
);
$frag
.= _sprintf562
<<'EOF', $ext, $cccmd, $m_o, $define, $dbgout;
%1$s$(OBJ_EXT): %1$s.xs
$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc
$(MV) $*.xsc $*.c
%2$s $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) %4$s %5$s$*.c %3$s
EOF
}
}
$frag
=~ s/
"-I(\$\(PERL_INC\))"
/-iwithsysroot
"$1"
/sg
if
$Is
{ApplCor};
$frag
;
}
sub
_xsbuild_replace_macro {
my
(
$self
,
undef
,
$xstype
,
$ext
,
$varname
) =
@_
;
my
$value
=
$self
->_xsbuild_value(
$xstype
,
$ext
,
$varname
);
return
unless
defined
$value
;
$_
[1] =~ s/\$\(
$varname
\)/
$value
/;
}
sub
_xsbuild_value {
my
(
$self
,
$xstype
,
$ext
,
$varname
) =
@_
;
return
$self
->{XSBUILD}{
$xstype
}{
$ext
}{
$varname
}
if
$self
->{XSBUILD}{
$xstype
}{
$ext
}{
$varname
};
return
$self
->{XSBUILD}{
$xstype
}{all}{
$varname
}
if
$self
->{XSBUILD}{
$xstype
}{all}{
$varname
};
();
}
1;