4 use File::Basename qw(&basename &dirname);
7 # List explicitly here the variables you want Configure to
8 # generate. Metaconfig only looks for shell variables, so you
9 # have to mention them as if they were shell variables, not
10 # %Config entries. Thus you write
12 # to ensure Configure will look for $Config{startperl}.
15 # This forces PL files to create target in same directory as PL file.
16 # This is so that make depend always knows where to find PL derivatives.
19 $file = basename($0, '.PL');
20 $file .= '.com' if $^O eq 'VMS';
22 open OUT,">$file" or die "Can't create $file: $!";
24 print "Extracting $file (with variable substitutions)\n";
26 # In this section, perl variables will be expanded during extraction.
27 # You can use $Config{...} to use Configure variables.
29 print OUT <<"!GROK!THIS!";
31 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
32 if \$running_under_some_shell;
35 # In the following, perl variables are not expanded during extraction.
37 print OUT <<'!NO!SUBS!';
42 use File::Basename qw(&basename &dirname);
47 $Getopt::Long::bundling_override = 1;
48 $Getopt::Long::passthrough = 0;
49 $Getopt::Long::ignore_case = 0;
82 _usage() if (!_checkopts());
83 push(@ARGV, _maketempfile()) if ($options->{'e'});
91 --------------------------------------------------------------------------------
93 --------------------------------------------------------------------------------
103 my ($program_ext, $module_ext) = _getRegexps();
104 my ($obj, $objfile, $so, $type);
107 (($file =~ m"@$program_ext") && ($file !~ m"@$module_ext"))
108 || (defined($options->{'prog'}) || defined($options->{'run'}))
111 $objfile = ($options->{'C'}) ? $options->{'C'} : "$file.c";
114 $obj = ($options->{'o'})? $options->{'o'} :
115 _getExecutable( $file,$program_ext);
120 elsif (($file =~ m"@$module_ext") || ($options->{'mod'}))
122 die "Shared objects are not supported on Win32 yet!!!!\n"
123 if ($Config{'osname'} eq 'MSWin32');
125 $obj = ($options->{'o'})? $options->{'o'} :
126 _getExecutable($file, $module_ext);
133 _error("noextension", $file, $program_ext, $module_ext);
137 if ($type eq 'program')
139 _print("Making C($objfile) for $file!\n", 36 );
141 my $errcode = _createCode($objfile, $file);
142 (_print( "ERROR: In generating code for $file!\n", -1), return())
145 _print("Compiling C($obj) for $file!\n", 36 ) if (!$options->{'gen'});
146 my $errcode = _compileCode($file, $objfile, $obj)
147 if (!$options->{'gen'});
151 _print( "ERROR: In compiling code for $objfile !\n", -1);
152 my $ofile = File::Basename::basename($objfile);
153 $ofile =~ s"\.c$"\.o"s;
155 _removeCode("$ofile");
159 _runCode($obj) if ($options->{'run'});
161 _removeCode($objfile) if (!$options->{'sav'} ||
162 ($options->{'e'} && !$options->{'C'}));
164 _removeCode($file) if ($options->{'e'});
166 _removeCode($obj) if (($options->{'e'} &&
167 ((!$options->{'sav'}) || !$options->{'o'})) ||
168 ($options->{'run'} && (!$options->{'sav'})));
172 _print( "Making C($objfile) for $file!\n", 36 );
173 my $errcode = _createCode($objfile, $file, $obj);
174 (_print( "ERROR: In generating code for $file!\n", -1), return())
177 _print( "Compiling C($obj) for $file!\n", 36 ) if (!$options->{'gen'});
180 _compileCode($file, $objfile, $obj, $so ) if (!$options->{'gen'});
182 (_print( "ERROR: In compiling code for $objfile!\n", -1), return())
189 my ($sourceprog, $ext) = @_;
192 if (defined($options->{'regex'}))
194 eval("(\$obj = \$sourceprog) =~ $options->{'regex'}");
195 return(0) if (_error('badeval', $@));
196 return(0) if (_error('equal', $obj, $sourceprog));
198 elsif (defined ($options->{'ext'}))
200 ($obj = $sourceprog) =~ s"@$ext"$options->{ext}"g;
201 return(0) if (_error('equal', $obj, $sourceprog));
203 elsif (defined ($options->{'run'}))
209 ($obj = $sourceprog) =~ s"@$ext""g;
210 return(0) if (_error('equal', $obj, $sourceprog));
217 my ( $generated_cfile, $file, $final_output ) = @_;
222 if (@_ == 2) # compiling a program
224 _print( "$^X -I@INC -MO=CC,-o$generated_cfile $file\n", 36);
225 $return = _run("$
\18 -I@INC -MO=CC,-o$generated_cfile $file", 9);
228 else # compiling a shared object
231 "$
\18 -I@INC -MO=CC,-m$final_output,-o$generated_cfile $file\n", 36);
233 _run("$
\18 -I@INC -MO=CC,-m$final_output,-o$generated_cfile $file", 9);
240 my ($sourceprog, $generated_cfile, $output_executable, $shared_object) = @_;
243 if (@_ == 3) # just compiling a program
246 _ccharness($sourceprog, "-o", $output_executable, $generated_cfile);
251 my $object_file = $generated_cfile;
252 $object_file =~ s"\.c$"\.o";
254 $return[0] = _ccharness($sourceprog, "-c", $generated_cfile);
255 $return[1] = _ccharness
257 $sourceprog, "-shared","-o",
258 $shared_object, $object_file
260 return(1) if (grep ($_, @return));
267 my ($executable) = @_;
268 _print("$executable $options->{'argv'}\n", 36);
269 _run("$executable $options->{'argv'}", -1 );
275 unlink($file) if (-e $file);
283 my $sourceprog = shift(@args);
284 my ($libdir, $incdir);
286 if (-d "$Config{installarchlib}/CORE")
288 $libdir = "-L$Config{installarchlib}/CORE";
289 $incdir = "-I$Config{installarchlib}/CORE";
297 $libdir .= " -L$options->{L}" if (defined($options->{L}));
298 $incdir .= " -I$options->{L}" if (defined($options->{L}));
302 if (!grep(/^-[cS]$/, @ARGV))
304 $linkargs = sprintf("%s $libdir -lperl %s",@Config{qw(ldflags libs)});
307 my @sharedobjects = _getSharedObjects($sourceprog);
310 "$Config{cc} $Config{ccflags} $incdir @sharedobjects @args $linkargs";
313 _print ("$cccmd\n", 36);
317 sub _getSharedObjects
319 my ($sourceprog) = @_;
320 my ($tmpfile, $incfile);
324 if ($Config{'osname'} eq 'MSWin32')
331 ($tmpprog = $sourceprog) =~ s"(.*)[\/\\](.*)"$2";
332 $tmpfile = "/tmp/$tmpprog.tst";
333 $incfile = "/tmp/$tmpprog.val";
336 my $fd = new FileHandle("> $tmpfile") || die "Couldn't open $tmpfile!\n";
338 new FileHandle("$sourceprog") || die "Couldn't open $sourceprog!\n";
340 my $perl = <$fd2>; # strip off header;
345 my \$fh3 = new FileHandle("> $incfile")
346 || die "Couldn't open $incfile\\n";
349 foreach \$key (keys(\%INC)) { print \$fh3 "\$key:\$INC{\$key}\\n"; }
354 print $fd ( <$fd2> );
357 _print("$
\18 -I@INC $tmpfile\n", 36);
358 _run("$
\18 -I@INC $tmpfile", 9 );
360 my $fd = new FileHandle ("$incfile");
369 foreach $line (@lines)
372 my ($modname, $modpath) = split(':', $line);
373 my ($dir, $file) = ($modpath=~ m"(.*)[\\/]($modname)");
375 if ($autolib = _lookforAuto($dir, $file))
377 push(@return, $autolib);
388 # if ($Config{'osname'} eq 'MSWin32')
389 # { $return = "C:\\TEMP\\comp$$.p"; }
391 # { $return = "/tmp/comp$$.p"; }
393 $return = "comp$$.p";
395 my $fd = new FileHandle( "> $return") || die "Couldn't open $return!\n";
396 print $fd $options->{'e'};
405 my ($dir, $file) = @_;
410 ($relshared = $file) =~ s"(.*)\.pm"$1";
412 my ($tmp, $modname) = ($relshared =~ m"(?:(.*)[\\/]){0,1}(.*)"s);
415 ($Config{'osname'} eq 'MSWin32')? "\\$modname.dll" : "/$modname.so";
419 if (-e ($return = "$Config{'installarchlib'}/auto/$relshared") )
423 elsif (-e ($return = "$Config{'installsitearch'}/auto/$relshared"))
427 elsif (-e ($return = "$dir/arch/auto/$relshared"))
437 sub _getRegexps # make the appropriate regexps for making executables,
440 my ($program_ext, $module_ext) = ([],[]);
443 @$program_ext = ($ENV{PERL_SCRIPT_EXT})? split(':', $ENV{PERL_SCRIPT_EXT}) :
444 ('.p$', '.pl$', '.bat$');
447 @$module_ext = ($ENV{PERL_MODULE_EXT})? split(':', $ENV{PERL_MODULE_EXT}) :
451 _mungeRegexp( $program_ext );
452 _mungeRegexp( $module_ext );
454 return($program_ext, $module_ext);
461 grep(s"(^|[^\\])\."$1\x0\\."g, @$regexp);
462 grep(s"(^|[^\x0])\\\."$1\."g, @$regexp);
463 grep(s"\x0""g, @$regexp);
469 my ($type, @args) = @_;
471 if ($type eq 'equal')
474 if ($args[0] eq $args[1])
476 _print ("ERROR: The object file '$args[0]' does not generate a legitimate executable file! Skipping!\n", -1);
480 elsif ($type eq 'badeval')
484 _print ("ERROR: $args[0]\n", -1);
488 elsif ($type eq 'noextension')
490 my $progext = join(',', @{$args[1]});
491 my $modext = join(',', @{$args[2]});
502 ERROR: '$args[0]' does not have a proper extension! Proper extensions are:
505 SHARED OBJECT: $modext
507 Use the '-prog' flag to force your files to be interpreted as programs.
508 Use the '-mod' flag to force your files to be interpreted as modules.
522 if ($options->{'log'})
524 $_fh = new FileHandle(">> $options->{'log'}") || push(@errors, "ERROR: Couldn't open $options->{'log'}\n");
527 if (($options->{'c'}) && (@ARGV > 1) && ($options->{'sav'} ))
530 "ERROR: The '-sav' and '-C' options are incompatible when you have more than
531 one input file! ('-C' explicitly names resulting C code, '-sav' saves it,
532 and hence, with more than one file, the c code will be overwritten for
533 each file that you compile)\n");
535 if (($options->{'o'}) && (@ARGV > 1))
538 "ERROR: The '-o' option is incompatible when you have more than one input file!
539 (-o explicitly names the resulting executable, hence, with more than
540 one file the names clash)\n");
543 if ($options->{'e'} && $options->{'sav'} && !$options->{'o'} &&
547 "ERROR: You need to specify where you are going to save the resulting
548 executable or C code, when using '-sav' and '-e'. Use '-o' or '-C'.\n");
551 if (($options->{'regex'} || $options->{'run'} || $options->{'o'})
552 && $options->{'gen'})
555 "ERROR: The options '-regex', '-run', and '-o' are incompatible with '-gen'.
556 '-gen' says to stop at C generation, and the other three modify the
557 compilation and/or running process!\n");
560 if ($options->{'run'} && $options->{'mod'})
563 "ERROR: Can't run modules that you are compiling! '-run' and '-mod' are
567 if ($options->{'e'} && @ARGV)
570 "ERROR: The option '-e' needs to be all by itself without any other
573 if ($options->{'e'} && !($options->{'o'} || $options->{'run'}))
575 $options->{'run'} = 1;
578 if (!defined($options->{'verbose'}))
580 $options->{'verbose'} = ($options->{'log'})? 64 : 7;
585 if ($options->{'verbose'} =~ m"[^tagfcd]" &&
586 !( $options->{'verbose'} eq '0' ||
587 ($options->{'verbose'} < 64 && $options->{'verbose'} > 0)))
591 "ERROR: Illegal verbosity level. Needs to have either the letters
592 't','a','g','f','c', or 'd' in it or be between 0 and 63, inclusive.\n");
595 $options->{'verbose'} = ($options->{'verbose'} =~ m"[tagfcd]")?
596 ($options->{'verbose'} =~ m"d") * 32 +
597 ($options->{'verbose'} =~ m"c") * 16 +
598 ($options->{'verbose'} =~ m"f") * 8 +
599 ($options->{'verbose'} =~ m"t") * 4 +
600 ($options->{'verbose'} =~ m"a") * 2 +
601 ($options->{'verbose'} =~ m"g") * 1
602 : $options->{'verbose'};
604 if (!$verbose_error && ( $options->{'log'} &&
606 ($options->{'verbose'} & 8) ||
607 ($options->{'verbose'} & 16) ||
608 ($options->{'verbose'} & 32 )
614 "ERROR: The verbosity level '$options->{'verbose'}' does not output anything
615 to a logfile, and you specified '-log'!\n");
618 if (!$verbose_error && ( !$options->{'log'} &&
620 ($options->{'verbose'} & 8) ||
621 ($options->{'verbose'} & 16) ||
622 ($options->{'verbose'} & 32) ||
623 ($options->{'verbose'} & 64)
629 "ERROR: The verbosity level '$options->{'verbose'}' requires that you also
630 specify a logfile via '-log'\n");
634 (_print( "\n". join("\n", @errors), -1), return(0)) if (@errors);
640 my ($text, $flag ) = @_;
642 my $logflag = int($flag/8) * 8;
643 my $regflag = $flag % 8;
645 if ($flag == -1 || ($flag & $options->{'verbose'}))
647 my $dolog = ((($logflag & $options->{'verbose'}) || $flag == -1)
648 && $options->{'log'});
650 my $doreg = (($regflag & $options->{'verbose'}) || $flag == -1);
652 if ($doreg) { print( STDERR $text ); }
653 if ($dolog) { print $_fh $text; }
659 my ($command, $flag) = @_;
661 my $logflag = ($flag != -1)? int($flag/8) * 8 : 0;
662 my $regflag = $flag % 8;
664 if ($flag == -1 || ($flag & $options->{'verbose'}))
666 my $dolog = ($logflag & $options->{'verbose'} && $options->{'log'});
667 my $doreg = (($regflag & $options->{'verbose'}) || $flag == -1);
669 if ($doreg && !$dolog)
670 { system("$command"); }
672 elsif ($doreg && $dolog)
673 { my $text = `$command 2>&1`; print $_fh $text; print STDERR $text;}
675 { my $text = `$command 2>&1`; print $_fh $text; }
690 Usage: $0 <file_list>
693 -L < extra library dirs for installation (form of 'dir1:dir2') >
694 -I < extra include dirs for installation (form of 'dir1:dir2') >
695 -C < explicit name of resulting C code >
696 -o < explicit name of resulting executable >
697 -e < to compile 'one liners'. Need executable name (-o) or '-run'>
698 -regex < rename regex, -regex 's/\.p/\.exe/' compiles a.p to a.exe >
699 -verbose < verbose level (1-63, or following letters 'gatfcd' >
700 -argv < arguments for the executables to be run via '-run' or '-e' >
703 -gen ( to just generate the c code. Implies '-sav' )
704 -sav ( to save intermediate c code, (and executables with '-run'))
705 -run ( to run the compiled program on the fly, as were interpreted.)
706 -prog ( to indicate that the files on command line are programs )
707 -mod ( to indicate that the files on command line are modules )
721 perlcc - frontend for perl compiler
725 %prompt perlcc a.p # compiles into executable 'a'
727 %prompt perlcc A.pm # compile into 'A.so'
729 %prompt perlcc a.p -o execute # compiles 'a.p' into 'execute'.
731 %prompt perlcc a.p -o execute -run # compiles 'a.p' into execute, runs on
734 %prompt perlcc a.p -o execute -run -argv 'arg1 arg2 arg3'
735 # compiles into execute, runs with
736 # arg1 arg2 arg3 as @ARGV
738 %prompt perlcc a.p b.p c.p -regex 's/\.p/\.exe'
739 # compiles into 'a.exe','b.exe','c.exe'.
741 %prompt perlcc a.p -log compilelog # compiles into 'a', saves compilation
742 # info into compilelog, as well
743 # as mirroring to screen
745 %prompt perlcc a.p -log compilelog -verbose cdf
746 # compiles into 'a', saves compilation
747 # info into compilelog, being silent
750 %prompt perlcc a.p -C a.c -gen # generates C code (into a.c) and
751 # stops without compile.
753 %prompt perlcc a.p -L ../lib a.c
754 # Compiles with the perl libraries
755 # inside ../lib included.
759 'perlcc' is the frontend into the perl compiler. Typing 'perlcc a.p'
760 compiles the code inside a.p into a standalone executable, and
761 perlcc A.pm will compile into a shared object, A.so, suitable for inclusion
762 into a perl program via "use A".
764 There are quite a few flags to perlcc which help with such issues as compiling
765 programs in bulk, testing compiled programs for compatibility with the
766 interpreter, and controlling.
772 =item -L < library_directories >
774 Adds directories in B<library_directories> to the compilation command.
776 =item -I < include_directories >
778 Adds directories inside B<include_directories> to the compilation command.
780 =item -C < c_code_name >
782 Explicitly gives the name B<c_code_name> to the generated c code which is to
783 be compiled. Can only be used if compiling one file on the command line.
785 =item -o < executable_name >
787 Explicitly gives the name B<executable_name> to the executable which is to be
788 compiled. Can only be used if compiling one file on the command line.
790 =item -e < perl_line_to_execute>
792 Compiles 'one liners', in the same way that B<perl -e> runs text strings at
793 the command line. Default is to have the 'one liner' be compiled, and run all
794 in one go (see B<-run>); giving the B<-o> flag saves the resultant executable,
795 rather than throwing it away. Use '-argv' to pass arguments to the executable
798 =item -regex <rename_regex>
800 Gives a rule B<rename_regex> - which is a legal perl regular expression - to
801 create executable file names.
803 =item -verbose <verbose_level>
805 Show exactly what steps perlcc is taking to compile your code. You can change
806 the verbosity level B<verbose_level> much in the same way that the '-D' switch
807 changes perl's debugging level, by giving either a number which is the sum of
808 bits you want or a list of letters representing what you wish to see. Here are
809 the verbosity levels so far :
811 Bit 1(g): Code Generation Errors to STDERR
812 Bit 2(a): Compilation Errors to STDERR
813 Bit 4(t): Descriptive text to STDERR
814 Bit 8(f): Code Generation Errors to file (B<-log> flag needed)
815 Bit 16(c): Compilation Errors to file (B<-log> flag needed)
816 Bit 32(d): Descriptive text to file (B<-log> flag needed)
818 If the B<-log> tag is given, the default verbose level is 63 (ie: mirroring
819 all of perlcc's output to both the screen and to a log file). If no B<-log>
820 tag is given, then the default verbose level is 7 (ie: outputting all of
821 perlcc's output to STDERR).
823 NOTE: Because of buffering concerns, you CANNOT shadow the output of '-run' to
824 both a file, and to the screen! Suggestions are welcome on how to overcome this
825 difficulty, but for now it simply does not work properly, and hence will only go
830 Opens, for append, a logfile to save some or all of the text for a given
831 compile command. No rewrite version is available, so this needs to be done
834 =item -argv <arguments>
836 In combination with '-run' or '-e', tells perlcc to run the resulting
837 executable with the string B<arguments> as @ARGV.
841 Tells perl to save the intermediate C code. Usually, this C code is the name
842 of the perl code, plus '.c'; 'perlcode.p' gets generated in 'perlcode.p.c',
843 for example. If used with the '-e' operator, you need to tell perlcc where to
844 save resulting executables.
848 Tells perlcc to only create the intermediate C code, and not compile the
849 results. Does an implicit B<-sav>, saving the C code rather than deleting it.
853 Immediately run the perl code that has been generated. NOTE: IF YOU GIVE THE
854 B<-run> FLAG TO B<perlcc>, THEN THE REST OF @ARGV WILL BE INTERPRETED AS
855 ARGUMENTS TO THE PROGRAM THAT YOU ARE COMPILING.
859 Indicate that the programs at the command line are programs, and should be
860 compiled as such. B<perlcc> will automatically determine files to be
861 programs if they have B<.p>, B<.pl>, B<.bat> extensions.
865 Indicate that the programs at the command line are modules, and should be
866 compiled as such. B<perlcc> will automatically determine files to be
867 modules if they have the extension B<.pm>.
873 Most of the work of B<perlcc> is done at the command line. However, you can
874 change the heuristic which determines what is a module and what is a program.
875 As indicated above, B<perlcc> assumes that the extensions:
879 indicate a perl program, and:
883 indicate a library, for the purposes of creating executables. And furthermore,
884 by default, these extensions will be replaced (and dropped ) in the process of
885 creating an executable.
887 To change the extensions which are programs, and which are modules, set the
888 environmental variables:
893 These two environmental variables take colon-separated, legal perl regular
894 expressions, and are used by perlcc to decide which objects are which.
897 setenv PERL_SCRIPT_EXT '.prl$:.perl$'
898 prompt% perlcc sample.perl
900 will compile the script 'sample.perl' into the executable 'sample', and
902 setenv PERL_MODULE_EXT '.perlmod$:.perlmodule$'
904 prompt% perlcc sample.perlmod
906 will compile the module 'sample.perlmod' into the shared object
909 NOTE: the '.' in the regular expressions for PERL_SCRIPT_EXT and PERL_MODULE_EXT
910 is a literal '.', and not a wild-card. To get a true wild-card, you need to
911 backslash the '.'; as in:
913 setenv PERL_SCRIPT_EXT '\.\.\.\.\.'
915 which would have the effect of compiling ANYTHING (except what is in
916 PERL_MODULE_EXT) into an executable with 5 less characters in its name.
920 'perlcc' uses a temporary file when you use the B<-e> option to evaluate
921 text and compile it. This temporary file is 'perlc$$.p'. The temporary C code is
922 perlc$$.p.c, and the temporary executable is perlc$$.
924 When you use '-run' and don't save your executable, the temporary executable is
929 perlcc currently cannot compile shared objects on Win32. This should be fixed
936 close OUT or die "Can't close $file: $!";
937 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
938 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';