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