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