package O;
-use B qw(minus_c);
-use Carp;
+
+our $VERSION = '1.00';
+
+use B qw(minus_c save_BEGINs);
+use Carp;
sub import {
- my ($class, $backend, @options) = @_;
- eval "use B::$backend ()";
- if ($@) {
- croak "use of backend $backend failed: $@";
- }
- my $compilesub = &{"B::${backend}::compile"}(@options);
- if (ref($compilesub) eq "CODE") {
- minus_c;
- eval 'CHECK { &$compilesub() }';
- } else {
- die $compilesub;
+ my ($class, @options) = @_;
+ my ($quiet, $veryquiet) = (0, 0);
+ if ($options[0] eq '-q' || $options[0] eq '-qq') {
+ $quiet = 1;
+ open (SAVEOUT, ">&STDOUT");
+ close STDOUT;
+ open (STDOUT, ">", \$O::BEGIN_output);
+ if ($options[0] eq '-qq') {
+ $veryquiet = 1;
+ }
+ shift @options;
}
+ my $backend = shift (@options);
+ eval q[
+ BEGIN {
+ minus_c;
+ save_BEGINs;
+ }
+
+ CHECK {
+ if ($quiet) {
+ close STDOUT;
+ open (STDOUT, ">&SAVEOUT");
+ close SAVEOUT;
+ }
+
+ # Note: if you change the code after this 'use', please
+ # change the fudge factors in B::Concise (grep for
+ # "fragile kludge") so that its output still looks
+ # nice. Thanks. --smcc
+ use B::].$backend.q[ ();
+ if ($@) {
+ croak "use of backend $backend failed: $@";
+ }
+
+
+ my $compilesub = &{"B::${backend}::compile"}(@options);
+ if (ref($compilesub) ne "CODE") {
+ die $compilesub;
+ }
+
+ local $savebackslash = $\;
+ local ($\,$",$,) = (undef,' ','');
+ &$compilesub();
+
+ close STDERR if $veryquiet;
+ }
+ ];
+ die $@ if $@;
}
1;
=head1 SYNOPSIS
- perl -MO=Backend[,OPTIONS] foo.pl
+ perl -MO=[-q,]Backend[,OPTIONS] foo.pl
=head1 DESCRIPTION
This is the module that is used as a frontend to the Perl Compiler.
+If you pass the C<-q> option to the module, then the STDOUT
+filehandle will be redirected into the variable C<$O::BEGIN_output>
+during compilation. This has the effect that any output printed
+to STDOUT by BEGIN blocks or use'd modules will be stored in this
+variable rather than printed. It's useful with those backends which
+produce output themselves (C<Deparse>, C<Concise> etc), so that
+their output is not confused with that generated by the code
+being compiled.
+
+The C<-qq> option behaves like C<-q>, except that it also closes
+STDERR after deparsing has finished. This suppresses the "Syntax OK"
+message normally produced by perl.
+
=head1 CONVENTIONS
Most compiler backends use the following conventions: OPTIONS
is invoked which can then go ahead and do the compilation, usually by
making use of the C<B> module's functionality.
+=head1 BUGS
+
+The C<-q> and C<-qq> options don't work correctly if perl isn't
+compiled with PerlIO support : STDOUT will be closed instead of being
+redirected to C<$O::BEGIN_output>.
+
=head1 AUTHOR
Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>