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