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