App-Staticperl
view release on metacpan or search on metacpan
@static_ext = sort @static_ext;
# prototypes
for (@static_ext) {
s/\.pm$//;
(my $cname = $_) =~ s/\//__/g;
print $fh " EXTERN_C void boot_$cname (pTHX_ CV* cv);\n";
}
print $fh <<EOF;
char *file = __FILE__;
dXSUB_SYS;
newXSproto ("$PACKAGE\::find", find, file, "\$");
newXSproto ("$PACKAGE\::list", list, file, "");
#ifdef STATICPERL_BUNDLE_XS_INIT
STATICPERL_BUNDLE_XS_INIT;
#endif
EOF
# calls
for (@static_ext) {
s/\.pm$//;
(my $cname = $_) =~ s/\//__/g;
(my $pname = $_) =~ s/\//::/g;
my $bootstrap = $pname eq "DynaLoader" ? "boot_DynaLoader" : "bootstrap";
print $fh " newXS (\"$pname\::$bootstrap\", boot_$cname, file);\n";
}
print $fh <<EOF;
Safefree (PL_origfilename);
PL_origfilename = savepv (PL_origargv [0]);
sv_setpv (GvSV (gv_fetchpvs ("0", GV_ADD|GV_NOTQUAL, SVt_PV)), PL_origfilename);
#ifdef _WIN32
/* windows perls usually trail behind unix perls 8-10 years in exporting symbols */
if (!PL_preambleav)
PL_preambleav = newAV ();
av_unshift (PL_preambleav, 1);
av_store (PL_preambleav, 0, newSVpv (bootstrap, sizeof (bootstrap) - 1));
#else
Perl_av_create_and_unshift_one (&PL_preambleav, newSVpv (bootstrap, sizeof (bootstrap) - 1));
#endif
if (PL_oldname)
((XSINIT_t)PL_oldname)(aTHX);
}
EOF
#############################################################################
# optional perl_init/perl_destroy
if ($IGNORE_ENV) {
$IGNORE_ENV = <<EOF;
unsetenv ("PERL_UNICODE");
unsetenv ("PERL_HASH_SEED_DEBUG");
unsetenv ("PERL_DESTRUCT_LEVEL");
unsetenv ("PERL_SIGNALS");
unsetenv ("PERL_DEBUG_MSTATS");
unsetenv ("PERL5OPT");
unsetenv ("PERLIO_DEBUG");
unsetenv ("PERLIO");
unsetenv ("PERL_HASH_SEED");
EOF
} else {
$IGNORE_ENV = "";
}
if ($APP) {
print $fh <<EOF;
int
main (int argc, char *argv [])
{
extern char **environ;
int i, exitstatus;
char **args = malloc ((argc + 3) * sizeof (const char *));
args [0] = argv [0];
args [1] = "-e";
args [2] = "0";
args [3] = "--";
for (i = 1; i < argc; ++i)
args [i + 3] = argv [i];
$IGNORE_ENV
PERL_SYS_INIT3 (&argc, &argv, &environ);
staticperl = perl_alloc ();
perl_construct (staticperl);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
exitstatus = perl_parse (staticperl, staticperl_xs_init, argc + 3, args, environ);
if (!exitstatus)
perl_run (staticperl);
exitstatus = perl_destruct (staticperl);
perl_free (staticperl);
PERL_SYS_TERM ();
/*free (args); no point doing it this late */
return exitstatus;
}
EOF
} elsif ($PERL) {
print $fh <<EOF;
int
main (int argc, char *argv [])
{
extern char **environ;
int exitstatus;
$IGNORE_ENV
PERL_SYS_INIT3 (&argc, &argv, &environ);
staticperl = perl_alloc ();
perl_construct (staticperl);
PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
exitstatus = perl_parse (staticperl, staticperl_xs_init, argc, argv, environ);
if (!exitstatus)
( run in 0.636 second using v1.01-cache-2.11-cpan-39bf76dae61 )