This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Ignore another editor droppink
[perl5.git] / makedef.pl
CommitLineData
3df97b6d 1#./perl -w
549a6b10
JH
2#
3# Create the export list for perl.
4#
86593e8d 5# Needed by WIN32 and OS/2 for creating perl.dll,
60fae896 6# and by AIX for creating libperl.a when -Duseshrplib is in effect,
93ea32b8 7# and by VMS for creating perlshr.exe.
549a6b10 8#
3523994b
DM
9# Reads from information stored in
10#
208d7614 11# %Config::Config (ie config.sh)
3523994b 12# config.h
3523994b
DM
13# global.sym
14# globvar.sym
15# intrpvar.h
3523994b
DM
16# miniperl.map (on OS/2)
17# perl5.def (on OS/2; this is the old version of the file being made)
18# perlio.sym
19# perlvars.h
20#
bf09e1bd 21# plus long lists of function names hard-coded directly in this script.
3523994b
DM
22#
23# Writes the result to STDOUT.
24#
25# Normally this script is invoked from a makefile (e.g. win32/Makefile),
26# which redirects STDOUT to a suitable file, such as:
27#
28# perl5.def OS/2
29# perldll.def Windows
30# perl.exp AIX
31# perl.imp NetWare
93ea32b8 32# makedef.lis VMS
c560d966
RGS
33
34BEGIN { unshift @INC, "lib" }
9d6c7f2e 35use Config;
3df97b6d 36use strict;
0a753a76 37
0dc3711c 38my %ARGS = (CCTYPE => 'MSVC');
3df97b6d 39
d6035849 40my %define;
910dfcc8 41
c1b34f5f
NC
42sub process_cc_flags {
43 foreach (map {split /\s+/, $_} @_) {
44 $define{$1} = $2 // 1 if /^-D(\w+)(?:=(.+))?/;
45 }
46}
47
7766f137
GS
48while (@ARGV) {
49 my $flag = shift;
c1b34f5f
NC
50 if ($flag =~ /^(?:CC_FLAGS=)?(-D\w.*)/) {
51 process_cc_flags($1);
0dc3711c
NC
52 } elsif ($flag =~ /^(CCTYPE|FILETYPE|PLATFORM|TARG_DIR)=(.+)$/) {
53 $ARGS{$1} = $2;
5c728af0 54 }
7766f137 55}
d55594ae 56
29200a82
NC
57{
58 my @PLATFORM = qw(aix win32 wince os2 netware vms);
59 my %PLATFORM;
60 @PLATFORM{@PLATFORM} = ();
549a6b10 61
29200a82
NC
62 die "PLATFORM undefined, must be one of: @PLATFORM\n"
63 unless defined $ARGS{PLATFORM};
64 die "PLATFORM must be one of: @PLATFORM\n"
65 unless exists $PLATFORM{$ARGS{PLATFORM}};
66}
549a6b10 67
208d7614
NC
68# Is the following guard strictly necessary? Added during refactoring
69# to keep the same behaviour when merging other code into here.
c1b34f5f 70process_cc_flags(@Config{qw(ccflags optimize)})
0dc3711c
NC
71 if $ARGS{PLATFORM} ne 'win32' && $ARGS{PLATFORM} ne 'wince'
72 && $ARGS{PLATFORM} ne 'netware';
208d7614 73
c960bcfd
NC
74# Add the compile-time options that miniperl was built with to %define.
75# On Win32 these are not the same options as perl itself will be built
76# with since miniperl is built with a canned config (one of the win32/
77# config_H.*) and none of the BUILDOPT's that are set in the makefiles,
78# but they do include some #define's that are hard-coded in various
79# source files and header files and don't include any BUILDOPT's that
80# the user might have chosen to disable because the canned configs are
81# minimal configs that don't include any of those options.
82
83my @options = sort(Config::bincompat_options(), Config::non_bincompat_options());
84print STDERR "Options: (@options)\n";
85$define{$_} = 1 foreach @options;
17bdc114 86
c6261f3b
JH
87my %exportperlmalloc =
88 (
89 Perl_malloc => "malloc",
90 Perl_mfree => "free",
91 Perl_realloc => "realloc",
92 Perl_calloc => "calloc",
93 );
94
0dc3711c 95my $exportperlmalloc = $ARGS{PLATFORM} eq 'os2';
c6261f3b 96
549a6b10 97my $config_h = "config.h";
549a6b10
JH
98my $intrpvar_h = "intrpvar.h";
99my $perlvars_h = "perlvars.h";
100my $global_sym = "global.sym";
549a6b10
JH
101my $globvar_sym = "globvar.sym";
102my $perlio_sym = "perlio.sym";
103
0dc3711c
NC
104if (exists $ARGS{TARG_DIR}) {
105 s/^/$ARGS{TARG_DIR}/
106 foreach $intrpvar_h, $perlvars_h, $global_sym, $globvar_sym, $perlio_sym;
107}
549a6b10
JH
108
109open(CFG,$config_h) || die "Cannot open $config_h: $!\n";
7766f137 110while (<CFG>) {
1f0041ed 111 $define{$1} = 1 if /^\s*\#\s*define\s+(MYMALLOC|MULTIPLICITY
918a61c7 112 |SPRINTF_RETURNS_STRLEN
1f0041ed 113 |(?:PERL|USE|HAS)_\w+)\b/x;
7766f137 114}
bbc8f9de
NIS
115close(CFG);
116
18c4b137
JH
117# perl.h logic duplication begins
118
894ccb8c
JH
119if ($define{PERL_IMPLICIT_SYS}) {
120 $define{PL_OP_SLAB_ALLOC} = 1;
121}
ac6bedea 122
18c4b137 123if ($define{USE_ITHREADS}) {
acfe0abc 124 if (!$define{MULTIPLICITY}) {
18c4b137
JH
125 $define{MULTIPLICITY} = 1;
126 }
127}
128
129$define{PERL_IMPLICIT_CONTEXT} ||=
130 $define{USE_ITHREADS} ||
18c4b137
JH
131 $define{MULTIPLICITY} ;
132
0dc3711c 133if ($define{USE_ITHREADS} && $ARGS{PLATFORM} ne 'win32' && $^O ne 'darwin') {
10bc17b6
JH
134 $define{USE_REENTRANT_API} = 1;
135}
136
18c4b137
JH
137# perl.h logic duplication ends
138
dcddf0a3
SH
139print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n";
140
d6035849
NC
141my $sym_ord = 0;
142my %ordinal;
143
0dc3711c 144if ($ARGS{PLATFORM} eq 'os2') {
52e4c282
IZ
145 if (open my $fh, '<', 'perl5.def') {
146 while (<$fh>) {
147 last if /^\s*EXPORTS\b/;
148 }
149 while (<$fh>) {
78232bc0 150 $ordinal{$1} = $2 if /^\s*"(\w+)"\s*(?:=\s*"\w+"\s*)?\@(\d+)\s*$/;
52e4c282
IZ
151 # This allows skipping ordinals which were used in older versions
152 $sym_ord = $1 if /^\s*;\s*LAST_ORDINAL\s*=\s*(\d+)\s*$/;
153 }
154 $sym_ord < $_ and $sym_ord = $_ for values %ordinal; # Take the max
155 }
2986a63f 156}
bbc8f9de 157
44c17813
NC
158my %skip;
159# All platforms export boot_DynaLoader unconditionally.
160my %export = ( boot_DynaLoader => 1 );
161
430d15ed
NC
162sub try_symbols {
163 foreach my $symbol (@_) {
44c17813
NC
164 ++$export{$symbol} unless exists $skip{$symbol};
165 }
166}
167
168sub readvar {
169 # $hash is the hash that we're adding to. For one of our callers, it will
170 # actually be the skip hash but that doesn't affect the intent of what
171 # we're doing, as in that case we skip adding something to the skip hash
172 # for the second time.
173
174 my ($file, $hash, $proc) = @_;
175 open my $vars, '<', $file or die die "Cannot open $file: $!\n";
176
177 while (<$vars>) {
178 # All symbols have a Perl_ prefix because that's what embed.h sticks
179 # in front of them. The A?I?S?C? is strictly speaking wrong.
180 next unless /\bPERLVAR(A?I?S?C?)\(([IGT])(\w+)/;
181
182 my $var = "PL_$3";
183 my $symbol = $proc ? &$proc($1,$2,$3) : $var;
184 ++$hash->{$symbol} unless exists $skip{$var};
51371543 185 }
22239a37
NIS
186}
187
0dc3711c 188if ($ARGS{PLATFORM} ne 'os2') {
e7c4906b 189 ++$skip{$_} foreach qw(
f2921293
NC
190 PL_cryptseen
191 PL_opsave
192 Perl_GetVars
193 Perl_dump_fds
194 Perl_my_bcopy
195 Perl_my_bzero
196 Perl_my_chsize
197 Perl_my_htonl
198 Perl_my_memcmp
199 Perl_my_memset
200 Perl_my_ntohl
201 Perl_my_swap
e7c4906b 202 );
0dc3711c 203 if ($ARGS{PLATFORM} eq 'vms') {
e7c4906b 204 ++$skip{PL_statusvalue_posix};
c36317f0 205 } else {
e7c4906b 206 ++$skip{PL_statusvalue_vms};
0dc3711c 207 if ($ARGS{PLATFORM} ne 'aix') {
e7c4906b 208 ++$skip{$_} foreach qw(
c36317f0
NC
209 PL_DBcv
210 PL_generation
211 PL_lastgotoprobe
212 PL_modcount
213 PL_timesbuf
214 main
e7c4906b 215 );
c36317f0
NC
216 }
217 }
f2921293
NC
218}
219
0dc3711c 220if ($ARGS{PLATFORM} ne 'vms') {
c36317f0 221 # VMS does its own thing for these symbols.
e7c4906b 222 ++$skip{$_} foreach qw(
c36317f0
NC
223 PL_sig_handlers_initted
224 PL_sig_ignoring
225 PL_sig_defaulting
e7c4906b 226 );
0dc3711c 227 if ($ARGS{PLATFORM} ne 'win32') {
e7c4906b 228 ++$skip{$_} foreach qw(
c36317f0
NC
229 Perl_do_spawn
230 Perl_do_spawn_nowait
231 Perl_do_aspawn
e7c4906b 232 );
c36317f0 233 }
7766f137 234}
c36317f0 235
df39eaa8 236unless ($define{UNLINK_ALL_VERSIONS}) {
e7c4906b 237 ++$skip{Perl_unlnk};
93ea32b8 238}
3cfae81b 239
7766f137 240unless ($define{'DEBUGGING'}) {
e7c4906b 241 ++$skip{$_} foreach qw(
7766f137
GS
242 Perl_debop
243 Perl_debprofdump
244 Perl_debstack
245 Perl_debstackptrs
5cbf7fcf 246 Perl_pad_sv
b65222da 247 Perl_pad_setsv
943795c2 248 Perl_hv_assert
7766f137
GS
249 PL_block_type
250 PL_watchaddr
251 PL_watchok
e0cde265 252 PL_watch_pvx
e7c4906b 253 );
7766f137
GS
254}
255
256if ($define{'PERL_IMPLICIT_SYS'}) {
e7c4906b 257 ++$skip{$_} foreach qw(
7766f137
GS
258 Perl_my_popen
259 Perl_my_pclose
e7c4906b 260 );
2c84c919
NC
261 ++$export{$_} foreach qw(perl_get_host_info perl_alloc_override);
262 ++$export{perl_clone_host} if $define{USE_ITHREADS};
7766f137
GS
263}
264else {
e7c4906b 265 ++$skip{$_} foreach qw(
7766f137
GS
266 PL_Mem
267 PL_MemShared
268 PL_MemParse
269 PL_Env
270 PL_StdIO
271 PL_LIO
272 PL_Dir
273 PL_Sock
274 PL_Proc
2c84c919
NC
275 perl_alloc_using
276 perl_clone_using
e7c4906b 277 );
7766f137
GS
278}
279
f8c7b90f 280unless ($define{'PERL_OLD_COPY_ON_WRITE'}) {
e7c4906b 281 ++$skip{Perl_sv_setsv_cow};
0190f6ec
AT
282}
283
5bcb3f6c 284unless ($define{'USE_REENTRANT_API'}) {
e7c4906b 285 ++$skip{PL_reentrant_buffer};
5bcb3f6c
NIS
286}
287
7766f137 288if ($define{'MYMALLOC'}) {
430d15ed 289 try_symbols(qw(
7766f137 290 Perl_dump_mstats
827e134a 291 Perl_get_mstats
9c130f5b
NIS
292 Perl_strdup
293 Perl_putenv
6af660ee
IZ
294 MallocCfg_ptr
295 MallocCfgP_ptr
430d15ed 296 ));
3cf3941e
NC
297 unless ($define{USE_ITHREADS}) {
298 ++$skip{PL_malloc_mutex}
80fc1a6e 299 }
51371543
GS
300}
301else {
e7c4906b 302 ++$skip{$_} foreach qw(
7766f137
GS
303 PL_malloc_mutex
304 Perl_dump_mstats
6ecd3fcb 305 Perl_get_mstats
6af660ee
IZ
306 MallocCfg_ptr
307 MallocCfgP_ptr
e7c4906b 308 );
7766f137
GS
309}
310
8852afe9 311if ($define{'PERL_USE_SAFE_PUTENV'}) {
e7c4906b 312 ++$skip{PL_use_safe_putenv};
8852afe9
MB
313}
314
3db8f154 315unless ($define{'USE_ITHREADS'}) {
e7c4906b 316 ++$skip{PL_thr_key};
f433d095
GS
317}
318
3db8f154 319# USE_5005THREADS symbols. Kept as reference for easier removal
e7c4906b 320++$skip{$_} foreach qw(
7766f137
GS
321 PL_sv_mutex
322 PL_strtab_mutex
323 PL_svref_mutex
7766f137
GS
324 PL_cred_mutex
325 PL_eval_mutex
6940069f
GS
326 PL_fdpid_mutex
327 PL_sv_lock_mutex
7766f137
GS
328 PL_eval_cond
329 PL_eval_owner
330 PL_threads_mutex
331 PL_nthreads
332 PL_nthreads_cond
333 PL_threadnum
334 PL_threadsv_names
335 PL_thrsv
336 PL_vtbl_mutex
7766f137
GS
337 Perl_condpair_magic
338 Perl_new_struct_thread
339 Perl_per_thread_magicals
340 Perl_thread_create
341 Perl_find_threadsv
342 Perl_unlock_condpair
343 Perl_magic_mutexfree
4755096e 344 Perl_sv_lock
e7c4906b 345 );
7766f137
GS
346
347unless ($define{'USE_ITHREADS'}) {
e7c4906b 348 ++$skip{$_} foreach qw(
534825c4 349 PL_op_mutex
7e95b20d
JH
350 PL_regex_pad
351 PL_regex_padav
e2975953 352 PL_dollarzero_mutex
b60bf3b9 353 PL_hints_mutex
8703a9a4 354 PL_my_ctx_mutex
f1791e53 355 PL_perlio_mutex
7c425e3c
NC
356 Perl_clone_params_del
357 Perl_clone_params_new
b0bb49b6 358 Perl_parser_dup
7766f137
GS
359 Perl_dirp_dup
360 Perl_cx_dup
361 Perl_si_dup
362 Perl_any_dup
363 Perl_ss_dup
364 Perl_fp_dup
365 Perl_gp_dup
366 Perl_he_dup
367 Perl_mg_dup
7f605079 368 Perl_re_dup_guts
7766f137 369 Perl_sv_dup
7c425e3c 370 Perl_sv_dup_inc
aeef2723 371 Perl_rvpv_dup
88daff13 372 Perl_hek_dup
7766f137 373 Perl_sys_intern_dup
7766f137
GS
374 perl_clone
375 perl_clone_using
dc1061dc 376 Perl_stashpv_hvname_match
1fa600a7 377 Perl_regdupe_internal
392d04bb 378 Perl_newPADOP
e7c4906b 379 );
7766f137
GS
380}
381
382unless ($define{'PERL_IMPLICIT_CONTEXT'}) {
e7c4906b 383 ++$skip{$_} foreach qw(
1f9ecdc6
SH
384 PL_my_cxt_index
385 PL_my_cxt_list
386 PL_my_cxt_size
ecb9cc66 387 PL_my_cxt_keys
7766f137
GS
388 Perl_croak_nocontext
389 Perl_die_nocontext
390 Perl_deb_nocontext
391 Perl_form_nocontext
e0f4245d 392 Perl_load_module_nocontext
7766f137
GS
393 Perl_mess_nocontext
394 Perl_warn_nocontext
395 Perl_warner_nocontext
396 Perl_newSVpvf_nocontext
397 Perl_sv_catpvf_nocontext
398 Perl_sv_setpvf_nocontext
399 Perl_sv_catpvf_mg_nocontext
400 Perl_sv_setpvf_mg_nocontext
484eff17 401 Perl_my_cxt_init
ecb9cc66 402 Perl_my_cxt_index
e7c4906b 403 );
7766f137
GS
404}
405
aadb217d 406unless ($define{'PL_OP_SLAB_ALLOC'}) {
e7c4906b 407 ++$skip{$_} foreach qw(
aadb217d
JH
408 PL_OpPtr
409 PL_OpSlab
410 PL_OpSpace
411 Perl_Slab_Alloc
412 Perl_Slab_Free
e7c4906b 413 );
8d2d9fd7
RGS
414}
415
416unless ($define{'PERL_DEBUG_READONLY_OPS'}) {
e7c4906b 417 ++$skip{$_} foreach qw(
8d2d9fd7
RGS
418 PL_slab_count
419 PL_slabs
e7c4906b 420 );
aadb217d
JH
421}
422
423unless ($define{'THREADS_HAVE_PIDS'}) {
e7c4906b 424 ++$skip{PL_ppid};
e0cde265
SH
425}
426
aadb217d 427unless ($define{'PERL_NEED_APPCTX'}) {
e7c4906b 428 ++$skip{PL_appctx};
e0cde265
SH
429}
430
aadb217d 431unless ($define{'PERL_NEED_TIMESBASE'}) {
e7c4906b 432 ++$skip{PL_timesbase};
e0cde265
SH
433}
434
dfc72f41 435unless ($define{'DEBUG_LEAKING_SCALARS'}) {
e7c4906b 436 ++$skip{PL_sv_serial};
dfc72f41
NC
437}
438
808e2276 439unless ($define{'DEBUG_LEAKING_SCALARS_FORK_DUMP'}) {
e7c4906b 440 ++$skip{PL_dumper_fd};
808e2276 441}
e7c4906b 442
c69033f2 443unless ($define{'PERL_DONT_CREATE_GVSV'}) {
e7c4906b 444 ++$skip{Perl_gv_SVadd};
c69033f2 445}
e7c4906b 446
ce582cee 447if ($define{'SPRINTF_RETURNS_STRLEN'}) {
e7c4906b 448 ++$skip{Perl_my_sprintf};
ce582cee 449}
e7c4906b 450
ca0c25f6 451unless ($define{'PERL_USES_PL_PIDSTATUS'}) {
e7c4906b 452 ++$skip{PL_pidstatus};
ca0c25f6 453}
808e2276 454
02ca4724 455unless ($define{'PERL_TRACK_MEMPOOL'}) {
e7c4906b 456 ++$skip{PL_memory_debug_header};
02ca4724
SP
457}
458
2cea2a29 459unless ($define{PERL_MAD}) {
e7c4906b 460 ++$skip{$_} foreach qw(
e3e31fab
SH
461 PL_madskills
462 PL_xmlfp
e7c4906b 463 );
e3e31fab
SH
464}
465
2a5adacc 466unless ($define{'MULTIPLICITY'}) {
e7c4906b 467 ++$skip{$_} foreach qw(
01523419 468 PL_interp_size
9e08d3a4 469 PL_interp_size_5_16_0
e7c4906b 470 );
2a5adacc
JD
471}
472
473unless ($define{'PERL_GLOBAL_STRUCT'}) {
e7c4906b 474 ++$skip{PL_global_struct_size};
2a5adacc
JD
475}
476
436dbe32 477unless ($define{'PERL_GLOBAL_STRUCT_PRIVATE'}) {
e7c4906b 478 ++$skip{$_} foreach qw(
436dbe32
SH
479 PL_my_cxt_keys
480 Perl_my_cxt_index
e7c4906b 481 );
436dbe32
SH
482}
483
bd1ae5d2 484unless ($define{HAS_MMAP}) {
e7c4906b 485 ++$skip{PL_mmap_page_size};
ac6bedea
JH
486}
487
bd1ae5d2 488if ($define{HAS_SIGACTION}) {
e7c4906b 489 ++$skip{PL_sig_trapped};
662667f1
CB
490
491 if ($ARGS{PLATFORM} eq 'vms') {
492 # FAKE_PERSISTENT_SIGNAL_HANDLERS defined as !defined(HAS_SIGACTION)
493 ++$skip{PL_sig_ignoring};
494 }
d97afc04
AT
495}
496
bdcba273 497unless ($define{USE_LOCALE_COLLATE}) {
e7c4906b 498 ++$skip{$_} foreach qw(
bdcba273
NC
499 PL_collation_ix
500 PL_collation_name
501 PL_collation_standard
502 PL_collxfrm_base
503 PL_collxfrm_mult
504 Perl_sv_collxfrm
505 Perl_sv_collxfrm_flags
e7c4906b 506 );
bdcba273
NC
507}
508
1f1ade4f 509unless ($define{USE_LOCALE_NUMERIC}) {
e7c4906b 510 ++$skip{$_} foreach qw(
1f1ade4f
NC
511 PL_numeric_local
512 PL_numeric_name
513 PL_numeric_radix_sv
514 PL_numeric_standard
e7c4906b 515 );
1f1ade4f
NC
516}
517
1ab20eaa 518unless ($define{HAVE_INTERP_INTERN}) {
e7c4906b 519 ++$skip{$_} foreach qw(
1ab20eaa
NC
520 Perl_sys_intern_clear
521 Perl_sys_intern_dup
522 Perl_sys_intern_init
523 PL_sys_intern
e7c4906b 524 );
1ab20eaa
NC
525}
526
47e4ddfc 527if ($define{HAS_SIGNBIT}) {
e7c4906b 528 ++$skip{Perl_signbit};
47e4ddfc
NC
529}
530
7766f137 531if ($define{'PERL_GLOBAL_STRUCT'}) {
44c17813 532 readvar($perlvars_h, \%skip);
944921d3 533 ++$export{Perl_GetVars};
0dc3711c 534 try_symbols(qw(PL_Vars PL_VarsPtr)) unless $ARGS{CCTYPE} eq 'GCC';
aadb217d 535} else {
e7c4906b 536 ++$skip{$_} foreach qw(Perl_init_global_struct Perl_free_global_struct);
7766f137 537}
36c15d3f 538
22c35a8c
GS
539# functions from *.sym files
540
7697f15a 541my @syms = ($global_sym, $globvar_sym);
549a6b10 542
d892637e
NIS
543# Symbols that are the public face of the PerlIO layers implementation
544# These are in _addition to_ the public face of the abstraction
545# and need to be exported to allow XS modules to implement layers
9df9a5cd 546my @layer_syms = qw(
db76e01e
JH
547 PerlIOBase_binmode
548 PerlIOBase_clearerr
549 PerlIOBase_close
550 PerlIOBase_dup
551 PerlIOBase_eof
552 PerlIOBase_error
553 PerlIOBase_fileno
554 PerlIOBase_noop_fail
555 PerlIOBase_noop_ok
556 PerlIOBase_popped
7e700b9a 557 PerlIOBase_pushed
db76e01e
JH
558 PerlIOBase_read
559 PerlIOBase_setlinebuf
560 PerlIOBase_unread
561 PerlIOBuf_bufsiz
562 PerlIOBuf_close
563 PerlIOBuf_dup
564 PerlIOBuf_fill
565 PerlIOBuf_flush
566 PerlIOBuf_get_base
567 PerlIOBuf_get_cnt
568 PerlIOBuf_get_ptr
569 PerlIOBuf_open
570 PerlIOBuf_popped
571 PerlIOBuf_pushed
572 PerlIOBuf_read
573 PerlIOBuf_seek
574 PerlIOBuf_set_ptrcnt
575 PerlIOBuf_tell
576 PerlIOBuf_unread
577 PerlIOBuf_write
578 PerlIO_allocate
8ffeedc3 579 PerlIO_apply_layera
db76e01e
JH
580 PerlIO_apply_layers
581 PerlIO_arg_fetch
582 PerlIO_debug
583 PerlIO_define_layer
4dcdb34a 584 PerlIO_find_layer
51d05609 585 PerlIO_isutf8
db76e01e 586 PerlIO_layer_fetch
4dcdb34a 587 PerlIO_list_alloc
db76e01e
JH
588 PerlIO_list_free
589 PerlIO_modestr
590 PerlIO_parse_layers
591 PerlIO_pending
592 PerlIO_perlio
593 PerlIO_pop
594 PerlIO_push
595 PerlIO_sv_dup
596 Perl_PerlIO_clearerr
597 Perl_PerlIO_close
188f0c84 598 Perl_PerlIO_context_layers
db76e01e
JH
599 Perl_PerlIO_eof
600 Perl_PerlIO_error
601 Perl_PerlIO_fileno
602 Perl_PerlIO_fill
603 Perl_PerlIO_flush
604 Perl_PerlIO_get_base
605 Perl_PerlIO_get_bufsiz
606 Perl_PerlIO_get_cnt
607 Perl_PerlIO_get_ptr
608 Perl_PerlIO_read
609 Perl_PerlIO_seek
610 Perl_PerlIO_set_cnt
611 Perl_PerlIO_set_ptrcnt
612 Perl_PerlIO_setlinebuf
613 Perl_PerlIO_stderr
614 Perl_PerlIO_stdin
615 Perl_PerlIO_stdout
616 Perl_PerlIO_tell
617 Perl_PerlIO_unread
618 Perl_PerlIO_write
9df9a5cd 619);
0dc3711c 620if ($ARGS{PLATFORM} eq 'netware') {
a5564b91
JH
621 push(@layer_syms,'PL_def_layerlist','PL_known_layers','PL_perlio');
622}
d892637e 623
7766f137 624if ($define{'USE_PERLIO'}) {
d892637e
NIS
625 # Export the symols that make up the PerlIO abstraction, regardless
626 # of its implementation - read from a file
084592ab 627 push @syms, $perlio_sym;
d892637e
NIS
628
629 # This part is then dependent on how the abstraction is implemented
084592ab 630 if ($define{'USE_SFIO'}) {
d892637e 631 # Old legacy non-stdio "PerlIO"
e7c4906b
NC
632 ++$skip{$_} foreach @layer_syms;
633 ++$skip{perlsio_binmode};
084592ab 634 # SFIO defines most of the PerlIO routines as macros
d892637e
NIS
635 # So undo most of what $perlio_sym has just done - d'oh !
636 # Perhaps it would be better to list the ones which do exist
637 # And emit them
e7c4906b 638 ++$skip{$_} foreach qw(
084592ab
CN
639 PerlIO_canset_cnt
640 PerlIO_clearerr
641 PerlIO_close
642 PerlIO_eof
643 PerlIO_error
644 PerlIO_exportFILE
645 PerlIO_fast_gets
646 PerlIO_fdopen
647 PerlIO_fileno
648 PerlIO_findFILE
649 PerlIO_flush
650 PerlIO_get_base
651 PerlIO_get_bufsiz
652 PerlIO_get_cnt
653 PerlIO_get_ptr
654 PerlIO_getc
655 PerlIO_getname
656 PerlIO_has_base
657 PerlIO_has_cntptr
658 PerlIO_importFILE
659 PerlIO_open
660 PerlIO_printf
661 PerlIO_putc
662 PerlIO_puts
663 PerlIO_read
664 PerlIO_releaseFILE
665 PerlIO_reopen
666 PerlIO_rewind
667 PerlIO_seek
668 PerlIO_set_cnt
669 PerlIO_set_ptrcnt
670 PerlIO_setlinebuf
671 PerlIO_sprintf
672 PerlIO_stderr
673 PerlIO_stdin
674 PerlIO_stdout
675 PerlIO_stdoutf
676 PerlIO_tell
677 PerlIO_ungetc
678 PerlIO_vprintf
679 PerlIO_write
bcdb689b
JH
680 PerlIO_perlio
681 Perl_PerlIO_clearerr
682 Perl_PerlIO_close
683 Perl_PerlIO_eof
684 Perl_PerlIO_error
685 Perl_PerlIO_fileno
686 Perl_PerlIO_fill
687 Perl_PerlIO_flush
688 Perl_PerlIO_get_base
689 Perl_PerlIO_get_bufsiz
690 Perl_PerlIO_get_cnt
691 Perl_PerlIO_get_ptr
692 Perl_PerlIO_read
693 Perl_PerlIO_seek
694 Perl_PerlIO_set_cnt
695 Perl_PerlIO_set_ptrcnt
696 Perl_PerlIO_setlinebuf
697 Perl_PerlIO_stderr
698 Perl_PerlIO_stdin
699 Perl_PerlIO_stdout
700 Perl_PerlIO_tell
701 Perl_PerlIO_unread
702 Perl_PerlIO_write
ffcf5686
JH
703 PL_def_layerlist
704 PL_known_layers
705 PL_perlio
e7c4906b 706 );
084592ab 707 }
d892637e
NIS
708 else {
709 # PerlIO with layers - export implementation
430d15ed 710 try_symbols(@layer_syms, 'perlsio_binmode');
d892637e 711 }
5138f914 712} else {
d892637e
NIS
713 # -Uuseperlio
714 # Skip the PerlIO layer symbols - although
aadb217d 715 # nothing should have exported them anyway.
e7c4906b
NC
716 ++$skip{$_} foreach @layer_syms;
717 ++$skip{$_} foreach qw(
a6272963
SH
718 perlsio_binmode
719 PL_def_layerlist
720 PL_known_layers
721 PL_perlio
722 PL_perlio_debug_fd
723 PL_perlio_fd_refcnt
724 PL_perlio_fd_refcnt_size
01cace46 725 PL_perlio_mutex
e7c4906b 726 );
1e8a8f59 727
d892637e
NIS
728 # Also do NOT add abstraction symbols from $perlio_sym
729 # abstraction is done as #define to stdio
bf09e1bd 730 # Remaining remnants that _may_ be functions are handled below.
9df9a5cd 731}
7766f137 732
71afeaec
NC
733###############################################################################
734
735# At this point all skip lists should be completed, as we are about to test
736# many symbols against them.
737
7766f137 738for my $syms (@syms) {
a6587d2d
NC
739 open my $global, '<', $syms or die "failed to open $syms: $!\n";
740 # Functions already have a Perl_ prefix
741 # Variables need a PL_ prefix
742 my $prefix = $syms =~ /var\.sym$/i ? 'PL_' : '';
743 while (<$global>) {
744 next unless /^([A-Za-z].*)/;
745 my $symbol = "$prefix$1";
944921d3 746 ++$export{$symbol} unless exists $skip{$symbol};
7766f137 747 }
7766f137 748}
0a753a76 749
22c35a8c 750# variables
0a753a76 751
87b9e160 752if ($define{'MULTIPLICITY'} && $define{PERL_GLOBAL_STRUCT}) {
44c17813 753 readvar($perlvars_h, \%export, sub { "Perl_" . $_[1] . $_[2] . "_ptr" });
1acb48c9 754 # XXX AIX seems to want the perlvars.h symbols, for some reason
0dc3711c 755 if ($ARGS{PLATFORM} eq 'aix' or $ARGS{PLATFORM} eq 'os2') { # OS/2 needs PL_thr_key
44c17813 756 readvar($perlvars_h, \%export);
51371543
GS
757 }
758}
759else {
760 unless ($define{'PERL_GLOBAL_STRUCT'}) {
44c17813 761 readvar($perlvars_h, \%export);
9df9a5cd 762 }
87b9e160 763 unless ($define{MULTIPLICITY}) {
44c17813 764 readvar($intrpvar_h, \%export);
87b9e160 765 }
51371543 766}
0a753a76 767
bf09e1bd 768# Oddities from PerlIO
01cace46
NC
769# All have alternate implementations in perlio.c, so always exist.
770# Should they be considered to be part of the API?
430d15ed 771try_symbols(qw(
bf09e1bd
NC
772 PerlIO_binmode
773 PerlIO_getpos
774 PerlIO_init
775 PerlIO_setpos
776 PerlIO_sprintf
bf09e1bd
NC
777 PerlIO_tmpfile
778 PerlIO_vsprintf
430d15ed 779 ));
ac4c12e7 780
0dc3711c 781if ($ARGS{PLATFORM} eq 'win32') {
7a95c549 782 try_symbols(qw(
5581753c
NC
783 setgid
784 setuid
785 win32_free_childdir
786 win32_free_childenv
787 win32_get_childdir
788 win32_get_childenv
789 win32_spawnvp
7a95c549 790 ));
5581753c
NC
791}
792
0dc3711c 793if ($ARGS{PLATFORM} =~ /^win(?:32|ce)$/) {
7a95c549 794 try_symbols(qw(
7766f137 795 Perl_init_os_extras
c44d3fdb 796 Perl_thread_create
7766f137 797 Perl_win32_init
23f519f0 798 Perl_win32_term
7766f137 799 RunPerl
5290524f 800 win32_async_check
7766f137
GS
801 win32_errno
802 win32_environ
7766f137
GS
803 win32_abort
804 win32_fstat
805 win32_stat
806 win32_pipe
807 win32_popen
808 win32_pclose
809 win32_rename
810 win32_setmode
11bb82ff 811 win32_chsize
7766f137
GS
812 win32_lseek
813 win32_tell
814 win32_dup
815 win32_dup2
816 win32_open
817 win32_close
818 win32_eof
4342f4d6 819 win32_isatty
7766f137
GS
820 win32_read
821 win32_write
7766f137
GS
822 win32_mkdir
823 win32_rmdir
824 win32_chdir
825 win32_flock
826 win32_execv
827 win32_execvp
828 win32_htons
829 win32_ntohs
830 win32_htonl
831 win32_ntohl
832 win32_inet_addr
833 win32_inet_ntoa
834 win32_socket
835 win32_bind
836 win32_listen
837 win32_accept
838 win32_connect
839 win32_send
840 win32_sendto
841 win32_recv
842 win32_recvfrom
843 win32_shutdown
844 win32_closesocket
845 win32_ioctlsocket
846 win32_setsockopt
847 win32_getsockopt
848 win32_getpeername
849 win32_getsockname
850 win32_gethostname
851 win32_gethostbyname
852 win32_gethostbyaddr
853 win32_getprotobyname
854 win32_getprotobynumber
855 win32_getservbyname
856 win32_getservbyport
857 win32_select
858 win32_endhostent
859 win32_endnetent
860 win32_endprotoent
861 win32_endservent
862 win32_getnetent
863 win32_getnetbyname
864 win32_getnetbyaddr
865 win32_getprotoent
866 win32_getservent
867 win32_sethostent
868 win32_setnetent
869 win32_setprotoent
870 win32_setservent
871 win32_getenv
872 win32_putenv
873 win32_perror
7766f137
GS
874 win32_malloc
875 win32_calloc
876 win32_realloc
877 win32_free
878 win32_sleep
879 win32_times
880 win32_access
881 win32_alarm
882 win32_chmod
883 win32_open_osfhandle
884 win32_get_osfhandle
885 win32_ioctl
886 win32_link
887 win32_unlink
888 win32_utime
57ab3dfe 889 win32_gettimeofday
7766f137
GS
890 win32_uname
891 win32_wait
892 win32_waitpid
893 win32_kill
894 win32_str_os_error
895 win32_opendir
896 win32_readdir
897 win32_telldir
898 win32_seekdir
899 win32_rewinddir
900 win32_closedir
901 win32_longpath
aa2b96ec 902 win32_ansipath
7766f137
GS
903 win32_os_id
904 win32_getpid
905 win32_crypt
906 win32_dynaload
df3728a2 907 win32_clearenv
00b02797
JH
908 win32_stdin
909 win32_stdout
910 win32_stderr
911 win32_ferror
912 win32_feof
913 win32_strerror
914 win32_fprintf
915 win32_printf
916 win32_vfprintf
917 win32_vprintf
918 win32_fread
919 win32_fwrite
920 win32_fopen
921 win32_fdopen
922 win32_freopen
923 win32_fclose
924 win32_fputs
925 win32_fputc
926 win32_ungetc
927 win32_getc
928 win32_fileno
929 win32_clearerr
930 win32_fflush
931 win32_ftell
932 win32_fseek
933 win32_fgetpos
934 win32_fsetpos
935 win32_rewind
936 win32_tmpfile
937 win32_setbuf
938 win32_setvbuf
939 win32_flushall
940 win32_fcloseall
941 win32_fgets
942 win32_gets
943 win32_fgetc
944 win32_putc
945 win32_puts
946 win32_getchar
947 win32_putchar
7a95c549 948 ));
0dc3711c 949 if ($ARGS{CCTYPE} eq "BORLAND") {
7a95c549 950 try_symbols('_matherr');
3a00b83e 951 }
549a6b10 952}
0dc3711c 953elsif ($ARGS{PLATFORM} eq 'vms') {
71afeaec
NC
954 try_symbols(qw(
955 Perl_cando
956 Perl_cando_by_name
957 Perl_closedir
958 Perl_csighandler_init
959 Perl_do_rmdir
960 Perl_fileify_dirspec
961 Perl_fileify_dirspec_ts
962 Perl_fileify_dirspec_utf8
963 Perl_fileify_dirspec_utf8_ts
964 Perl_flex_fstat
965 Perl_flex_lstat
966 Perl_flex_stat
967 Perl_kill_file
968 Perl_my_chdir
969 Perl_my_chmod
970 Perl_my_crypt
971 Perl_my_endpwent
972 Perl_my_fclose
973 Perl_my_fdopen
974 Perl_my_fgetname
975 Perl_my_flush
976 Perl_my_fwrite
977 Perl_my_gconvert
978 Perl_my_getenv
979 Perl_my_getenv_len
980 Perl_my_getlogin
981 Perl_my_getpwnam
982 Perl_my_getpwuid
983 Perl_my_gmtime
984 Perl_my_kill
985 Perl_my_localtime
986 Perl_my_mkdir
987 Perl_my_sigaction
988 Perl_my_symlink
989 Perl_my_time
990 Perl_my_tmpfile
991 Perl_my_trnlnm
992 Perl_my_utime
993 Perl_my_waitpid
994 Perl_opendir
995 Perl_pathify_dirspec
996 Perl_pathify_dirspec_ts
997 Perl_pathify_dirspec_utf8
998 Perl_pathify_dirspec_utf8_ts
999 Perl_readdir
1000 Perl_readdir_r
1001 Perl_rename
1002 Perl_rmscopy
1003 Perl_rmsexpand
1004 Perl_rmsexpand_ts
1005 Perl_rmsexpand_utf8
1006 Perl_rmsexpand_utf8_ts
1007 Perl_seekdir
1008 Perl_sig_to_vmscondition
1009 Perl_telldir
1010 Perl_tounixpath
1011 Perl_tounixpath_ts
1012 Perl_tounixpath_utf8
1013 Perl_tounixpath_utf8_ts
1014 Perl_tounixspec
1015 Perl_tounixspec_ts
1016 Perl_tounixspec_utf8
1017 Perl_tounixspec_utf8_ts
1018 Perl_tovmspath
1019 Perl_tovmspath_ts
1020 Perl_tovmspath_utf8
1021 Perl_tovmspath_utf8_ts
1022 Perl_tovmsspec
1023 Perl_tovmsspec_ts
1024 Perl_tovmsspec_utf8
1025 Perl_tovmsspec_utf8_ts
1026 Perl_trim_unixpath
1027 Perl_vms_case_tolerant
1028 Perl_vms_do_aexec
1029 Perl_vms_do_exec
1030 Perl_vms_image_init
1031 Perl_vms_realpath
1032 Perl_vmssetenv
1033 Perl_vmssetuserlnm
1034 Perl_vmstrnenv
1035 PerlIO_openn
1036 ));
1037}
0dc3711c 1038elsif ($ARGS{PLATFORM} eq 'os2') {
71afeaec
NC
1039 try_symbols(qw(
1040 ctermid
1041 get_sysinfo
1042 Perl_OS2_init
1043 Perl_OS2_init3
1044 Perl_OS2_term
1045 OS2_Perl_data
1046 dlopen
1047 dlsym
1048 dlerror
1049 dlclose
1050 dup2
1051 dup
1052 my_tmpfile
1053 my_tmpnam
1054 my_flock
1055 my_rmdir
1056 my_mkdir
1057 my_getpwuid
1058 my_getpwnam
1059 my_getpwent
1060 my_setpwent
1061 my_endpwent
1062 fork_with_resources
1063 croak_with_os2error
1064 setgrent
1065 endgrent
1066 getgrent
1067 malloc_mutex
1068 threads_mutex
1069 nthreads
1070 nthreads_cond
1071 os2_cond_wait
1072 os2_stat
1073 os2_execname
1074 async_mssleep
1075 msCounter
1076 InfoTable
1077 pthread_join
1078 pthread_create
1079 pthread_detach
1080 XS_Cwd_change_drive
1081 XS_Cwd_current_drive
1082 XS_Cwd_extLibpath
1083 XS_Cwd_extLibpath_set
1084 XS_Cwd_sys_abspath
1085 XS_Cwd_sys_chdir
1086 XS_Cwd_sys_cwd
1087 XS_Cwd_sys_is_absolute
1088 XS_Cwd_sys_is_relative
1089 XS_Cwd_sys_is_rooted
1090 XS_DynaLoader_mod2fname
1091 XS_File__Copy_syscopy
1092 Perl_Register_MQ
1093 Perl_Deregister_MQ
1094 Perl_Serve_Messages
1095 Perl_Process_Messages
1096 init_PMWIN_entries
1097 PMWIN_entries
1098 Perl_hab_GET
1099 loadByOrdinal
1100 pExtFCN
1101 os2error
1102 ResetWinError
1103 CroakWinError
1104 PL_do_undump
1105 ));
3cfae81b 1106}
0dc3711c 1107elsif ($ARGS{PLATFORM} eq 'netware') {
7a95c549 1108 try_symbols(qw(
2986a63f
JH
1109 Perl_init_os_extras
1110 Perl_thread_create
1111 Perl_nw5_init
1112 RunPerl
1113 AllocStdPerl
1114 FreeStdPerl
1115 do_spawn2
1116 do_aspawn
1117 nw_uname
1118 nw_stdin
1119 nw_stdout
1120 nw_stderr
1121 nw_feof
1122 nw_ferror
1123 nw_fopen
1124 nw_fclose
1125 nw_clearerr
1126 nw_getc
1127 nw_fgets
1128 nw_fputc
1129 nw_fputs
1130 nw_fflush
1131 nw_ungetc
1132 nw_fileno
1133 nw_fdopen
1134 nw_freopen
1135 nw_fread
1136 nw_fwrite
1137 nw_setbuf
1138 nw_setvbuf
1139 nw_vfprintf
1140 nw_ftell
1141 nw_fseek
1142 nw_rewind
1143 nw_tmpfile
1144 nw_fgetpos
1145 nw_fsetpos
1146 nw_dup
1147 nw_access
1148 nw_chmod
1149 nw_chsize
1150 nw_close
1151 nw_dup2
1152 nw_flock
1153 nw_isatty
1154 nw_link
1155 nw_lseek
1156 nw_stat
1157 nw_mktemp
1158 nw_open
1159 nw_read
1160 nw_rename
1161 nw_setmode
1162 nw_unlink
1163 nw_utime
1164 nw_write
1165 nw_chdir
1166 nw_rmdir
1167 nw_closedir
1168 nw_opendir
1169 nw_readdir
1170 nw_rewinddir
1171 nw_seekdir
1172 nw_telldir
1173 nw_htonl
1174 nw_htons
1175 nw_ntohl
1176 nw_ntohs
1177 nw_accept
1178 nw_bind
1179 nw_connect
1180 nw_endhostent
1181 nw_endnetent
1182 nw_endprotoent
1183 nw_endservent
1184 nw_gethostbyaddr
1185 nw_gethostbyname
1186 nw_gethostent
1187 nw_gethostname
1188 nw_getnetbyaddr
1189 nw_getnetbyname
1190 nw_getnetent
1191 nw_getpeername
1192 nw_getprotobyname
1193 nw_getprotobynumber
1194 nw_getprotoent
1195 nw_getservbyname
1196 nw_getservbyport
1197 nw_getservent
1198 nw_getsockname
1199 nw_getsockopt
1200 nw_inet_addr
1201 nw_listen
1202 nw_socket
1203 nw_recv
1204 nw_recvfrom
1205 nw_select
1206 nw_send
1207 nw_sendto
1208 nw_sethostent
1209 nw_setnetent
1210 nw_setprotoent
1211 nw_setservent
3a0827a6 1212 nw_setsockopt
4d76e4b4 1213 nw_inet_ntoa
2986a63f
JH
1214 nw_shutdown
1215 nw_crypt
1216 nw_execvp
1217 nw_kill
1218 nw_Popen
1219 nw_Pclose
1220 nw_Pipe
1221 nw_times
1222 nw_waitpid
1223 nw_getpid
1224 nw_spawnvp
1225 nw_os_id
1226 nw_open_osfhandle
1227 nw_get_osfhandle
1228 nw_abort
1229 nw_sleep
1230 nw_wait
1231 nw_dynaload
1232 nw_strerror
1233 fnFpSetMode
1234 fnInsertHashListAddrs
1235 fnGetHashListAddrs
1236 Perl_deb
011f1a1a
JH
1237 Perl_sv_setsv
1238 Perl_sv_catsv
1239 Perl_sv_catpvn
1240 Perl_sv_2pv
f355267c
JH
1241 nw_freeenviron
1242 Remove_Thread_Ctx
7a95c549 1243 ));
2986a63f 1244}
22239a37 1245
9661ac31
NC
1246# When added this code was only run for Win32 and WinCE
1247# Currently only Win32 links static extensions into the shared library.
1248# The WinCE makefile doesn't appear to support static extensions, so this code
1249# can't have any effect there.
1250# The NetWare Makefile doesn't support static extensions (and hardcodes the
1251# list of dynamic extensions, and the rules to build them)
1252# For *nix (and presumably OS/2) with a shared libperl, Makefile.SH compiles
1253# static extensions with -fPIC, but links them to perl, not libperl.so
1254# The VMS build scripts don't yet implement static extensions at all.
1255
0dc3711c 1256if ($ARGS{PLATFORM} =~ /^win(?:32|ce)$/) {
9661ac31 1257 # records of type boot_module for statically linked modules (except Dynaloader)
c051ff4c 1258 my $static_ext = $Config{static_ext} // "";
9661ac31
NC
1259 $static_ext =~ s/\//__/g;
1260 $static_ext =~ s/\bDynaLoader\b//;
1261 try_symbols(map {"boot_$_"} grep {/\S/} split /\s+/, $static_ext);
1262 try_symbols("init_Win32CORE") if $static_ext =~ /\bWin32CORE\b/;
1263}
9fb265f7 1264
0dc3711c 1265if ($ARGS{PLATFORM} eq 'os2') {
71afeaec
NC
1266 my (%mapped, @missing);
1267 open MAP, 'miniperl.map' or die 'Cannot read miniperl.map';
1268 /^\s*[\da-f:]+\s+(\w+)/i and $mapped{$1}++ foreach <MAP>;
1269 close MAP or die 'Cannot close miniperl.map';
1270
1271 @missing = grep { !exists $mapped{$_} }
1272 keys %export;
1273 @missing = grep { !exists $exportperlmalloc{$_} } @missing;
1274 delete $export{$_} foreach @missing;
1275}
1276
d6035849
NC
1277###############################################################################
1278
1279# Now all symbols should be defined because next we are going to output them.
1280
1281# Start with platform specific headers:
1282
0dc3711c 1283if ($ARGS{PLATFORM} =~ /^win(?:32|ce)$/) {
d6035849
NC
1284 (my $dll = ($define{PERL_DLL} || "perl515")) =~ s/\.dll$//i;
1285 print "LIBRARY $dll\n";
1286 # The DESCRIPTION module definition file statement is not supported
1287 # by VC7 onwards.
0dc3711c 1288 if ($ARGS{CCTYPE} =~ /^(?:MSVC60|GCC|BORLAND)$/) {
d6035849
NC
1289 print "DESCRIPTION 'Perl interpreter'\n";
1290 }
1291 print "EXPORTS\n";
1292}
0dc3711c 1293elsif ($ARGS{PLATFORM} eq 'os2') {
d6035849 1294 (my $v = $]) =~ s/(\d\.\d\d\d)(\d\d)$/$1_$2/;
c051ff4c 1295 $v .= '-thread' if $Config{archname} =~ /-thread/;
d6035849 1296 (my $dll = $define{PERL_DLL}) =~ s/\.dll$//i;
c051ff4c
NC
1297 $v .= "\@$Config{perl_patchlevel}" if $Config{perl_patchlevel};
1298 my $d = "DESCRIPTION '\@#perl5-porters\@perl.org:$v#\@ Perl interpreter, configured as $Config{config_args}'";
d6035849
NC
1299 $d = substr($d, 0, 249) . "...'" if length $d > 253;
1300 print <<"---EOP---";
1301LIBRARY '$dll' INITINSTANCE TERMINSTANCE
1302$d
1303STACKSIZE 32768
1304CODE LOADONCALL
1305DATA LOADONCALL NONSHARED MULTIPLE
1306EXPORTS
1307---EOP---
1308}
0dc3711c 1309elsif ($ARGS{PLATFORM} eq 'aix') {
d6035849
NC
1310 my $OSVER = `uname -v`;
1311 chop $OSVER;
1312 my $OSREL = `uname -r`;
1313 chop $OSREL;
1314 if ($OSVER > 4 || ($OSVER == 4 && $OSREL >= 3)) {
1315 print "#! ..\n";
1316 } else {
1317 print "#!\n";
1318 }
1319}
0dc3711c
NC
1320elsif ($ARGS{PLATFORM} eq 'netware') {
1321 if ($ARGS{FILETYPE} eq 'def') {
d6035849
NC
1322 print "LIBRARY perl515\n";
1323 print "DESCRIPTION 'Perl interpreter for NetWare'\n";
1324 print "EXPORTS\n";
1325 }
1326}
1327
1328# Then the symbols
549a6b10 1329
7766f137 1330foreach my $symbol (sort keys %export) {
0dc3711c
NC
1331 if ($ARGS{PLATFORM} =~ /^win(?:32|ce)$/) {
1332 $symbol = "_$symbol" if $ARGS{CCTYPE} eq 'BORLAND';
520c758a 1333 print "\t$symbol\n";
7766f137 1334 }
0dc3711c 1335 elsif ($ARGS{PLATFORM} eq 'os2') {
52e4c282
IZ
1336 printf qq( %-31s \@%s\n),
1337 qq("$symbol"), $ordinal{$symbol} || ++$sym_ord;
78232bc0
JH
1338 printf qq( %-31s \@%s\n),
1339 qq("$exportperlmalloc{$symbol}" = "$symbol"),
1340 $ordinal{$exportperlmalloc{$symbol}} || ++$sym_ord
1341 if $exportperlmalloc and exists $exportperlmalloc{$symbol};
7766f137 1342 }
0dc3711c 1343 elsif ($ARGS{PLATFORM} eq 'netware') {
ed463ba8
NC
1344 print "\t$symbol,\n";
1345 } else {
549a6b10
JH
1346 print "$symbol\n";
1347 }
ed463ba8
NC
1348}
1349
1350# Then platform specific footers.
1351
0dc3711c 1352if ($ARGS{PLATFORM} eq 'os2') {
ed463ba8
NC
1353 print <<EOP;
1354 dll_perlmain=main
1355 fill_extLibpath
1356 dir_subst
1357 Perl_OS2_handler_install
1358
1359; LAST_ORDINAL=$sym_ord
1360EOP
549a6b10
JH
1361}
1362
13631;