4 use File::Basename qw(&basename &dirname);
8 # List explicitly here the variables you want Configure to
9 # generate. Metaconfig only looks for shell variables, so you
10 # have to mention them as if they were shell variables, not
11 # %Config entries. Thus you write
13 # to ensure Configure will look for $Config{startperl}.
16 # This forces PL files to create target in same directory as PL file.
17 # This is so that make depend always knows where to find PL derivatives.
20 $file = basename($0, '.PL');
21 $file .= '.com' if $^O eq 'VMS';
23 open OUT,">$file" or die "Can't create $file: $!";
25 print "Extracting $file (with variable substitutions)\n";
27 # In this section, perl variables will be expanded during extraction.
28 # You can use $Config{...} to use Configure variables.
30 print OUT <<"!GROK!THIS!";
32 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
33 if \$running_under_some_shell;
34 --\$running_under_some_shell;
37 # In the following, perl variables are not expanded during extraction.
39 print OUT <<'!NO!SUBS!';
41 # Version 2.0, Simon Cozens, Thu Mar 30 17:52:45 JST 2000
42 # Version 2.01, Tom Christiansen, Thu Mar 30 08:25:14 MST 2000
43 # Version 2.02, Simon Cozens, Sun Apr 16 01:53:36 JST 2000
44 # Version 2.03, Edward Peschko, Mon Feb 26 12:04:17 PST 2001
52 use Fcntl qw(:DEFAULT :flock);
53 use File::Temp qw(tempfile);
58 $SIG{INT} = sub { exit(); }; # exit gracefully and clean up after ourselves.
61 cc_harness check_read check_write checkopts_byte choose_backend
62 compile_byte compile_cstyle compile_module generate_code
63 grab_stash parse_argv sanity_check vprint yclept spawnit
65 sub opt(*); # imal quoting
67 our ($Options, $BinPerl, $Backend);
68 our ($Input => $Output);
72 # eval { main(); 1 } or die;
82 _die("XXX: Not reached?");
85 #######################################################################
92 $Backend = 'Bytecode';
94 if (opt(S) && opt(c)) {
95 # die "$0: Do you want me to compile this or not?\n";
98 $Backend = 'CC' if opt(O);
104 vprint 0, "Compiling $Input";
106 $BinPerl = yclept(); # Calling convention for perl.
111 if ($Backend eq 'Bytecode') {
117 exit(0) if (!opt('r'));
121 vprint 0, "Running code";
122 run("$Output @ARGV");
126 # usage: vprint [level] msg args
131 } elsif ($_[0] =~ /^\d$/) {
134 # well, they forgot to use a number; means >0
138 $msg .= "\n" unless substr($msg, -1) eq "\n";
141 print "$0: $msg" if !opt('log');
142 print $logfh "$0: $msg" if opt('log');
150 # disallows using long arguments
151 # Getopt::Long::Configure("bundling");
153 Getopt::Long::Configure("no_ignore_case");
155 # no difference in exists and defined for %ENV; also, a "0"
156 # argument or a "" would not help cc, so skip
157 unshift @ARGV, split ' ', $ENV{PERLCC_OPTS} if $ENV{PERLCC_OPTS};
160 Getopt::Long::GetOptions( $Options,
161 'L:s', # lib directory
162 'I:s', # include directories (FOR C, NOT FOR PERL)
163 'o:s', # Output executable
164 'v:i', # Verbosity level
166 'r', # run resulting executable
167 'B', # Byte compiler backend
168 'O', # Optimised C backend
172 'r', # run the resulting executable
173 'static', # Dirty hack to enable -shared/-static
174 'shared', # Create a shared library (--shared for compat.)
175 'log:s' # where to log compilation process information
180 helpme() if opt(h); # And exit
182 $Output = opt(o) || 'a.out';
183 $Output = relativize($Output);
184 $logfh = new FileHandle(">> " . opt('log')) if (opt('log'));
187 warn "$0: using -e 'code' as input file, ignoring @ARGV\n" if @ARGV;
188 # We don't use a temporary file here; why bother?
189 # XXX: this is not bullet proof -- spaces or quotes in name!
190 $Input = "-e '".opt(e)."'"; # Quotes eaten by shell
192 $Input = shift @ARGV; # XXX: more files?
193 _usage_and_die("$0: No input file specified\n") unless $Input;
194 # DWIM modules. This is bad but necessary.
195 $Options->{shared}++ if $Input =~ /\.pm\z/;
196 warn "$0: using $Input as input file, ignoring @ARGV\n" if @ARGV;
206 return exists($Options->{$opt}) && ($Options->{$opt} || 0);
210 die "$0: Compiling to shared libraries is currently disabled\n";
215 my $stash = grab_stash();
216 my $command = "$BinPerl -MO=Bytecode,$stash $Input";
217 # The -a option means we'd have to close the file and lose the
218 # lock, which would create the tiniest of races. Instead, append
219 # the output ourselves.
220 vprint 1, "Writing on $Output";
222 my $openflags = O_WRONLY | O_CREAT;
223 $openflags |= O_BINARY if eval { O_BINARY; 1 };
224 $openflags |= O_EXLOCK if eval { O_EXLOCK; 1 };
226 # these dies are not "$0: .... \n" because they "can't happen"
228 sysopen(OUT, $Output, $openflags)
229 or die "can't write to $Output: $!";
231 # this is blocking; hold on; why are we doing this??
232 # flock OUT, LOCK_EX or die "can't lock $Output: $!"
233 # unless eval { O_EXLOCK; 1 };
236 or die "couldn't trunc $Output: $!";
240 use ByteLoader $ByteLoader::VERSION;
244 vprint 1, "Compiling...";
245 vprint 3, "Calling $command";
247 my ($output_r, $error_r) = spawnit($command);
249 if (@$error_r && $? != 0) {
250 _die("$0: $Input did not compile, which can't happen:\n@$error_r\n");
252 my @error = grep { !/^$Input syntax OK$/o } @$error_r;
253 warn "$0: Unexpected compiler output:\n@error" if @error;
256 # Write it and leave.
257 print OUT @$output_r or _die("can't write $Output: $!");
258 close OUT or _die("can't close $Output: $!");
260 # wait, how could it be anything but what you see next?
261 chmod 0777 & ~umask, $Output or _die("can't chmod $Output: $!");
266 my $stash = grab_stash();
268 # What are we going to call our output C file?
272 if (opt(S) || opt(c)) {
273 # We need to keep it.
278 # File off extension if present
279 # hold on: plx is executable; also, careful of ordering!
280 $cfile =~ s/\.(?:p(?:lx|l|h)|m)\z//i;
282 $cfile = $Output if opt(c) && $Output =~ /\.c\z/i;
286 # Don't need to keep it, be safe with a tempfile.
288 ($cfh, $cfile) = tempfile("pccXXXXX", SUFFIX => ".c");
289 close $cfh; # See comment just below
291 vprint 1, "Writing C on $cfile";
293 my $max_line_len = '';
294 if ($^O eq 'MSWin32' && $Config{cc} =~ /^cl/i) {
295 $max_line_len = '-l2000,';
298 # This has to do the write itself, so we can't keep a lock. Life
300 my $command = "$BinPerl -MO=$Backend,$max_line_len$stash,-o$cfile $Input";
301 vprint 1, "Compiling...";
302 vprint 1, "Calling $command";
304 my ($output_r, $error_r) = spawnit($command);
305 my @output = @$output_r;
306 my @error = @$error_r;
308 if (@error && $? != 0) {
309 _die("$0: $Input did not compile, which can't happen:\n@error\n");
312 cc_harness($cfile,$stash) unless opt(c);
315 vprint 2, "unlinking $cfile";
316 unlink $cfile or _die("can't unlink $cfile: $!");
321 my ($cfile,$stash)=@_;
322 use ExtUtils::Embed ();
323 my $command = ExtUtils::Embed::ccopts." -o $Output $cfile ";
324 $command .= " -I".$_ for split /\s+/, opt(I);
325 $command .= " -L".$_ for split /\s+/, opt(L);
326 my @mods = split /-?u /, $stash;
327 $command .= " ".ExtUtils::Embed::ldopts("-std", \@mods);
328 $command .= " -lperl";
329 vprint 3, "running $Config{cc} $command";
330 system("$Config{cc} $command");
333 # Where Perl is, and which include path to give it.
335 my $command = "$^X ";
337 # DWIM the -I to be Perl, not C, include directories.
338 if (opt(I) && $Backend eq "Bytecode") {
339 for (split /\s+/, opt(I)) {
343 warn "$0: Include directory $_ not found, skipping\n";
348 $command .= "-I$_ " for @INC;
352 # Use B::Stash to find additional modules and stuff.
357 warn "already called get_stash once" if $_stash;
359 my $command = "$BinPerl -MB::Stash -c $Input";
360 # Filename here is perfectly sanitised.
361 vprint 3, "Calling $command\n";
363 my ($stash_r, $error_r) = spawnit($command);
364 my @stash = @$stash_r;
365 my @error = @$error_r;
367 if (@error && $? != 0) {
368 _die("$0: $Input did not compile:\n@error\n");
371 $stash[0] =~ s/,-u\<none\>//;
372 vprint 2, "Stash: ", join " ", split /,?-u/, $stash[0];
374 return $_stash = $stash[0];
379 # Check the consistency of options if -B is selected.
380 # To wit, (-B|-O) ==> no -shared, no -S, no -c
383 _die("$0: Please choose one of either -B and -O.\n") if opt(O);
386 warn "$0: Will not create a shared library for bytecode\n";
387 delete $Options->{shared};
390 for my $o ( qw[c S] ) {
392 warn "$0: Compiling to bytecode is a one-pass process--",
394 delete $Options->{$o};
400 # Check the input and output files make sense, are read/writeable.
402 if ($Input eq $Output) {
403 if ($Input eq 'a.out') {
404 _die("$0: Compiling a.out is probably not what you want to do.\n");
405 # You fully deserve what you get now. No you *don't*. typos happen.
407 warn "$0: Will not write output on top of input file, ",
408 "compiling to a.out instead\n";
417 _die("$0: Input file $file is a directory, not a file\n") if -d _;
419 _die("$0: Input file $file was not found\n");
421 _die("$0: Cannot read input file $file: $!\n");
425 # XXX: die? don't try this on /dev/tty
426 warn "$0: WARNING: input $file is not a plain file\n";
433 _die("$0: Cannot write on $file, is a directory\n");
436 _die("$0: Cannot write on $file: $!\n") unless -w _;
439 _die("$0: Cannot write in this directory: $!\n");
446 warn "$0: Binary `$file' sure doesn't smell like perl source!\n";
447 print "Checking file type... ";
448 system("file", $file);
449 _die("Please try a perlier file!\n");
452 open(my $handle, "<", $file) or _die("XXX: can't open $file: $!");
453 local $_ = <$handle>;
454 if (/^#!/ && !/perl/) {
455 _die("$0: $file is a ", /^#!\s*(\S+)/, " script, not perl\n");
460 # File spawning and error collecting
462 my ($command) = shift;
465 (undef, $errname) = tempfile("pccXXXXX");
467 open (S_OUT, "$command 2>$errname |")
468 or _die("$0: Couldn't spawn the compiler.\n");
471 open (S_ERROR, $errname) or _die("$0: Couldn't read the error file.\n");
475 unlink $errname or _die("$0: Can't unlink error file $errname");
476 return (\@output, \@error);
480 print "perlcc compiler frontend, version $VERSION\n\n";
491 return() if ($args =~ m"^[/\\]");
496 $logfh->print(@_) if opt('log');
498 exit(); # should die eventually. However, needed so that a 'make compile'
499 # can compile all the way through to the end for standard dist.
505 $0 [-o executable] [-r] [-O|-B|-c|-S] [-log log] [source[.pl] | -e oneliner]
512 print interruptrun(@commands) if (!opt('log'));
513 $logfh->print(interruptrun(@commands)) if (opt('log'));
520 my $command = join('', @commands);
522 my $pid = open(FD, "$command |");
525 local($SIG{HUP}) = sub { kill 9, $pid; exit };
526 local($SIG{INT}) = sub { kill 9, $pid; exit };
529 ($ENV{PERLCC_TIMEOUT} &&
530 $Config{'osname'} ne 'MSWin32' &&
531 $command =~ m"(^|\s)perlcc\s");
535 local($SIG{ALRM}) = sub { die "INFINITE LOOP"; };
536 alarm($ENV{PERLCC_TIMEOUT}) if ($needalarm);
537 $text = join('', <FD>);
538 alarm(0) if ($needalarm);
543 eval { kill 'HUP', $pid };
544 vprint 0, "SYSTEM TIMEOUT (infinite loop?)\n";
552 unlink $cfile if ($cfile && !opt(S) && !opt(c));
559 perlcc - generate executables from Perl programs
563 $ perlcc hello # Compiles into executable 'a.out'
564 $ perlcc -o hello hello.pl # Compiles into executable 'hello'
566 $ perlcc -O file # Compiles using the optimised C backend
567 $ perlcc -B file # Compiles using the bytecode backend
569 $ perlcc -c file # Creates a C file, 'file.c'
570 $ perlcc -S -o hello file # Creates a C file, 'file.c',
571 # then compiles it to executable 'hello'
572 $ perlcc -c out.c file # Creates a C file, 'out.c' from 'file'
574 $ perlcc -e 'print q//' # Compiles a one-liner into 'a.out'
575 $ perlcc -c -e 'print q//' # Creates a C file 'a.out.c'
577 $ perlcc -I /foo hello # extra headers (notice the space after -I)
578 $ perlcc -L /foo hello # extra libraries (notice the space after -L)
580 $ perlcc -r hello # compiles 'hello' into 'a.out', runs 'a.out'.
581 $ perlcc -r hello a b c # compiles 'hello' into 'a.out', runs 'a.out'.
582 # with arguments 'a b c'
584 $ perlcc hello -log c # compiles 'hello' into 'a.out' logs compile
589 F<perlcc> creates standalone executables from Perl programs, using the
590 code generators provided by the L<B> module. At present, you may
591 either create executable Perl bytecode, using the C<-B> option, or
592 generate and compile C files using the standard and 'optimised' C
595 The code generated in this way is not guaranteed to work. The whole
596 codegen suite (C<perlcc> included) should be considered B<very>
597 experimental. Use for production purposes is strongly discouraged.
603 =item -LI<library directories>
605 Adds the given directories to the library search path when C code is
606 passed to your C compiler.
608 =item -II<include directories>
610 Adds the given directories to the include file search path when C code is
611 passed to your C compiler; when using the Perl bytecode option, adds the
612 given directories to Perl's include path.
614 =item -o I<output file name>
616 Specifies the file name for the final compiled executable.
618 =item -c I<C file name>
620 Create C code only; do not compile to a standalone binary.
622 =item -e I<perl code>
624 Compile a one-liner, much the same as C<perl -e '...'>
628 Do not delete generated C code after compilation.
632 Use the Perl bytecode code generator.
636 Use the 'optimised' C code generator. This is more experimental than
637 everything else put together, and the code created is not guaranteed to
638 compile in finite time and memory, or indeed, at all.
642 Increase verbosity of output; can be repeated for more verbose output.
646 Run the resulting compiled script after compiling it.
650 Log the output of compiling to a file rather than to stdout.
658 close OUT or die "Can't close $file: $!";
659 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
660 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';