e688eb5075d6e436736734c332d0856dfde8421d
[p5sagit/p5-mst-13.2.git] / win32 / makedef.pl
1 #!../miniperl
2
3 # Written: 10 April 1996 Gary Ng (71564.1743@compuserve.com)
4
5 # Create the export list for perl.
6 # Needed by WIN32 for creating perl.dll
7 # based on perl_exp.SH in the main perl distribution directory
8
9 # This simple program relys on 'global.sym' being up to date
10 # with all of the global symbols that a dynamicly link library
11 # might want to access.
12
13 # There is some symbol defined in global.sym and interp.sym
14 # that does not present in the WIN32 port but there is no easy
15 # way to find them so I just put a exception list here
16
17 my $CCTYPE = "MSVC";    # default
18
19 while (@ARGV)
20  {
21   my $flag = shift;
22   $define{$1} = 1 if ($flag =~ /^-D(\w+)$/);
23   $CCTYPE = $1 if ($flag =~ /^CCTYPE=(\w+)$/);
24  } 
25
26 open(CFG,'config.h') || die "Cannot open config.h:$!";
27 while (<CFG>)
28  {
29   $define{$1} = 1 if /^\s*#\s*define\s+(MYMALLOC)\b/;
30   $define{$1} = 1 if /^\s*#\s*define\s+(USE_THREADS)\b/;
31  }
32 close(CFG);
33
34 warn join(' ',keys %define)."\n";
35
36 if ($define{PERL_OBJECT}) {
37     print "LIBRARY PerlCore\n";
38     print "DESCRIPTION 'Perl interpreter'\n";
39     print "EXPORTS\n";
40     output_symbol("perl_alloc");
41     exit(0);
42 }
43
44 if ($CCTYPE ne 'GCC') 
45  {
46   print "LIBRARY Perl\n";
47   print "DESCRIPTION 'Perl interpreter, export autogenerated'\n";
48   print "CODE LOADONCALL\n";
49   print "DATA LOADONCALL NONSHARED MULTIPLE\n";
50  }
51 else
52  {
53   $define{'PERL_GLOBAL_STRUCT'} = 1;
54   $define{'MULTIPLICITY'} = 1;
55  }
56
57 print "EXPORTS\n";
58
59 my %skip;
60 my %export;
61
62 sub skip_symbols
63 {
64  my $list = shift;
65  foreach my $symbol (@$list)
66   {
67    $skip{$symbol} = 1;
68   }
69 }
70
71 sub emit_symbols
72 {
73  my $list = shift;
74  foreach my $symbol (@$list)
75   {
76    emit_symbol($symbol) unless exists $skip{$symbol};
77   }
78 }
79
80 skip_symbols [qw(
81 Perl_statusvalue_vms
82 Perl_archpat_auto
83 Perl_block_type
84 Perl_bostr
85 Perl_additem
86 Perl_cast_ulong
87 Perl_check_uni
88 Perl_checkcomma
89 Perl_chsize
90 Perl_ck_aelem
91 Perl_colors
92 Perl_colorset
93 Perl_cryptseen
94 Perl_cx_dump
95 Perl_DBcv
96 Perl_do_ipcctl
97 Perl_do_ipcget
98 Perl_do_msgrcv
99 Perl_do_msgsnd
100 Perl_do_semop
101 Perl_do_shmio
102 Perl_doeval
103 Perl_dofindlabel
104 Perl_dopoptoeval
105 Perl_dump_eval
106 Perl_dump_fds
107 Perl_dump_form
108 Perl_dump_gv
109 Perl_dump_mstats
110 Perl_dump_op
111 Perl_dump_packsubs
112 Perl_dump_pm
113 Perl_dump_sub
114 Perl_expectterm
115 Perl_error_no
116 Perl_extralen
117 Perl_fetch_gv
118 Perl_fetch_io
119 Perl_force_ident
120 Perl_force_next
121 Perl_force_word
122 Perl_generation
123 Perl_hv_stashpv
124 Perl_in_clean_all
125 Perl_in_clean_objs
126 Perl_intuit_more
127 Perl_init_thread_intern
128 Perl_know_next
129 Perl_lastgotoprobe
130 Perl_linestart
131 Perl_modcount
132 Perl_modkids
133 Perl_mstats
134 Perl_my_bzero
135 Perl_my_htonl
136 Perl_my_ntohl
137 Perl_my_swap
138 Perl_my_chsize
139 Perl_newXSUB
140 Perl_no_fh_allowed
141 Perl_no_op
142 Perl_nointrp
143 Perl_nomem
144 Perl_pending_ident
145 Perl_pp_cswitch
146 Perl_pp_entersubr
147 Perl_pp_evalonce
148 Perl_pp_interp
149 Perl_pp_map
150 Perl_pp_nswitch
151 Perl_q
152 Perl_rcsid
153 Perl_reall_srchlen
154 Perl_reg_eval_set
155 Perl_reg_flags
156 Perl_reg_start_tmp
157 Perl_reg_start_tmpl
158 Perl_regbol
159 Perl_regcc
160 Perl_regcode
161 Perl_regdata
162 Perl_regdummy
163 Perl_regdump
164 Perl_regfold
165 Perl_regendp
166 Perl_regeol
167 Perl_regflags
168 Perl_regindent
169 Perl_reginput
170 Perl_reglastparen
171 Perl_regmyendp
172 Perl_regmyp_size
173 Perl_regmystartp
174 Perl_regnarrate
175 Perl_regnaughty
176 Perl_regnpar
177 Perl_regparse
178 Perl_regprecomp
179 Perl_regprev
180 Perl_regprogram
181 Perl_regprop
182 Perl_regsawback
183 Perl_regseen
184 Perl_regsize
185 Perl_regstartp
186 Perl_regtill
187 Perl_regxend
188 Perl_rx
189 Perl_same_dirent
190 Perl_saw_return
191 Perl_scan_const
192 Perl_scan_formline
193 Perl_scan_heredoc
194 Perl_scan_ident
195 Perl_scan_inputsymbol
196 Perl_scan_pat
197 Perl_scan_prefix
198 Perl_scan_str
199 Perl_scan_subst
200 Perl_scan_trans
201 Perl_scan_word
202 Perl_seen_zerolen
203 Perl_setenv_getix
204 Perl_skipspace
205 Perl_sort_mutex
206 Perl_sortcxix
207 Perl_sublex_done
208 Perl_sublex_info
209 Perl_sublex_start
210 Perl_sv_ref
211 Perl_sv_setptrobj
212 Perl_timesbuf
213 Perl_too_few_arguments
214 Perl_too_many_arguments
215 Perl_unlnk
216 Perl_watch
217 Perl_yyname
218 Perl_yyrule
219 allgvs
220 curblock
221 curcsv
222 lastretstr
223 mystack_mark
224 perl_init_ext
225 perl_requirepv
226 stack
227 statusvalue_vms
228 Perl_safexcalloc
229 Perl_safexmalloc
230 Perl_safexfree
231 Perl_safexrealloc
232 Perl_my_memcmp
233 Perl_my_memset
234 Perl_cshlen
235 Perl_cshname
236 Perl_opsave
237 )];
238
239
240 if ($define{'MYMALLOC'})
241  {
242   skip_symbols [qw(
243     Perl_safefree
244     Perl_safemalloc
245     Perl_saferealloc
246     Perl_safecalloc)];
247   emit_symbols [qw(
248     Perl_malloc
249     Perl_free
250     Perl_realloc
251     Perl_calloc)];
252  }
253
254 unless ($define{'USE_THREADS'})
255  {
256   skip_symbols [qw(
257 Perl_condpair_magic
258 Perl_thr_key
259 Perl_sv_mutex
260 Perl_svref_mutex
261 Perl_malloc_mutex
262 Perl_eval_mutex
263 Perl_eval_cond
264 Perl_eval_owner
265 Perl_threads_mutex
266 Perl_new_struct_thread
267 Perl_nthreads
268 Perl_nthreads_cond
269 Perl_per_thread_magicals
270 Perl_thread_create
271 Perl_threadnum
272 Perl_find_threadsv
273 Perl_threadsv_names
274 Perl_thrsv
275 Perl_unlock_condpair
276 Perl_vtbl_mutex
277 Perl_magic_mutexfree
278 Perl_sv_iv
279 Perl_sv_nv
280 Perl_sv_true
281 Perl_sv_uv
282 Perl_sv_pvn
283 Perl_newRV_noinc)];
284  }
285
286 unless ($define{'FAKE_THREADS'})
287  {
288   skip_symbols [qw(Perl_curthr)];
289  }
290
291 sub readvar
292 {
293  my $file = shift;
294  open(VARS,$file) || die "Cannot open $file:$!";
295  my @syms;
296  while (<VARS>)
297   {
298    # All symbols have a Perl_ prefix because that's what embed.h
299    # sticks in front of them.
300    push(@syms,"Perl_".$1) if (/\bPERLVARI?C?\([IGT](\w+)/);
301   } 
302  close(VARS); 
303  return \@syms;
304 }
305
306 if ($define{'USE_THREADS'} || $define{'MULTIPLICITY'})
307  {
308   my $thrd = readvar("../thrdvar.h");
309   skip_symbols $thrd;
310  } 
311
312 if ($define{'MULTIPLICITY'})
313  {
314   my $interp = readvar("../intrpvar.h");
315   skip_symbols $interp;
316  } 
317
318 if ($define{'PERL_GLOBAL_STRUCT'})
319  {
320   my $global = readvar("../perlvars.h");
321   skip_symbols $global;
322  } 
323
324 unless ($define{'DEBUGGING'})
325  {
326   skip_symbols [qw(
327     Perl_deb
328     Perl_deb_growlevel
329     Perl_debop
330     Perl_debprofdump
331     Perl_debstack
332     Perl_debstackptrs
333     Perl_runops_debug
334     Perl_sv_peek
335     Perl_watchaddr
336     Perl_watchok)];
337  }
338
339 if ($define{'HAVE_DES_FCRYPT'})
340  {
341   emit_symbols [qw(win32_crypt)];
342  }
343
344 open (GLOBAL, "<../global.sym") || die "failed to open global.sym" . $!;
345 while (<GLOBAL>) 
346  {
347   next if (!/^[A-Za-z]/);
348   next if (/_amg[ \t]*$/);
349   # All symbols have a Perl_ prefix because that's what embed.h
350   # sticks in front of them.
351   chomp($_);
352   my $symbol = "Perl_$_";
353   emit_symbol($symbol) unless exists $skip{$symbol};
354  }
355 close(GLOBAL);
356
357 # also add symbols from interp.sym
358 # They are only needed if -DMULTIPLICITY is not set but it
359 # doesn't hurt to include them anyway.
360 # these don't have Perl prefix
361
362 if ($define{'PERL_GLOBAL_STRUCT'})
363  {
364   emit_symbol( ($CCTYPE eq 'GCC') ? 'Perl_GetVars' : 'Perl_VarsPtr')
365  }
366 else
367  {
368   my $glob = readvar("../perlvars.h");
369   emit_symbols $glob;
370  } 
371
372 unless ($define{'MULTIPLICITY'})
373  {
374   my $glob = readvar("../intrpvar.h");
375   emit_symbols $glob;
376  } 
377
378 unless ($define{'MULTIPLICITY'} || $define{'USE_THREADS'})
379  {
380   my $glob = readvar("../thrdvar.h");
381   emit_symbols $glob;
382  } 
383
384 while (<DATA>) {
385         my $symbol;
386         next if (!/^[A-Za-z]/);
387         next if (/^#/);
388         s/\r//g;
389         chomp($_);
390         $symbol = $_;
391         next if exists $skip{$symbol};
392         emit_symbol($symbol);
393 }
394
395 foreach my $symbol (sort keys %export)
396  {
397    output_symbol($symbol);
398  }
399
400 sub emit_symbol {
401         my $symbol = shift;
402         chomp($symbol); 
403         $export{$symbol} = 1;
404 }
405
406 sub output_symbol {
407     my $symbol = shift;
408     if ($CCTYPE eq "BORLAND") {
409             # workaround Borland quirk by exporting both the straight
410             # name and a name with leading underscore.  Note the
411             # alias *must* come after the symbol itself, if both
412             # are to be exported. (Linker bug?)
413             print "\t_$symbol\n";
414             print "\t$symbol = _$symbol\n";
415     }
416     elsif ($CCTYPE eq 'GCC') {
417             # Symbols have leading _ whole process is $%£"% slow
418             # so skip aliases for now
419             print "\t$symbol\n";
420     }
421     else {
422             # for binary coexistence, export both the symbol and
423             # alias with leading underscore
424             print "\t$symbol\n";
425             print "\t_$symbol = $symbol\n";
426     }
427 }
428
429 1;
430 __DATA__
431 # extra globals not included above.
432 perl_init_i18nl10n
433 perl_init_ext
434 perl_alloc
435 perl_construct
436 perl_destruct
437 perl_free
438 perl_parse
439 perl_run
440 perl_get_sv
441 perl_get_av
442 perl_get_hv
443 perl_get_cv
444 perl_call_argv
445 perl_call_pv
446 perl_call_method
447 perl_call_sv
448 perl_require_pv
449 perl_eval_pv
450 perl_eval_sv
451 boot_DynaLoader
452 Perl_thread_create
453 win32_errno
454 win32_environ
455 win32_stdin
456 win32_stdout
457 win32_stderr
458 win32_ferror
459 win32_feof
460 win32_strerror
461 win32_fprintf
462 win32_printf
463 win32_vfprintf
464 win32_vprintf
465 win32_fread
466 win32_fwrite
467 win32_fopen
468 win32_fdopen
469 win32_freopen
470 win32_fclose
471 win32_fputs
472 win32_fputc
473 win32_ungetc
474 win32_getc
475 win32_fileno
476 win32_clearerr
477 win32_fflush
478 win32_ftell
479 win32_fseek
480 win32_fgetpos
481 win32_fsetpos
482 win32_rewind
483 win32_tmpfile
484 win32_abort
485 win32_fstat
486 win32_stat
487 win32_pipe
488 win32_popen
489 win32_pclose
490 win32_setmode
491 win32_lseek
492 win32_tell
493 win32_dup
494 win32_dup2
495 win32_open
496 win32_close
497 win32_eof
498 win32_read
499 win32_write
500 win32_spawnvp
501 win32_mkdir
502 win32_rmdir
503 win32_chdir
504 win32_flock
505 win32_execvp
506 win32_htons
507 win32_ntohs
508 win32_htonl
509 win32_ntohl
510 win32_inet_addr
511 win32_inet_ntoa
512 win32_socket
513 win32_bind
514 win32_listen
515 win32_accept
516 win32_connect
517 win32_send
518 win32_sendto
519 win32_recv
520 win32_recvfrom
521 win32_shutdown
522 win32_closesocket
523 win32_ioctlsocket
524 win32_setsockopt
525 win32_getsockopt
526 win32_getpeername
527 win32_getsockname
528 win32_gethostname
529 win32_gethostbyname
530 win32_gethostbyaddr
531 win32_getprotobyname
532 win32_getprotobynumber
533 win32_getservbyname
534 win32_getservbyport
535 win32_select
536 win32_endhostent
537 win32_endnetent
538 win32_endprotoent
539 win32_endservent
540 win32_getnetent
541 win32_getnetbyname
542 win32_getnetbyaddr
543 win32_getprotoent
544 win32_getservent
545 win32_sethostent
546 win32_setnetent
547 win32_setprotoent
548 win32_setservent
549 win32_getenv
550 win32_perror
551 win32_setbuf
552 win32_setvbuf
553 win32_flushall
554 win32_fcloseall
555 win32_fgets
556 win32_gets
557 win32_fgetc
558 win32_putc
559 win32_puts
560 win32_getchar
561 win32_putchar
562 win32_malloc
563 win32_calloc
564 win32_realloc
565 win32_free
566 win32_sleep
567 win32_times
568 win32_alarm
569 win32_open_osfhandle
570 win32_get_osfhandle
571 win32_ioctl
572 win32_utime
573 win32_wait
574 win32_str_os_error
575 Perl_win32_init
576 Perl_init_os_extras
577 Perl_getTHR
578 Perl_setTHR
579 RunPerl
580