require
5.006;
our
%Config_Override
;
$VERSION
=
'6.93_01'
;
$VERSION
=
eval
$VERSION
;
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/;
}
BEGIN {
if
(
$Is
{VMS} ) {
VMS::Filespec->
import
;
}
}
my
$Curdir
= __PACKAGE__->curdir;
my
$Rootdir
= __PACKAGE__->rootdir;
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
(
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
}
;
}
push
@m
,
qq{
.c.s:
$command -S $flags \$*.c
.c\$(OBJ_EXT):
$command $flags \$*.c
.cpp\$(OBJ_EXT):
$command $flags \$*.cpp
.cxx\$(OBJ_EXT):
$command $flags \$*.cxx
.cc\$(OBJ_EXT):
$command $flags \$*.cc
}
;
push
@m
,
qq{
.C\$(OBJ_EXT):
$command $flags \$*.C
}
if
!
$Is
{OS2} and !
$Is
{Win32} and !
$Is
{Dos};
return
join
""
,
@m
;
}
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
(
$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 '
;
}
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)'
;
}
$self
->{CCFLAGS} = quote_paren(
$self
->{CCFLAGS});
$self
->{OPTIMIZE} = quote_paren(
$self
->{OPTIMIZE});
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
=
<<"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
};
$self
->{
uc
$key
} = quote_paren(
$self
->{
uc
$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
INSTALLDIRS INSTALL_BASE DESTDIR PREFIX
PERLPREFIX SITEPREFIX VENDORPREFIX
)
,
(
map
{ (
"INSTALL"
.
$_
,
"DESTINSTALL"
.
$_
)
}
$self
->installvars),
qw(
PERL_LIB
PERL_ARCHLIB
LIBPERL_A MYEXTLIB
FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE
PERLMAINCC PERL_SRC PERL_INC
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/
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(@{$self->{C}})."
O_FILES =
".$self->wraplist(@{$self->{O_FILES}})."
H_FILES =
".$self->wraplist(@{$self->{H}})."
MAN1PODS =
".$self->wraplist(sort keys %{$self->{MAN1PODS}})."
MAN3PODS =
".$self->wraplist(sort keys %{$self->{MAN3PODS}})."
";
push
@m
,
q{
# Where is the Config information that we are using/depend on
CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
}
if
-e File::Spec->catfile(
$self
->{PERL_INC},
'config.h'
);
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_ARCHIVE_AFTER =
$self
->{PERL_ARCHIVE_AFTER}
};
push
@m
, "
TO_INST_PM =
".$self->wraplist(sort keys %{$self->{PM}})."
PM_TO_BLIB =
".$self->wraplist(map { ($_ => $self->{PM}->{$_}) } sort keys %{$self->{PM}})."
";
join
(
''
,
@m
);
}
sub
depend {
my
(
$self
,
%attribs
) =
@_
;
my
(
@m
,
$key
,
$val
);
while
((
$key
,
$val
) =
each
%attribs
){
last
unless
defined
$key
;
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
q{
ci :
$(PERLRUN) "-MExtUtils::Manifest=maniread" \\
-e "@all = keys %{ maniread() }
;" \\
-e
"print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});"
\\
-e
"print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
};
}
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
'
BOOTSTRAP =
'
unless
$self
->has_link_code();
my
$target
=
$Is
{VMS} ?
'$(MMS$TARGET)'
:
'$@'
;
return
sprintf
<<'MAKE_FRAG', ($target) x 2;
BOOTSTRAP = $(BASEEXT).bs
# 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.
$(BOOTSTRAP) : $(FIRST_MAKEFILE) $(BOOTDEP) $(INST_ARCHAUTODIR)$(DFSEP).exists
$(NOECHO) $(ECHO) "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
$(NOECHO) $(PERLRUN) \
"-MExtUtils::Mkbootstrap" \
-e "Mkbootstrap('$(BASEEXT)','$(BSLOADLIBS)');"
$(NOECHO) $(TOUCH) %s
$(CHMOD) $(PERM_RW) %s
MAKE_FRAG
}
sub
dynamic_lib {
my
(
$self
,
%attribs
) =
@_
;
return
''
unless
$self
->needs_linking();
return
''
unless
$self
->has_link_code;
my
(
$otherldflags
) =
$attribs
{OTHERLDFLAGS} ||
""
;
my
(
$inst_dynamic_dep
) =
$attribs
{INST_DYNAMIC_DEP} ||
""
;
my
(
$armaybe
) =
$attribs
{ARMAYBE} ||
$self
->{ARMAYBE} ||
":"
;
my
(
$ldfrom
) =
'$(LDFROM)'
;
$armaybe
=
'ar'
if
(
$Is
{OSF} and
$armaybe
eq
':'
);
my
(
@m
);
my
$ld_opt
=
$Is
{OS2} ?
'$(OPTIMIZE) '
:
''
;
my
$ld_fix
=
$Is
{OS2} ?
'|| ( $(RM_F) $@ && sh -c false )'
:
''
;
push
(
@m
,'
ARMAYBE =
'.$armaybe.'
OTHERLDFLAGS =
'.$ld_opt.$otherldflags.'
INST_DYNAMIC_DEP =
'.$inst_dynamic_dep.'
INST_DYNAMIC_FIX =
'.$ld_fix.'
$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).
exists
$(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
');
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) $@
');
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, $ldfrom, $libs;
%s$(LD) %s $(LDDLFLAGS) %s $(OTHERLDFLAGS) -o $@ $(MYEXTLIB) \
$(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST) \
$(INST_DYNAMIC_FIX)
MAKE
push
@m
,
<<'MAKE';
$(CHMOD) $(PERM_RWX) $@
$(NOECHO) $(RM_RF) $(BOOTSTRAP)
- $(CP_NONEMPTY) $(BOOTSTRAP) $(INST_BOOT) $(PERM_RW)
MAKE
return
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
){
foreach
my
$dir
(
@$dirs
){
next
unless
defined
$dir
;
my
(
$abs
,
$val
);
if
(
$self
->file_name_is_absolute(
$name
)) {
$abs
=
$name
;
}
elsif
(
$self
->canonpath(
$name
) eq
$self
->canonpath(basename(
$name
))) {
$abs
=
$self
->catfile(
$dir
,
$name
);
}
else
{
$abs
=
$self
->catfile(
$Curdir
,
$name
);
}
print
"Checking $abs\n"
if
(
$trace
>= 2);
next
unless
$self
->maybe_command(
$abs
);
print
"Executing $abs\n"
if
(
$trace
>= 2);
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
(
$cmd
,
$arg
) =
split
' '
,
$line
, 2;
$cmd
=~ s!^.*/!!;
my
$interpreter
;
if
(
$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
) {
if
(
$self
->maybe_command(
$cmd
) ) {
warn
"Ignoring $interpreter in $file\n"
if
$Verbose
&&
$interpreter
;
$interpreter
=
$self
->catfile(
$dir
,
$cmd
);
}
}
}
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"
;
}
$shb
.=
qq{
eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}
'
if
0;
}
unless
$Is
{Win32};
}
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-.*\.dir$/
i
:
qr/^\Q$self->{DISTNAME}-/
;
@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
();
}
}
}
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) {
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
;
$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
->{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_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_name
=
'perl'
;
$perl_name
=
'ndbgperl'
if
$Is
{VMS} &&
defined
$Config
{usevmsdebug} &&
$Config
{usevmsdebug} eq
'define'
;
(
$self
->{FULLPERL} =
$self
->{PERL}) =~ s/\Q
$miniperl
\E$/
$perl_name
$Config
{exe_ext}/i
unless
$self
->{FULLPERL};
$self
->{ABSPERL} =
$self
->{PERL};
my
$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_CORE} =
$ENV
{PERL_CORE}
unless
exists
$self
->{PERL_CORE};
$self
->{PERL_CORE} = 0
unless
defined
$self
->{PERL_CORE};
foreach
my
$perl
(
qw(PERL FULLPERL ABSPERL)
) {
my
$run
=
$perl
.
'RUN'
;
$self
->{
$run
} =
"\$($perl)"
;
$self
->{
$run
} .=
q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"}
if
$self
->{UNINSTALLED_PERL} ||
$self
->{PERL_CORE};
$self
->{
$perl
.
'RUNINST'
} =
sprintf
q{$(%sRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"}
,
$perl
;
}
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'
);
}
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
= @{
$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
=
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"
;
while
(
my
(
$from
,
$to
) =
each
%fromto
) {
last
unless
defined
$from
;
push
@m
,
sprintf
<<'MAKE', $to, $from, $to, $from, $to, $to, $to;
%s : %s $(FIRST_MAKEFILE) $(INST_SCRIPT)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists
$(NOECHO) $(RM_F) %s
$(CP) %s %s
$(FIXIN) %s
-$(NOECHO) $(CHMOD) $(PERM_RWX) %s
MAKE
}
join
""
,
@m
;
}
sub
linkext {
my
(
$self
,
%attribs
) =
@_
;
my
(
$linktype
) =
defined
$attribs
{LINKTYPE} ?
$attribs
{LINKTYPE} :
'$(LINKTYPE)'
;
"
linkext ::
$linktype
\$(NOECHO) \$(NOOP)
";
}
sub
lsdir {
my
(
$self
) =
shift
;
my
(
$dir
,
$regex
) =
@_
;
my
(
@ls
);
my
$dh
= new DirHandle;
$dh
->
open
(
$dir
||
"."
) or
return
();
@ls
=
$dh
->
read
;
$dh
->
close
;
@ls
=
grep
(/
$regex
/,
@ls
)
if
$regex
;
@ls
;
}
sub
macro {
my
(
$self
,
%attribs
) =
@_
;
my
(
@m
,
$key
,
$val
);
while
((
$key
,
$val
) =
each
%attribs
){
last
unless
defined
$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)
};
my
(
@m
);
push
@m
, "
MAP_TARGET =
$target
FULLPERL =
$self
->{FULLPERL}
";
return
join
''
,
@m
if
$self
->{PARENT};
my
(
$dir
) =
join
":"
, @{
$self
->{DIR}};
unless
(
$self
->{MAKEAPERL}) {
push
@m
,
q{
$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
$(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
$(MAKE_APERL_FILE) : $(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
){
if
( /\s/ ){
s/=(.*)/=
'$1'
/;
}
push
@m
,
" \\\n\t\t$_"
;
}
push
@m
,
"\n"
;
return
join
''
,
@m
;
}
my
(
$cccmd
,
$linkcmd
,
$lperl
);
$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\)/;
$linkcmd
=
join
' '
,
"\$(CC)"
,
grep
(
$_
,
@Config
{
qw(ldflags ccdlflags)
});
$linkcmd
=~ s/\s+/ /g;
$linkcmd
=~ s,(perl\.
exp
),\$(PERL_INC)/$1,;
my
%static
;
File::Find::find(
sub
{
return
unless
m/\Q
$self
->{LIB_EXT}\E$/;
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:auto/
$self
->{FULLEXT}/
$self
->{BASEEXT}
$self
->{LIB_EXT}\z:;
$static
{cwd() .
"/"
.
$_
}++;
},
grep
( -d
$_
, @{
$searchdirs
|| []}) );
$static
= []
unless
$static
;
@static
{@{
$static
}} = (1) x @{
$static
};
$extra
= []
unless
$extra
&&
ref
$extra
eq
'ARRAY'
;
for
(
sort
keys
%static
) {
next
unless
/\Q
$self
->{LIB_EXT}\E\z/;
$_
= dirname(
$_
) .
"/extralibs.ld"
;
push
@$extra
,
$_
;
}
s/^(.*)/
"-I$1"
/
for
@{
$perlinc
|| []};
$target
||=
"perl"
;
$tmp
||=
"."
;
push
@m
, "
MAP_LINKCMD =
$linkcmd
MAP_PERLINC = @{
$perlinc
|| []}
MAP_STATIC = ",
join
(
" \\\n\t"
,
reverse
sort
keys
%static
), "
MAP_PRELIBS =
$Config
{perllibs}
$Config
{cryptlib}
";
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
"Warning:
$libperl
not found
If you're going to build a static perl binary, make sure perl is installed
otherwise ignore this warning\n"
unless
(-f
$lperl
||
defined
(
$self
->{PERL_SRC}));
}
my
$llibperl
=
$libperl
?
'$(MAP_LIBPERL)'
:
'-lperl'
;
push
@m
, "
MAP_LIBPERL =
$libperl
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"
;
}
push
@m
, "
\$(MAP_TARGET) ::
$tmp
/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
\$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE)
$tmp
/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) \$(LLIBPERL) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
\$(NOECHO) \$(ECHO)
'To install the new \"\$(MAP_TARGET)\" binary, call'
\$(NOECHO) \$(ECHO)
' \$(MAKE) \$(USEMAKEFILE) $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
\$(NOECHO) \$(ECHO)
'To remove the intermediate files say'
\$(NOECHO) \$(ECHO)
' \$(MAKE) \$(USEMAKEFILE) $makefilename map_clean'
$tmp
/perlmain\$(OBJ_EXT):
$tmp
/perlmain.c
";
push
@m
,
"\t"
.
$self
->cd(
$tmp
,
qq[$cccmd "-I\$(PERL_INC)" perlmain.c]
).
"\n"
;
push
@m
,
qq{
$tmp/perlmain.c: $makefilename}
,
q{
$(NOECHO) $(ECHO) Writing $@
$(NOECHO) $(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \\
-e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
}
;
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
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': $!"
;
my
$inpod
= 0;
my
$package
=
$self
->{DISTNAME};
$package
=~ s/-/::/g;
while
(<
$fh
>) {
$inpod
= /^=(?!cut)/ ? 1 : /^=cut/ ? 0 :
$inpod
;
next
if
!
$inpod
;
chop
;
if
( /^(
$package
(?:\.pm)? \s+ -+ \s+)(.*)/x ) {
$result
= $2;
next
;
}
next
unless
$result
;
if
(
$result
&& ( /^\s*$/ || /^\=/ ) ) {
last
;
}
$result
=
join
' '
,
$result
,
$_
;
}
close
$fh
;
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 ) {
local
$^W = 0;
$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->parse(
$result
) };
$result
=
$normal
if
defined
$normal
;
}
$result
=
"undef"
unless
defined
$result
;
return
$result
;
}
sub
get_version
{
my
(
$self
,
$parsefile
,
$sigil
,
$name
) =
@_
;
my
$eval
=
qq{
package ExtUtils::MakeMaker::_version;
no strict;
BEGIN { eval {
# Ensure any version() routine which might have leaked
# into this package has been deleted. Interferes with
# version->import()
undef *version;
require version;
"version"->import;
}
}
local
$sigil
$name
;
\
$$name
=
undef
;
do
{
$_
};
\
$$name
;
};
$eval
= $1
if
$eval
=~ m{^(.+)}s;
local
$^W = 0;
my
$result
=
eval
(
$eval
);
warn
"Could not eval '$eval' in $parsefile: $@"
if
$@;
$result
;
}
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)
) {
next
unless
defined
$self
->{
$key
};
push
@pasthru
,
"PASTHRU_$key=\"\$(PASTHRU_$key)\""
;
}
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_INC)/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
(
" "
,
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
->{PM}->{
$_
}) }
sort
keys
%{
$self
->{PM}});
$r
.=
join
''
,
map
{
"\t\$(NOECHO) $_\n"
}
@cmds
;
$r
.=
qq{\t\$(NOECHO) \$(TOUCH) pm_to_blib\n}
;
return
$r
;
}
sub
post_constants{
""
;
}
sub
post_initialize {
""
;
}
sub
postamble {
""
;
}
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
(
', '
,@{
$self
->{AUTHOR} || []});
$author
=~ s/</
<
;/g;
$author
=~ s/>/
>
;/g;
my
$ppd_file
=
'$(DISTNAME).ppd'
;
my
@ppd_cmds
=
$self
->echo(
<<'PPD_HTML', $ppd_file, { append => 0, allow_variables => 1 });
<SOFTPKG NAME="$(DISTNAME)" VERSION="$(VERSION)">
PPD_HTML
my
$ppd_xml
=
sprintf
<<'PPD_HTML', $abstract, $author;
<ABSTRACT>%s</ABSTRACT>
<AUTHOR>%s</AUTHOR>
PPD_HTML
$ppd_xml
.=
" <IMPLEMENTATION>\n"
;
if
(
$self
->{MIN_PERL_VERSION} ) {
my
$min_perl_version
=
$self
->_ppd_version(
$self
->{MIN_PERL_VERSION});
$ppd_xml
.=
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
}+0;
my
%attrs
= (
NAME
=>
$name
);
$attrs
{VERSION} =
$version
if
$version
;
my
$attrs
=
join
" "
,
map
{
qq[$_="$attrs{$_}"]
}
keys
%attrs
;
$ppd_xml
.=
qq( <REQUIRE $attrs />\n)
;
}
my
$archname
=
$Config
{archname};
if
($] >= 5.008) {
$archname
.=
"-$Config{PERL_REVISION}.$Config{PERL_VERSION}"
;
}
$ppd_xml
.=
sprintf
<<'PPD_OUT', $archname;
<ARCHITECTURE NAME="%s" />
PPD_OUT
if
(
$self
->{PPM_INSTALL_SCRIPT}) {
if
(
$self
->{PPM_INSTALL_EXEC}) {
$ppd_xml
.=
sprintf
qq{ <INSTALL EXEC="%s">%s</INSTALL>\n}
,
$self
->{PPM_INSTALL_EXEC},
$self
->{PPM_INSTALL_SCRIPT};
}
else
{
$ppd_xml
.=
sprintf
qq{ <INSTALL>%s</INSTALL>\n}
,
$self
->{PPM_INSTALL_SCRIPT};
}
}
if
(
$self
->{PPM_UNINSTALL_SCRIPT}) {
if
(
$self
->{PPM_UNINSTALL_EXEC}) {
$ppd_xml
.=
sprintf
qq{ <UNINSTALL EXEC="%s">%s</UNINSTALL>\n}
,
$self
->{PPM_UNINSTALL_EXEC},
$self
->{PPM_UNINSTALL_SCRIPT};
}
else
{
$ppd_xml
.=
sprintf
qq{ <UNINSTALL>%s</UNINSTALL>\n}
,
$self
->{PPM_UNINSTALL_SCRIPT};
}
}
my
(
$bin_location
) =
$self
->{BINARY_LOCATION} ||
''
;
$bin_location
=~ s/\\/\\\\/g;
$ppd_xml
.=
sprintf
<<'PPD_XML', $bin_location;
<CODEBASE HREF="%s" />
</IMPLEMENTATION>
</SOFTPKG>
PPD_XML
push
@ppd_cmds
,
$self
->echo(
$ppd_xml
,
$ppd_file
, {
append
=> 1 });
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
$list
=
ref
(
$pl_files
->{
$plfile
})
?
$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'
;
}
$m
.=
<<MAKE_FRAG;
all :: $target
\$(NOECHO) \$(NOOP)
$target :: $plfile $pm_dep
\$($perlrun) $plfile $target
MAKE_FRAG
}
}
return
$m
;
}
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
);
push
(
@m
,
<<'END');
$(INST_STATIC) : $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
$(RM_RF) $@
END
push
(
@m
,
<<'MAKE_FRAG') if $self->{MYEXTLIB};
$(CP) $(MYEXTLIB) $@
MAKE_FRAG
my
$ar
;
if
(
exists
$self
->{FULL_AR} && -x
$self
->{FULL_AR}) {
$ar
=
'FULL_AR'
;
}
else
{
$ar
=
'AR'
;
}
push
@m
,
sprintf
<<'MAKE_FRAG', $ar;
$(%s) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
$(CHMOD) $(PERM_RWX) $@
$(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
MAKE_FRAG
push
@m
,
<<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
$(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
MAKE_FRAG
join
(
''
,
@m
);
}
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
, "
");
}
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;
}
my
(
@m
);
push
(
@m
,"
TEST_VERBOSE=0
TEST_TYPE=test_\$(LINKTYPE)
TEST_FILE = test.pl
TEST_FILES =
$tests
TESTDB_SW = -d
testdb :: testdb_\$(LINKTYPE)
test :: \$(TEST_TYPE) subdirs-test
subdirs-test ::
\$(NOECHO) \$(NOOP)
");
foreach
my
$dir
(@{
$self
->{DIR} }) {
my
$test
=
$self
->cd(
$dir
,
'$(MAKE) test $(PASTHRU)'
);
push
@m
,
<<END
subdirs-test ::
\$(NOECHO) $test
END
}
push
(
@m
,
"\t\$(NOECHO) \$(ECHO) 'No tests defined for \$(NAME) extension.'\n"
)
unless
$tests
or -f
"test.pl"
or @{
$self
->{DIR}};
push
(
@m
,
"\n"
);
push
(
@m
,
"test_dynamic :: pure_all\n"
);
push
(
@m
,
$self
->test_via_harness(
'$(FULLPERLRUN)'
,
'$(TEST_FILES)'
))
if
$tests
;
push
(
@m
,
$self
->test_via_script(
'$(FULLPERLRUN)'
,
'$(TEST_FILE)'
))
if
-f
"test.pl"
;
push
(
@m
,
"\n"
);
push
(
@m
,
"testdb_dynamic :: pure_all\n"
);
push
(
@m
,
$self
->test_via_script(
'$(FULLPERLRUN) $(TESTDB_SW)'
,
'$(TEST_FILE)'
));
push
(
@m
,
"\n"
);
push
@m
,
"test_ : test_dynamic\n\n"
;
if
(
$self
->needs_linking()) {
push
(
@m
,
"test_static :: pure_all \$(MAP_TARGET)\n"
);
push
(
@m
,
$self
->test_via_harness(
'./$(MAP_TARGET)'
,
'$(TEST_FILES)'
))
if
$tests
;
push
(
@m
,
$self
->test_via_script(
'./$(MAP_TARGET)'
,
'$(TEST_FILE)'
))
if
-f
"test.pl"
;
push
(
@m
,
"\n"
);
push
(
@m
,
"testdb_static :: pure_all \$(MAP_TARGET)\n"
);
push
(
@m
,
$self
->test_via_script(
'./$(MAP_TARGET) $(TESTDB_SW)'
,
'$(TEST_FILE)'
));
push
(
@m
,
"\n"
);
}
else
{
push
@m
,
"test_static :: test_dynamic\n"
;
push
@m
,
"testdb_static :: testdb_dynamic\n"
;
}
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
= File::Spec->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
{
push
(
@tmdeps
,
$typemap
);
}
}
}
push
(
@tmdeps
,
"typemap"
)
if
-f
"typemap"
;
my
(
@tmargs
) =
map
(
"-typemap $_"
,
@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};
return
qq{
XSUBPPDIR = $xsdir
XSUBPP = \$(XSUBPPDIR)\$(DFSEP)xsubpp
XSUBPPRUN = \$(PERLRUN) \$(XSUBPP)
XSPROTOARG = $self->{XSPROTOARG}
XSUBPPDEPS =
@tmdeps
\$(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
, '
pure_all :: config pm_to_blib subdirs linkext
$(NOECHO) $(NOOP)
subdirs :: $(MYEXTLIB)
$(NOECHO) $(NOOP)
config :: $(FIRST_MAKEFILE) blibdirs
$(NOECHO) $(NOOP)
';
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
=
localtime
;
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
) =
shift
;
return
''
unless
$self
->needs_linking();
'
.xs$(OBJ_EXT):
$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
$(CCCMD) $(CCCDLFLAGS)
"-I$(PERL_INC)"
$(PASTHRU_DEFINE) $(DEFINE) $*.c
';
}
1;