+#./perl -w
#
# Create the export list for perl.
#
# and by AIX for creating libperl.a when -Dusershrplib is in effect,
# and by MacOS Classic.
#
-# reads global.sym, pp.sym, perlvars.h, intrpvar.h, thrdvar.h, config.h
-# On OS/2 reads miniperl.map and the previous version of perl5.def as well
+# Reads from information stored in
+#
+# config.h
+# config.sh
+# global.sym
+# globvar.sym
+# intrpvar.h
+# macperl.sym (on MacOS)
+# miniperl.map (on OS/2)
+# perl5.def (on OS/2; this is the old version of the file being made)
+# perlio.sym
+# perlvars.h
+#
+# plus long lists of function names hard-coded directly in this script and
+# in the DATA section.
+#
+# Writes the result to STDOUT.
+#
+# Normally this script is invoked from a makefile (e.g. win32/Makefile),
+# which redirects STDOUT to a suitable file, such as:
+#
+# perl5.def OS/2
+# perldll.def Windows
+# perl.exp AIX
+# perl.imp NetWare
-my $PLATFORM;
-my $CCTYPE;
+
+BEGIN { unshift @INC, "lib" }
+use strict;
+
+use vars qw($PLATFORM $CCTYPE $FILETYPE $CONFIG_ARGS $ARCHNAME $PATCHLEVEL);
+
+my (%define, %ordinal);
while (@ARGV) {
my $flag = shift;
my $config_sh = "config.sh";
my $config_h = "config.h";
-my $thrdvar_h = "thrdvar.h";
my $intrpvar_h = "intrpvar.h";
my $perlvars_h = "perlvars.h";
my $global_sym = "global.sym";
}
elsif ($PLATFORM =~ /^win(?:32|ce)$/ || $PLATFORM eq 'netware') {
$CCTYPE = "MSVC" unless defined $CCTYPE;
- foreach ($thrdvar_h, $intrpvar_h, $perlvars_h, $global_sym,
+ foreach ($intrpvar_h, $perlvars_h, $global_sym,
$pp_sym, $globvar_sym, $perlio_sym) {
s!^!..\\!;
}
}
elsif ($PLATFORM eq 'MacOS') {
- foreach ($thrdvar_h, $intrpvar_h, $perlvars_h, $global_sym,
+ foreach ($intrpvar_h, $perlvars_h, $global_sym,
$pp_sym, $globvar_sym, $perlio_sym) {
s!^!::!;
}
$define{$1} = 1 if /^\s*#\s*define\s+(MULTIPLICITY)\b/;
$define{$1} = 1 if /^\s*#\s*define\s+(PERL_\w+)\b/;
$define{$1} = 1 if /^\s*#\s*define\s+(USE_\w+)\b/;
+ $define{$1} = 1 if /^\s*#\s*define\s+(HAS_\w+)\b/;
}
close(CFG);
print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n";
if ($PLATFORM =~ /^win(?:32|ce)$/) {
- ($dll = ($define{PERL_DLL} || "perl59")) =~ s/\.dll$//i;
+ (my $dll = ($define{PERL_DLL} || "perl511")) =~ s/\.dll$//i;
print "LIBRARY $dll\n";
- print "DESCRIPTION 'Perl interpreter'\n";
+ # The DESCRIPTION module definition file statement is not supported
+ # by VC7 onwards.
+ if ($CCTYPE !~ /^MSVC7/ && $CCTYPE !~ /^MSVC8/ && $CCTYPE !~ /^MSVC9/) {
+ print "DESCRIPTION 'Perl interpreter'\n";
+ }
print "EXPORTS\n";
if ($define{PERL_IMPLICIT_SYS}) {
output_symbol("perl_get_host_info");
}
$sym_ord < $_ and $sym_ord = $_ for values %ordinal; # Take the max
}
- ($v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/;
+ (my $v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/;
$v .= '-thread' if $ARCHNAME =~ /-thread/;
- ($dll = $define{PERL_DLL}) =~ s/\.dll$//i;
+ (my $dll = $define{PERL_DLL}) =~ s/\.dll$//i;
$v .= "\@$PATCHLEVEL" if $PATCHLEVEL;
- $d = "DESCRIPTION '\@#perl5-porters\@perl.org:$v#\@ Perl interpreter, configured as $CONFIG_ARGS'";
+ my $d = "DESCRIPTION '\@#perl5-porters\@perl.org:$v#\@ Perl interpreter, configured as $CONFIG_ARGS'";
$d = substr($d, 0, 249) . "...'" if length $d > 253;
print <<"---EOP---";
LIBRARY '$dll' INITINSTANCE TERMINSTANCE
---EOP---
}
elsif ($PLATFORM eq 'aix') {
- $OSVER = `uname -v`;
+ my $OSVER = `uname -v`;
chop $OSVER;
- $OSREL = `uname -r`;
+ my $OSREL = `uname -r`;
chop $OSREL;
if ($OSVER > 4 || ($OSVER == 4 && $OSREL >= 3)) {
print "#! ..\n";
}
elsif ($PLATFORM eq 'netware') {
if ($FILETYPE eq 'def') {
- print "LIBRARY perl59\n";
+ print "LIBRARY perl511\n";
print "DESCRIPTION 'Perl interpreter for NetWare'\n";
print "EXPORTS\n";
}
PL_statusvalue_vms
PL_sys_intern
)]);
+ skip_symbols([qw(
+ Perl_signbit
+ )])
+ if $define{'HAS_SIGNBIT'};
+ emit_symbols([qw(
+ boot_DynaLoader
+ )]);
}
elsif ($PLATFORM eq 'os2') {
emit_symbols([qw(
Perl_debstack
Perl_debstackptrs
Perl_pad_sv
- Perl_sv_peek
Perl_hv_assert
PL_block_type
PL_watchaddr
unless ($define{'PERL_OLD_COPY_ON_WRITE'}) {
skip_symbols [qw(
Perl_sv_setsv_cow
- Perl_sv_release_IVX
)];
}
Perl_dump_mstats
Perl_get_mstats
Perl_malloced_size
+ Perl_malloc_good_size
MallocCfg_ptr
MallocCfgP_ptr
)];
unless ($define{'USE_ITHREADS'}) {
skip_symbols [qw(
- PL_ptr_table
- PL_pte_root
- PL_pte_arenaroot
PL_op_mutex
PL_regex_pad
PL_regex_padav
PL_hints_mutex
PL_perlio_mutex
PL_regdupe
+ Perl_parser_dup
Perl_dirp_dup
Perl_cx_dup
Perl_si_dup
Perl_gp_dup
Perl_he_dup
Perl_mg_dup
- Perl_re_dup
+ Perl_mro_meta_dup
+ Perl_re_dup_guts
Perl_sv_dup
Perl_rvpv_dup
Perl_hek_dup
Perl_sys_intern_dup
- Perl_ptr_table_clear
- Perl_ptr_table_fetch
- Perl_ptr_table_free
- Perl_ptr_table_new
- Perl_ptr_table_clear
- Perl_ptr_table_free
- Perl_ptr_table_split
- Perl_ptr_table_store
perl_clone
perl_clone_using
Perl_sharedsv_find
Perl_sharedsv_unlock
Perl_stashpv_hvname_match
Perl_regdupe_internal
+ Perl_newPADOP
)];
}
PL_my_cxt_index
PL_my_cxt_list
PL_my_cxt_size
+ PL_my_cxt_keys
Perl_croak_nocontext
Perl_die_nocontext
Perl_deb_nocontext
Perl_sv_catpvf_mg_nocontext
Perl_sv_setpvf_mg_nocontext
Perl_my_cxt_init
+ Perl_my_cxt_index
)];
}
)];
}
+unless ($define{'PERL_DEBUG_READONLY_OPS'}) {
+ skip_symbols [qw(
+ PL_slab_count
+ PL_slabs
+ )];
+}
+
unless ($define{'THREADS_HAVE_PIDS'}) {
skip_symbols [qw(PL_ppid)];
}
)];
}
+unless ($define{'DEBUG_LEAKING_SCALARS'}) {
+ skip_symbols [qw(
+ PL_sv_serial
+ )];
+}
+
unless ($define{'DEBUG_LEAKING_SCALARS_FORK_DUMP'}) {
skip_symbols [qw(
PL_dumper_fd
)];
}
+unless ($define{'MULTIPLICITY'}) {
+ skip_symbols [qw(
+ PL_interp_size
+ PL_interp_size_5_10_0
+ )];
+}
+
+unless ($define{'PERL_GLOBAL_STRUCT'}) {
+ skip_symbols [qw(
+ PL_global_struct_size
+ )];
+}
+
+unless ($define{'PERL_GLOBAL_STRUCT_PRIVATE'}) {
+ skip_symbols [qw(
+ PL_my_cxt_keys
+ Perl_my_cxt_index
+ )];
+}
+
unless ($define{'d_mmap'}) {
skip_symbols [qw(
PL_mmap_page_size
PerlIO_arg_fetch
PerlIO_debug
PerlIO_define_layer
+ PerlIO_find_layer
PerlIO_isutf8
PerlIO_layer_fetch
+ PerlIO_list_alloc
PerlIO_list_free
PerlIO_modestr
PerlIO_parse_layers
# variables
if ($define{'MULTIPLICITY'}) {
- for my $f ($perlvars_h, $intrpvar_h, $thrdvar_h) {
+ for my $f ($perlvars_h, $intrpvar_h) {
my $glob = readvar($f, sub { "Perl_" . $_[1] . $_[2] . "_ptr" });
emit_symbols $glob;
}
my $glob = readvar($intrpvar_h);
emit_symbols $glob;
}
- unless ($define{'MULTIPLICITY'}) {
- my $glob = readvar($thrdvar_h);
- emit_symbols $glob;
- }
}
sub try_symbol {
win32_rewinddir
win32_closedir
win32_longpath
+ win32_ansipath
win32_os_id
win32_getpid
win32_crypt
}
}
elsif ($PLATFORM eq 'os2') {
+ my (%mapped, @missing);
open MAP, 'miniperl.map' or die 'Cannot read miniperl.map';
/^\s*[\da-f:]+\s+(\w+)/i and $mapped{$1}++ foreach <MAP>;
close MAP or die 'Cannot close miniperl.map';
try_symbol($symbol);
}
+try_symbol("init_Win32CORE") if $static_ext =~ /\bWin32CORE\b/;
+
# Now all symbols should be defined because
# next we are going to output them.