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