/usr/bin/mppb is in makepp 2.0.98.3-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #!/usr/bin/perl -w
#use strict; # TODO: explore why this breaks the builtins.
# $Id: makeppbuiltin,v 1.23 2013/02/16 15:11:37 pfeiffer Exp $
package Mpp;
our $datadir;
BEGIN {
$datadir = '/usr/share/makepp'; unshift @INC, $datadir;
}
$Mpp::Subs::rule->{MAKEFILE}{PACKAGE} = 'Mpp'; # Make it same as ours in eval_or_die
use Mpp::Utils;
use Mpp::Text ();
use Mpp::Cmds;
$Mpp::Text::helpline = 'For command info, click on sidebar "Features" and then "Builtin Commands".';
$Mpp::Text::extraman = '_builtins';
sub eval_or_die($) {
if( wantarray ) {
my @result = eval $_[0];
&maybe_die;
@result;
} else {
my $result = eval $_[0];
&maybe_die;
$result;
}
}
{ no warnings 'redefine'; *Mpp::Cmds::eval_or_die = \&eval_or_die }
# Drop in replacement for getopts, which parses and pretty prints the option
# specification.
sub getopts_help(@) {
my @opts = @_;
print STDERR "$0 options:";
shift @opts if 'HASH' eq ref $opts[0];
my %short;
for( @opts ) {
my $long = Mpp::Text::_getopts_long( $_ );
my $short = $_->[0]; # Show only the 1st short opt (e.g. --fields & --force)
$_ = (($short && !$short{$short}) ? "$_->[0], --$long" : $long) .
($_->[3] ? '=arg' : '');
$short{$short} ||= 1 if $short;
}
for( sort { lc( substr $a, 0, 1 ) cmp lc( substr $b, 0, 1 ) ||
substr( $b, 0, 1 ) cmp substr( $a, 0, 1 ) ||
$a cmp $b } @opts ) {
s/^/-/;
s/^(-.[^,])/ -$1/; # indent only long option further
print STDERR "\n $_";
}
die "\n";
}
my $re = join '|', grep { exists &{"Mpp::Cmds::$_"} && s/^c_// } keys %Mpp::Cmds::;
# This function exists so we can efficiently run many tests in one process.
sub doit {
# Look in our called name to see if it contains a builtin's name.
my $cmd = $0;
if( $0 =~ /($re)[^\/]*$/ ) { # Yes, found a builtin.
$0 = $1;
$cmd = "Mpp::Cmds::c_$0";
} else {
my $tmp;
Mpp::Text::getopts 1,
['I', qr/include(?:[-_]?dir)?/, \$tmp, 1, sub { unshift @INC, $tmp }],
[qw(M module), \$tmp, 1, sub { $tmp =~ s/=(.*)/ qw($1)/ and $tmp =~ tr/,/ /; eval_or_die "use $tmp" }],
splice @Mpp::Text::common_opts;
&Mpp::Text::help unless @ARGV;
$tmp = $0; # 1st argument must be the command name.
$0 = shift @ARGV;
unless( exists &{$cmd = "c_$0"} ) {
$cmd = "Mpp::Cmds::c_$0";
die "$tmp: $0 is not a makepp builtin command.\n" unless exists &$cmd;
}
}
if( @ARGV and $ARGV[0] eq '-?' || $ARGV[0] eq '--help' ) {
no warnings;
*Mpp::Text::getopts = \&getopts_help; # Let the seemingly normal call handle this.
}
if( !$ENV{INSTALL_LOG} && $cmd =~ /install$/ ) {
require Mpp::Makefile;
Mpp::Makefile::find_root_makefile_upwards( $CWD_INFO );
# Fill ->{ROOT} if RootMakeppfile found.
} elsif( $cmd =~ /preprocess$/ ) {
require Mpp::Makefile;
}
&$cmd( @ARGV );
}
doit;
__DATA__
[metaoption ...] command [option ...] [argument ...]
to see options do: makeppbuiltin command --help
Options depend on the command, while metaoptions are these:
-A filename, --args-file=filename, --arguments-file=filename
Read the file and parse it as possibly quoted whitespace- and/or
newline-separated options.
-?, -h, --help
Print out a brief summary of the options.
-I directory, --include=directory, --include-dir=directory
Add directory to Perl load path @INC.
-M module[=arg,...], --module=module[=arg,...]
Load module and import any functions it exports.
-V, --version
Print out the version number.
|