ืืืื ืืคืงืืื makepp_extending ืฉื ืืชื ืืืจืืฅ ืืกืคืง ืืืืจืื ืืืื ืื ืฉื OnWorks ืืืืฆืขืืช ืืืช ืืชืื ืืช ืืขืืืื ืืืงืืื ืืช ืืืจืืืืช ืฉืื ื, ืืืื Ubuntu Online, Fedora Online, ืืืืืืืจ ืืงืืื ืฉื Windows ืื ืืืืืืืจ ืืงืืื ืฉื MAC OS
ืชึธืึฐื ึดืืช:
ืฉืึตื
makepp_extending -- ืืืฆื ืืืจืืื ืืช makepp ืืืืฆืขืืช Perl
ืชืืืืจ
Makepp ืืืืคื ืคื ืืื ืืกืคืืง ืืืืฉ ืื ืฉืขื ืืื ืืชืืืช ืืขื ืงืื Perl, ืืชื ืืืื
ืืืกืฃ ืคืื ืงืฆืืืช ืื ืืฆืข ืืกืคืจ ืคืขืืืืช ืืืจืืช.
ืืืื ืืขืจืืช on ืืชืืื ืคืจื ืงืื ื ืืขืืื ืขื makepp
ืื makefile ืื ืืืืืื ืืฉืื. ืืคืืื ืืืืจืืช ืืงืืืฅ makefile ืืื ืื ืืฉืคืืขืืช
ืืืืจืืช ืืงืืืฅ makefile ืืืจ. ืงืืืฆื ืืฉืืชืคืช ืฉื ืคืื ืงืฆืืืช ืืืื ืื ืืกืื ืืจืืื
ืคืื ืงืฆืืืช ืื ืืคืืืฆืื ืืงืกืืืืืืช ืืืืืืืช ืืืืืื ืืืฉืจ ืืื ื ืืฆืจืช.
ืืฉืชื ื Makefile ืืืืืกื ืื ืืกืงืืจืื ืฉื Perl ืืืืืื ืื. (ืืฉ ืืืฆืืื ืืืืื
ืื: ืืฉืชื ืื ืืืืืืืืื ืืขืจื ืืจืืจืช ืืืืื ืฉื ืืฉืชื ืื ืืื CC ืื ืืืขืฉื
ืืืืฉื ืืคืื ืงืฆืืืช ืืื ืืจืืืื ืืื. ืืืื ืืืืจืก ืกืคืฆืืคืืืช, ืืืจืก ืืฉืืจืช ืืคืงืืื ื
ืกืืืืช vars ืื ื ืจืืื ืื.) ืืื ืืื ืงืื Perl ืฉืืชื ืืืชื ืืฉ ืืืฉื ืืื
ืืฉืชื ื makefile. ืืฉืชื ืื ืืืืืืืื ืืืืืกื ืื ืืืืืืช "Mpp::global". ืึดืจึฐืืึนืช
ืืฉืชื ื Makefile ืืคืจืืื.
ืื ืืืช ืืืืฆืืจืืช (ifperl / ifmakeperl, perl / makeperl, sub / makesub),
ืคืื ืงืฆืืืช (perl / makeperl, map / makemap) ืืคืขืืืช ืืืื (perl / makeperl) ืขืืืจ
ืืชืืืช ืงืื Perl ืืฉืืจืืช ื-makefile ืืืืข ืืฉื ื ืืขืืื. ืืจืืฉืื ืืื ืืืืืืื
Perl ืจืืื, ืืืืืจ ืขืืื ืืืฉืชืืฉ ืืงืืืืืช "f_" ืืคื ืฉืืืกืืจ ืืกืขืืฃ ืืื, if
ืืชื ืจืืฆื ืืงืจืื ืืคืื ืงืฆืืืช makepp. ืืืจืกื ืืฉื ืืื ืชืืืื ืืขืืืจ ืืช ืืืฆืืจื
ืืจืืืช ืืฉืชื ื ืืกืื ืื ืืคืื, ืืืืืจ ืืชื ืฆืจืื ืืืืคืื ืืช ื-"$" ืฉืืชื ืจืืฆื ืฉ-Perl ืืจืื.
ืืืคืื ืืงืฆื ืืื ืืืืื ืืืืืื ืฉืื ืชืื ืื ืืขืฆืืืื ืฉื makepp (ืืืชืื ืืืขืจืืช ืืื ืืื ืฉืื).
ืืืื ืื ืืืืจืฉื ืืกืคืจ ืฉื ืืืช ืืืืกืืฃ ืืฉืคื ืขื ืืฆืืื ืจืืืื. ืื ืื ืื ื ืขืืฉืื ื
ืืฆืืื ืืืื ืืก. ืืชืืืื ืืจืืฉื ืืชื ืขืืืื ืืืื ืืงืื "END" ืืืืงืื ืืื ืื ืืฉ ืื ืืืื
ืืืคืืื ืืงืืฆืื ืืืืืืืื ืฉืื ืขืืืืื ืื ืืืืฉืืฃ. ืืื ืืชื ืฆืจืื ืืืฉืชืืฉ ืืืืืื ื ืืืืืจื ื
ืืืืืช ืงืืฆืื, ืฉื ืกืืจืืช ืืจืืื ืืืฉืจ ืืืฆืืื ืืืชืืื.
ืืงืื Perl ืืจืฅ ืืฉืืจืืช ืืคืขืืืช ืืื ืื ืืืืฆืขืืช ืคืงืืื ืฉืืชื ืืืืืจ, ืื
ืืื. ืืืืงืื ืฉื "END" ืื ืืืคืขืื, ืืื ืคืขืืืืช ืงืืฆืื ืืืืืืืืช ื ืืืงืืช ืขืืืจื. ื
"ืืจืก" ืฉื ืืืืืืงืืื ืืืืืืืื ืืขืืื ืื ืืืคืขื.
ืืืกืืฃ ืืืฉ ืืงืกืืืืืืช ืคืื ืงืฆืืืช
ืืชื ืืืื ืืืืกืืฃ ืคืื ืงืฆืื ืืืฉื ืืจืคืจืืืืจ ืฉื makepp ืคืฉืื ืขื ืืื ืืืืจืช ืชืช ืฉืืจืช Perl ืฉื
ืืืชื ืฉื ืืื ืขื ืงืืืืืช "f_". ืืืืืื:
sub f_myfunc {
$argument ืฉืื = &arg; # ืชื ืฉื ืืืจืืืื ื.
my( undef, $mkfile, $mkfile_line ) = @_; # ืชื ืฉื ืืืจืืืื ืืื.
... ืืขืฉืืช ืืฉืื ืืื
ืืืืจ $return_value;
}
XYZ := $(myfunc my func arguments)
ืื ืืคืื ืงืฆืื ืฉืื ืื ืืืงืืช ืืจืืืื ืืื, ืืื ืื ืืขืฉืืช. ืื ืืคืื ืงืฆืื ืฉืื ืืืงืืช ืืื
ืืจืืืื ื, ืืื ืืืืืื ืืืขืื, ืืฉืชืืฉ ื-accessor ืืคืฉืื &arg ืืื ืืืฉืื ืืืชื. ืื ืืชื
ืืฆืคื ืืืืชืจ ืืืขืื ืื, ืืชื ืฆืจืื ืืช "args" ืืืืจืื ืืืชืจ ืฉื ืืขืืจ ืืืชืืืจ ืืืื.
ืืืืืจืื ืืื ืืขืืืื ืืช ืืืชื ืฉืืืฉื ืคืจืืืจืื ืฉืืฉ ืืืขืืืจ ืืื "f_"
ืคืื ืงืฆืื, ืืืืืจ ืืืจืืืื ืืื ืฉื ืืคืื ืงืฆืื, ืืืืืืืงื makefile ืืืชืืจ ืฉืืจื ืขืืืจ
ืืืืขืืช. ืืื ืืชื ืืืื ืืืฉืชืืฉ ืืืืคืก &arg ืืืขืื ืืืงืจื ืืจืืฉืื.
ืื ืื ืื &arg ืืืคื ืืคืขืืืืช ืืืืืช ืขืืืจื: ืื ืืืืขืื ืื ืืืจ ืืื
ืืืจืื (ืืืฉื ืืื ืืืฆืื ืืช ืฉื ืืคืื ืงืฆืื ื-"$(my$(function) arg)" ื-arg ืืื
ืขืืจ ืืืืจืืืช ืืจืง ืืืจ. ืื ืืืืขืื ืขืืืื ืืงืืง ืืืจืืื, ืื ื
ืืืงืจื ืจืืื, ืื ืืืงืื ืืืช ืืคื ืื ืืืืจืืืช. ืืขืืจ &arg ืืจืืื ืืืชื ืขืืืจื,
ืขืืืจื ืืื ืฆืจืื ืืช ืืืืืืืงื makefile ืืชืืจ ืืคืจืืืจ ืืฉื ื ืฉืื.
ืื ืืชื ืืฆืคื ืืืืชืจ ืืจืืืื ืืื, ืืืื ืืืกืคืจ ืืฉืชื ื, ืืขืืืื ืืชืืฆืขืช ืขื ืืื "args".
ืืขืืจ ืืื ืืืงื ืืช ืืืชื 3 ืคืจืืืจืื ืืื arg, ืืชืืกืคืช ืคืจืืืจืื ื ืืกืคืื:
ืืงืกืืืื: ืืกืคืจ args (ืืจืืจืช ืืืื 2): ืชื ~0 (maxint) ืขืืืจ ืืื ืกืืคื
min: ืืกืคืจ args (ืืจืืจืช ืืืื 0 ืื ืืืงืกืืืื ืืื ~0, ืืืจืช ืืื ืืืงืกืืืื)
only_comma: ืื ืชืืื ืจืืื ืกืืื ืคืกืืงืื, ืจืืื ืขืืืจ ืฉืืื ื ืฉื ืงืืืฅ
ืืื ืืืืชืจ ืืงืกืืืื, ืืื ืืคืืืช ืคืกืืงืื ืืื ืืืืืื ืืงืืืืื ืืคื ื ืืจืืื ืืฉืืฉืื ืืคืืฆืื
ืืืขืื ืื. ืืื ืืืืืืืช ืืืคืื ืงืฆืืืช ืืืืื ืืช ืฉื makepp:
my( $prefix, $text ) = args $_[0], $_[1], $_[2], 2, 2, 1; # addprefix
ืขืืืจ $cond ืฉืื ( args $_[0], undef, $_[2], ~0 ) ... # ื, ืื
my @args= args $_[0], $_[1], $_[2], ~0, 1, 1; ืฉืืื ืืืช
my( $filters, $words) = args $_[0], $_[1], $_[2]; ืืกื ื #
ืืคืื ืงืฆืื ืฆืจืืื ืืืืืืจ ืืืจืืืช ืกืงืืจืืช (ืื ืืขืจื) ืืฉืจ ืืืื ืกืช ืืืืจ ืืื ืืชืื
ืืงืกื ืืืืชื ืฉืื.
ืื ืืคืื ืงืฆืื ืฉืื ื ืชืงืืช ืืฉืืืื, ืืื ืืืืจื ืืืืช ืืืืฆืขืืช ืืืฉืคื ืืจืืื ืฉื Perl die.
ืื ืืืื ืขื ืืื makepp ืืืืืขืช ืฉืืืื ืืืฆืืื ืืช ืฉื ืืงืืืฅ ืืืฉืืจื
ืืกืคืจ ืืืืืื ืฉืืืจื ืืฉืืืื ืืืืคืก.
ืืืขืฉื ืืื ืืืืืืช ืขื ืื ืฉืืคืื ืงืฆืื ืืืืื ืืขืฉืืช; ืืชื ืืืื ืืืฉืช ืืงืืืฅ, ืืจืฅ
ืคืงืืืืช ืืขืืคืช ืืื'.
ืืืื ืืืจืืืื ืืืืืืื ืืืืคืืขืื ืืชืืืช ืืืคืขืืืืช ืืืื
ืคืขื ืืืช ืืขืื ืืืืืืื ืืืืคืืขืื ืืืืจืืช ืืืจืืืื ืคืขืืืื, ืื ืืืืืจ ืื ืืชื
ืืคืื ืงืฆืื ืืฉ ืชืืคืขืืช ืืืืื ืืืื ืงืืืืช ืืืืืื ืืืืจื.
ืฉืืื ืื ืฉืืกืืืื (ืืืืืื ื-cwd) ืฉืื ืืคืื ืงืฆืื ืืขืจืืื ืชืืื
ืื ืืืืจื ืชืืื ืืช ืืกืืืื ืฉืื ืืืืืื ืื-Makefile ืฉืื
ืืคืื ืงืฆืื ืืืขืจืื ืืืืฆืขืืช. ืื ืื ืืขืื ืขืืืจื, ืื ืืคืื ืงืฆืื ืฉืื
ืื ืจืื ืฆืจืื ืืืืจืืืช ืืขืจื ืื:
sub f_foo {
...
chdir $makefile->{CWD};
... ืืื '
}
ืืื ืืก ืคืื ืงืฆืืืช ืื ืชืื a ืคืจื ืืืืื
ืื ืชืื ืืก ืคืื ืงืฆืืืช ืืงืืืฅ include, ืืืื ืื ืขืืชืง ืืื ืืื Makeppfile ืืฉืจ
ืืฉืชืืฉ ืื. ืืื ืืืืื ืข ืืื, ืืชื ืืืื ืืืชืื ืืืชื ืืืืืื Perl ืจืืื ืขื "ืืฆืืื"
ืืืฉืง, ืืืืฉืชืืฉ ืืื. ืื ืืืืขื ืืืจ ืืืชืจ ืืืืกืื ืืืืจืื:
perl { ืืฉืชืืฉ ื- mymodule }
perl {
ืืฉืชืืฉ ื::module ืฉืื; # ืืฉืื : ืืฉืืจื ืืืฉื ืื ืื ืื ืื ืืชื ืืืื
}
ืื ืืชื ืืงืืง ืืืืช ืืืคืื ืงืฆืืืช ืืืืื ืืช ืืืจื ืืื ื-Makefile (ืืื ื-"f_"
ืคืื ืงืฆืืืช, "arg" ืื "args"), ืขืืื ืืืื ืืก ืืช ืืฉืืจื ืืื ืืืืืื ืฉืื:
ืืฉืชืืฉ ื-Mpp::Subs;
ืืืืกืจืื ืืื ืฉืืืืืื ืืืื ืืืืืื ืฉืื ื ืืคืื ืงืฆืื ืืฉืืจืืช
ืืืคืืข ืืงืืืฅ makefile. ืื ืืชื ืฆืจืื ืืืขืืืจ ืืื ืืคืจืืืจืื, ืื ืืื ืืช
ืฉืืืช ืขื ืคืื ืงืฆืืืช ื"ืืชืงืฉืจ" ืฉื ืคืจื.
ืึดืขืึผื ืืืฆืื ื ืคืจื ืกืงืจืืคืืื
ืื ืืชื ืงืืจื ืืกืงืจืืคื ืืืฆืื ื ืฉื Perl ืืจื "ืืขืจืืช", ืื ืืืื ืคืขืืื, makepp ืืืืง ื
ืชืืืื ืืืฉ (ืืื ืื ืื ืื ืคืขืืืช ืืืื ืืืืจืื ื) ืืืคืืจ ืืชืืจืืื ืืืฉ ืืืืจื ืฉื perl.
ืืื ืืื ืฉืื ืืืจ ืจืข, ืืืฅ ืืื ืฉืืฉ ืืจื ืืขืืื ืืืชืจ:
&ืืคืงืืื ืืืืืืื ...
ืื ืืืืื ืืืืืช ืคืขืืืช ืืื. ืื ืืงืจื ืืคืื ืงืฆืื ืืคืงืืื ืขื ืงืืืืืช "c_", ื
ืืขืืืจื ืืช ืืฉืืจ (ืืืคืฆืืื ืื ืืฆืืื ืืกืื ืื makepp -- ืื ืืืืืง ืืืชื ืืืืจ ืืื
ืืขืืคืช) ืืืขืื ืื. ืื ืื ื ืืชื ืืืฆืื ืคืื ืงืฆืื ืืื, ืื ืืขืืืจ ืืช ืื ืืืืจืืืืช ืื
"ืึธืจืึผืฅ".
sub c_mycmd { my @args = @_; ... }
$(phony callcmd):
&mycmd 'arg with space' arg2 "arg3" # ืงืืจื ื-c_mycmd
%.out: %.in
&myscript -o $(output) $(input) # ืงืืจื ื-myscript ืืืฆืื ื
ืืชื ืืืื ืืืชืื ืืช ืืคืงืืืืช ืฉืื ืืืกืืจืช ืืจืืืืื ืืืืื ืื, ืืืืคืฉืจืื ืื ืืืฉืชืืฉ
ืืืชื ืืคืฉืจืืืืช ืกืื ืืจืืืืช ืืื ืฉืืฉ ืืื, ืืืืคืื ืืงืื/ืคืื ืฉืื ื ืืชื ืื.
ืืืคืจืืืจ ืืืืืง "Mpp::Cmds::frame" ืืืืื ืืจืฉืืืช ืืคืฉืจืืืืช ืฉื ืืืชืืืช ืืืืืืช
ืืจืืืืื ืืืืื ืื (ืืงืกืืืื "qw(fi I โโo O rs)"). ืื ืื ืชืฆืืื ืืคืฉืจืืช ืืฉืื
ืื ืชืขืงืืฃ ืืื ืืืื, ืืชื ืขืืืื ื ืืชื ืืช ืืืืช ืืืืืืช ืฉื ืืืคืฉืจืืช ืืกืื ืืจืืืช.
ืื ืืคืฉืจืืช ืืฉืื ืืฆืืื ืช ืืชืืจ "[qw(n name), \$ref, ืืจื, ืชึทืช]". ืืฉื ืืื ืืจืืฉืื ืื
ืืืืื ืืื ืื ืฉื ืงืฆืจ ืืืจืื, ืืืืจืื ืืคื ืื ืืืฉืชื ื ืืืคื ืืืคืฆืื ืขื ืืื
ืืืืืื ื ืื ืืงืืช ืืืืื. ืืื arg, ืืืฉืชื ื ืืื
ืืื ืืื ืคืขื ืฉืืืคืฉืจืืช ื ืืชื ืช, ืืืจืช ืขืจื ืืืืคืฆืื ืืืืืกื ืื.
sub c_my_ocmd { # ืืงืจื ืคืื ืืืคืืกื
ืืงืืื @ARGV = @_;
Mpp::Cmds::frame {
... ืืืืคืืก ืืฉืื ืืื ืขื @ARGV, ืขื ืืคืฉืจืืืืช ืฉืืืจ ืืืกืจื ืืืืืืืืช
} 'f', qw(o O);
}
sub c_my_icmd { # ืืงืจื ืงืื ืืืคืืกื ืขื 2 ืืคืฉืจืืืืช
ืืงืืื @ARGV = @_;
my( $short, $long );
Mpp::Cmds::frame {
... ืชืขืฉื ืืฉืื ืืื ืขื <>
} qw(i I rs), # s ืืฆืืื ืจืง --ืืคืจืื, ืื -s
[qw(s short), \$short], # No option arg -> $short == 1
[qw(l long), \$long, 1, sub { warn "got arg $long"}];
}
ืืื ืืืืขื ืคืงืืื ืคืฉืืื ืืฉืจ ืืขืื ืจืง ืืช ืืชื ืืจืืฉืื ืฉื ืื ืงืื
ืจืฉืืื (ืฉืืื ื-"&sed '$$_ = "\u\L$$_"'"):
sub c_uc {
ืืงืืื @ARGV = @_;
Mpp::Cmds::frame {
ืืืคืก "\u\L$_" ืืืื <>;
} 'f', qw(i I o O rs);
}
ืืชืื ืืืืืง ืืืืืคื ืขื ืืื ืืกืืจืช, ืืชื ืืืื ืืงืื ืืืืงืื ืืงืื ื ืื ืืืืฆืืข ืงืจืืื
ืคืขืืืืช, ืืื ืคืชืืืช ืงืืฆืื ืืืจืื.
Mpp::Cmds::perform { ... } 'ืืืืขื';
ืื ืืืฆืื ืืืืขื ืขื "--verbose" (ืฉืื ืคืงืืื ืืงืืืช) ืื ื
ืืคืงืืื ืืืคืขืืช ืืืฆืืื. ืืื ืื ืืืืืง ืืืขืจื ืืฉืงืจื, ืืื ืืช ืขื
ืืืืขื ืืืืืืช.
ืึธืจืึผืฅ ืชืกืจืื ืืืืืืื ...
ืืืื ืคืื ืงืฆืืืช Perl ืจืืืื ืฉืชืืื ืืืฉืชืืฉ ืื ืืื ืืงืฉืจ ืฉื Perl ืืชืื ื-makefile ืฉืื.
ืื ืืืื ืืฆืืจืช ืืืขืจืืช ืืจืืืช ืืืขืื ืื, ืืื ืืื ืืจืืฅ ืืช ืืกืงืจืืคื ืฉื Perl ืืชืืื
ืืชืืืื ืื ืืืื. ืขืืืจ ืืฆืืจืืช makepp, ืคืื ืงืฆืืืช perl ืื ืคืื ืงืฆืืืช ืืฉืื
ืื ืืชืืืื ืฉืืจืืฅ makepp. ืืื ืขืืืจ ืืื ืื ืชืืืื ืืืฉื ื ืฉืืืฆืข
ืื. ืืชืกืจืื ืื ืืชื ืืื ืคืขืืื ืฉืืื ื ืงืจื, ืืื ืืชื ืืืื ืืฉืื ืืช ืืืืืชื
ืืขืืื ืืชืื lib, ืืคื ืฉืขืืฉื pod2html. ืื lib ืื ืืืื ืืืชืจืื ืืจืื ืืขืืืื ื, ืื
ืฉืื ืืืจ ืงืืื:
perl { use mylib } # ืืชืคืฆื ืืื ืืืืืื ืฉืืื ื ืฆืจืืืื ืืฉื ืืช ืืช ืื
%.out: %.in
makeperl { ืืจืฅ qw'myscript -o $(ืคืื) $(ืงืื)' }
ืื ืืกืงืจืืคื ืงืืจื "ืืฆืืื", ืกืืืจ ืืชืืจื ืงืืฆืื ืกืื ืืจืืืื ืื ืืกืชืื ืขื ืืืขืจืืช
ืืื ืื ืงืืช ืืืจืื (ืคืชืื ืงืืฆืื, ืืืืจืื...), ืื ืืืืื ืืืืืช ืืขืื ืขื "ืืคืขืื". ืื
ืืชื ืงืืจื "ืจืืฅ" ืืชืื ืืฆืืจืืช ืื ืคืื ืงืฆืืืช perl, makepp ืืืื ืืืคืจืืข ืื
ื ืืงืื ืืชืจืืฉ ืจืง ืืกืืฃ ืืืืืงืืค.
ืื ืืฉ ืื ืืืช ืืืืขืืืช ืฉืืืืืจื ืืขืื, ืืคืขื ืืช ืืกืงืจืืคื ืืืฆืื ืืช, ืืืืืจ ืืื ื-
ืืช ืฉืืจืช ืืคืงืืื ืืืงืื. ืืืกืืจืช ืืื ื ืืงืื ืืื ืคืืืช ืืขืื, ืืืืืื ืื
ืืคืขืืื ืืืจืื ื ืฉื ืืื, ืืืืืื ืฉืชืืืื ืืืฉื ื ืฉื ืืืื ืืืฆื ืืืืจ ืืื ืืื ืืงืจื,
ืืืขื ืืืืื ืืืก.
ืืชืืื ืฉืึถืึฐืึธ ืฉืึถืืึน ืึฒืชึดืืึธื ืฉืืืืช
ืืคืขืืื ืืชื ืจืืฆื ืฉ-makepp ืืืฉื ืฉืืืช ืืชืืื ืืืื ืืงื ืืืจืช. ื
ืืืืืื, ื ื ืื ืฉืืฉ ืื ืงืืืฅ ืืื ืืจื ืฉืชืืื ืืกืคืจืืื ืืฉืืชืคืช. ืืืจื ืืื, ืื ืืชื
ืืฉื ืืช ืืช ืืกืคืจืืื ืืืฉืืชืคืช, ืืื ื ืฆืจืื ืืงืฉืจ ืืืืฉ ืงืืืฆื ืืคืขืื ืฉืชืืืืื ืื ืืืืืื
ืืงืืฉืืจ ื ืขืฉื ืืืื ืจืืฆื. (ืขื ืืืช, ืืืชืื ืฉืงืืฉืืจ ืืืืฉ ืฉื ืงืืืฅ ืืืคืขืื
ืืืชืื ืฉืืืื ืฆืืจื, ืืื ืืกืืื ืฉืื ืืคืืชื ืืช ืื ืืืจืืจืช ืืืืื.) ืื ืฉืืชื ืจืืฆื makepp
ืืขืฉืืช ืืื ืืงืื ืืช ืืืชื ืืชืืื ืขืืืจ ืืกืคืจืืื ืืืฉืืชืคืช ืื ืื ืืื ืืฉืชื ื.
ืื ืืืื ืืืชืืฆืข ืืืื ืืจืืื. ืืืจื ืืงืื ืืืืชืจ ืืื ืืืฆืืจ ืืืฉ ืืฉืื
ืฉืืืช ืืชืืื (ืืืื ื ืงืจื ืืื "shared_object"). ืืืืช ืืฉืชืืฉ ืืฉืืืช ืืืชืืื ืืื
ืจืง ืขื ืืืืื ืืืงืฉืจืื ืืื ืืจืืื, ืืื ืื:
myprogram: *.o lib1/lib1.so lib2/lib2.so
: ืืชืืื shared_object
$(CC) $(inputs) -o $(output)
ืืขืช ืขืืื ื ืืืฆืืจ ืืช ืฉืืืช ืืืชืืื.
ืื ืฉืืืืช ืืืชืืื ืืืืืืช ืืืืืช ืืืืงื ืืฉืืื, ืืืืืืงื ืืืืืช ืืืืื ืืื ืืืืืืื
ืคืจืืืื (ืจืื Mpp/Signature.pm ืืืคืฆื ืืคืจืืื). ืฉื ืืืืชื ืืืื ืืืืืช
ืขื ืงืืืืืช "Mpp::Signature::", ืื ืืืงืจื ืื ืืฉ ืืงืจืื ืืืืชื ืฉืื ื
"Mpp::Signature::shared_object". ืขืืื ื ืืืฆืืจ ืงืืืฅ ืืฉื shared_object.pm ืืฉืื
ืื ืืชืื ื Mpp::ืืชืืื ืกืคืจืืื ืืืคืฉืื ื-Perl include path; ืืืงืื ืืื ืงื
ืขืฉืื ืืืืืช ื MPP/ืืชืืื ืกืคืจืืื ืืืชืงื ืช makepp (ืืืฉื,
/usr/local/share/makepp/Mpp/Signature ืื ืืืื ืฉืืชืงื ืช ืืืชื).
ืืคืจืืื ืืืืืงืื ืขื ืื ืฉืฆืจืื ืืขืืืจ ืืฉืืขืืจ ืื, ืืืื ืืืืืง ืืืื
ืืงืืืฅ Mpp/Signature.pm ืืื ืจืื ืื Mpp/Signature/exact_match.pm ืืืืืงืืค
ืืคืฆื. ืืื ืืืงืจื ืฉืื ื, ืื ืื ืฉืื ืื ื ืจืืฆืื ืืขืฉืืช ืืื ืืขืฉืืช ืฉืื ืื ืงืื ืืืื ื-
ืื ืื ืื ืืชืืื ืงืืื; ืื ืืงืืืฅ ืืื ืกืคืจืืื ืืฉืืชืคืช, ืื ื ืจืืฆืื ืฉืืืื ืงืืืข
ืืชืืื, ืืขืื ืฉืื ืืงืืืฅ ืืื ืืฉืื ืืืจ, ืื ืื ื ืจืืฆืื ืืืกืชืื ืขื ืืจืืื ืฉื makepp
ืื ืื ืื ืืชืืื. ืืืจื ืืืืื ืืืืชืจ ืืขืฉืืช ืืืช ืืื ืืจืฉืช ื
"Mpp::Signature::c_compilation_md5", ืฉืืื ืฉืืืช ืืืชืืื ืฉื ืืืจืช ืืืจื ืืื
ืืืฉืจ makepp ืืืื ืคืงืืืช ืงืืฉืืจ.
ืื ืืงืืืฅ Mpp/Signature/shared_object.pm ืขืฉืื ืืืืื ืืช ืืืืจืื ืืืืื:
ืืฉืชืืฉ ืืืืืจืื;
ืืืืื Mpp::Signature::shared_object;
ืืฉืชืืฉ ื-Mpp::Signature::c_compilation_md5;
@ISA = qw(Mpp::Signature::c_compilation_md5); # ืฆืืื ืืจืืฉื.
$shared_object ืฉืื ื = ืืจืื \@ISA; # ืคืืกืช ืงืกื ืฉืขืืืจืช ื-makepp ืืืฆืื
# ืชืชื ืืฉืืจืืช ืืฉืืื ืื. ืืช ืื
# ืฉืืืืช ืืชืืื ืืืืืืช ืืืืืช ืืืช ืืืื.
# ืืขืจื ืืื ื ืืฉืืืืฉ, ืจืง ืืื ืืืืืืงื.
# ืขืืฉืื ืื ื ืืฉืืื ืฉื ืงืจืืช ืืฉืื ืื ื ืฆืจืืืื ืืช ืืืชืืื ืฉื
# ืื ืืขื ืื ืชืืืช ืฉืขืืืจื ืฉืืืช ืืืชืืื ืืื ืคืขืืื:
ืืชืืืช ืืฉื ื {
my ($self, # ืื ืืืื ืืื ื-$shared_object.
$finfo) = @_; # ืืื ื ืืืืื ืฉืืืื ืืื
# makepp ืืืืข ืขื ืืงืืืฅ ืืื. ืึดืจึฐืืึนืช
# Mpp/File.pm ืืคืจืืื.
if ($finfo->{NAME} =~ /\.s[oa]$/) { # ืืื ืฉื ืืงืืืฅ ืืกืชืืื ื-.so ืื .sa?
ืืืืืืจ $finfo->file_exists ? 'ืงืืื' : '';
# ืชืืื ืืืืจ ืืช ืืืชื ืืชืืื ืื ืืงืืืฅ
# ืงืืื. ืืืงืจื ืื, ืืืชืืื ืืื
ืืืจืืืช ืืืช "ืงืืืืช".
}
Mpp::Signature::c_compilation_md5::signature;
# ืื ืืงืืืฅ ืื ืืกืชืืื ื-.so ืื .sa,
# ื ืฆืื ืืฉืืืช ืืืชืืื ืืจืืืื ืฉื makepp.
}
ืงืืืฅ ืื ืืกืืคืง ืืืืืื ืืืคืฆืช makepp, ืขื ืืื ื ืืกืคืื
ืชืืืืืช.
ืืื, ืืื ืฉืื ื ืืคืื ืืช ืื ืืืจืืจืช ืืืืื? ืืืื, ืืฉ ืืงืจืื ืฉืืื ืืฉื ืื ื
ืกืคืจืืื ืืฉืืชืคืช ืชืืจืืฉ ืงืืฉืืจ ืืืืฉ ืฉื ืืชืืื ืืช ืฉืื. ืื ืื ืคืขื ืชืฉื ื ืื ืืช
ืกืืืื ืฉืกืคืจืืื ืืฉืืชืคืช ืืืืืจื, ืื ืืกืืืื ืฉืืื ืชืืืื ืืกืคืจืืืช ืืืจืืช
ืฉืื, ืืคืขืืื ืืฉ ืฆืืจื ืืงืืฉืืจ ืืืืฉ.
ื ื ืื, ืืืฉื, ืฉืืกืคืจืืื ืืืฉืืชืคืช ืืคืขืืื ืืื ืชืชื ืฉืืจืืช ืฉืืชืืื ืืช ืฉืื
ืืกืคืง. ืืืืืื, ื ื ืื ืฉืืชื ืืฉื ื ืืช ืืกืคืจืืื ืืืฉืืชืคืช ืื ืฉืืื ืชืชืงืฉืจ ืืขืช ืืกืคืจืืื ืืืฆืื ืืช
ืชืช ืฉืืจืช "xyz()". ืืื ืื ืื ืืชื ืืฉืชืืฉ ืืืคืฉืจืืช "-E" ืื "--export-dynamic" ืืงืืฉืืจ
(ืขืืืจ GNU binutils; ืืืงืฉืจืื ืืืจืื ืืฉ ืฉืืืช ืืคืฉืจืืืืช ืฉืื ืื), ืืืชืื ืฉืืกืื "xyz()" ืื
ืืืืืช ื ืืืฉ ืืืงืฉืจ ืฉื ืืื ืืจืืฆื ืื ืื ืืื ืงืืื ืืชืืื ืืช ืฉืื.
ืืจืืข ืืื, ื ื ืื ืฉืืืืจืช "xyz()" ืืกืคืจืืื ืืืจืช (ืงืจื ืืื libxyz), ืืื:
my_program: main.o lib1/lib1.so xyz/libxyz.a
ืืืืืื ืฉ"libxyz" ืืื ื .a ืงืืืฅ ืืื ื .ืืื ืงืืืฅ, ืื ืืืื "xyz()" ืื ืืืืฉื ืคื ืืื
ื ืืื ื libxyz.a ืืื ืื ืื ืชืงืฉืจ ืืืืฉ ืืช ืืืื ืืจื ืฉืื.
Mpp::ืฉืืืืช ืืชืืื ืื ืฉืืืืืช ืื ืจืง ืืืืจืืืช ืืืฉืืฉืช ืืื ืืงืืืข ืื ื
ืืงืืืฅ ืืฉืชื ื, ืืื ืืืืืืจืืชื ืืืฉืืฉ ืืืฉืืืืช ืืืืจืืืืช. ืืืืืื, ื
ืฉืืืช ืืืชืืื "target_newer" ืืืคืฆืช makepp ืจืง ืืืจืฉืช ืฉื-
ืืืขืืื ืืืื ืืืฉืื ืืืชืจ ืืืชืืืช, ืืขืื ืฉืฉืืืช ืืืชืืื "exact_match" (and
ืื ืื ืฉืชืืื ืื, ืืืื "md5" ื-"c_compilation_md5") ืืืืื ืืช ื-
ืืงืืืฅ ืืฉ ืืช ืืืชื ืืชืืื ืืื ื-build ืืืืจืื.
ืื ื ืืื ืกืืืื ืืืจืื ืฉื ืฉืืืืช ืืชืืื ืฉืขืฉืืืืช ืืืืืช ืฉืืืืฉืืืช ืืื ืืขืืืจ ืื ืืืืื
ืืืคืฉืจืืืืช. ืื ืืืจื ืืืืืช ืืกืคืืงื, ืืืชืื ืฉืืืง ืืื ืืืื ืืกืืคื ืฉื ืืืจ
ืืฉืืื ืืืืืงืืค:
ยท ืฉืืืช ืืชืืื ืืกืคืจืืืช ืืฉืืชืคืืช ืืืืืืจื ืกืืื ืืืงืืจืช ืฉื ืื ืืืืืฆืืื
ืกืืืื, ืืื ืืช ืื ืืกืืืื ืฉืืื ืฆืจืื ืืกืคืจืืืช ืืืจืืช. ืื ืคืืชืจ ืืช
ืืขืื ืขื ืืืืืื ืฉืืืขืื, ืืืืืืื ืงืืฉืืจ ื ืืื ืืื ืื ืกืืืืช.
ื ืขืฉื ื ืืกืืื ื ืืกืืื ื ืืขืฉืืช ืืืช ืืืคืฆืช makepp (ืจืื
Mpp/Signature/shared_object.pm), ืืื ืื ืืขืืื ืจืง ืขื GNU binutils ื-ELF
ืกืคืจืืืช ืืจืืข.
ยท ืฉืืืช ืืชืืื ืฉืืชืขืืืช ืืืืชืืช ืชืืจืื ืฉื ืืชืืช ืืงืืืฅ. ืืืฉื, ืื ืืชื
ืืืฆืืจ ื .c ืงืืืฅ ืืืืืืื ืืืืฆืขืืช ืชืืื ื ืืืฉืื ืฉืืชืขืงืฉืช ืืฉืื ืืืจืืืช
ืืฆืืจื ืืื:
static char * date_stamp = "ื ืืฆืจ ืืืืืืืืช ื-01 ืืืคืจืื 2004 ืขื ืืื ืืฃ ืืื";
ืืชื ืืืื ืืืชืื ืฉืืืช ืืชืืื ืฉืืชืขืืืช ืกืคืฆืืคืืช ืืฉืื ืืืื ืืืืชืืืช ืชืืจืื.
ืืคืืื, ืื ืืืชืืช ืืชืืจืื ืืื ืืืืจ ืืืืื ืฉืืฉืชื ื, makepp ืื ืืื ื ืืืืฉ.
ยท ืฉืืืช ืืชืืื ืืืืฉืืช ืืช ืืืชืืืืช ืืืจื ืืจืืืื, ืื ืืชืขืืืช ืื-
ืชืืืช ืืืืจืืืืืช ืืขืช ืืืืืื ืื ืืื ืืช ืืืืฉ. ืื ืืืื ืืืืืช ืฉืืืืฉื ืขืืืจ
ืงืืฆืื ืืืืช ืืืชื ืชืืืืื ืืืจืืืืงืืืจื; ืืจืืข ืื ืืชื ืืื ื ืขื ืืจืืืืงืืืจื ืืืช,
makepp ืืชืขืงืฉ ืืื ืืช ืืืืฉ ืืคืืื ืงืืฆืื ืืืชื ืชืืืืื ืืืจืืืืงืืืจื ืืฉืชืืืืฃ
ืืืจืืืืงืืืจื ืืืจืช.
ยท ืฉืืืช ืืชืืื ืฉืืืืขืช ืืืชืขืื ืืืขืจืืช ืืงืืฆื ืืืงืก, ืืื ื
ืฉืืืช "c_compilation_md5" ืืืืขืช ืืืชืขืื ืืืขืจืืช ืืงืืฆื C.
ยท ืฉืืืช ืืชืืื ืืฉืืืคืช ืชืืขืื ืืืืืืืืช ืืืืืงืช ืจืง ื-
ืืขืจืืช ืฉืืืืฅ ืชืืขืื ืฆืจืื ืืืชืขืื ืืฉืื ืืืื ืืืจืื ืืืงืืจ
ืงืืืฅ.
ืื ืืืืจ
ืืกืื ืื ืขืืืื ืื ืืกืชืืื. ืื ืฆืจืื ืืืกืืช ืืื ืืืชืื ืกืืจืงืื ืืฉืื ืขืืืจ
ืืืืื ืงืืฆืื ืืืืจืื ืืืื.
ืืฉืชืืฉ ื-makepp_extending ืืืื ืืจื ื ืืืืฆืขืืช ืฉืืจืืชื onworks.net