ããã¯ãUbuntu OnlineãFedora OnlineãWindows ãªã³ã©ã€ã³ ãšãã¥ã¬ãŒã¿ãŒãMAC OS ãªã³ã©ã€ã³ ãšãã¥ã¬ãŒã¿ãŒãªã©ã®è€æ°ã®ç¡æãªã³ã©ã€ã³ ã¯ãŒã¯ã¹ããŒã·ã§ã³ã® XNUMX ã€ã䜿çšããŠãOnWorks ç¡æãã¹ãã£ã³ã° ãããã€ããŒã§å®è¡ã§ããã³ãã³ã makepp_extending ã§ãã
ããã°ã©ã ïŒ
NAME
makepp_extending -- Perl ã䜿çšã㊠makepp ãæ¡åŒµããæ¹æ³
DESCRIPTION
Makepp ã¯å éšçã«ååãªæè»æ§ãåããŠãããããå°ã Perl ã³ãŒããæžãã ãã§ã次ã®ããšãå¯èœã«ãªããŸãã
é¢æ°ãè¿œå ãããããã®ä»ã®ããŸããŸãªæäœãå®è¡ãããã§ããŸãã
ããŒã on æžã蟌㿠ããŒã« ã³ãŒã ããž ã ãã±ãã
åã¡ã€ã¯ãã¡ã€ã«ã¯ç¬èªã®ããã±ãŒãžå ã«ååšããŸãã ãããã£ãŠãXNUMX ã€ã® Makefile å ã®å®çŸ©ã¯åœ±é¿ãäžããŸããã
å®çŸ©ã¯å¥ã®ã¡ã€ã¯ãã¡ã€ã«ã«ãããŸãã ãã¹ãŠã®æšæºæ©èœãå«ãå ±éã®é¢æ°ã»ãã
ããã¹ãæäœé¢æ°ã¯ãããã±ãŒãžã®äœææã«ããã±ãŒãžã«ã€ã³ããŒããããŸãã
Makefile å€æ°ã¯ããã®ããã±ãŒãžã« Perl ã¹ã«ã©ãŒãšããŠä¿åãããŸãã (äŸå€ããããŸããã
ãã: èªåå€æ°ãš CC ãªã©ã®å€æ°ã®ããã©ã«ãå€ã¯å®éã«ã¯
åŒæ°ãªãã®é¢æ°ãšããŠå®è£ ãããŸãã ã¿ãŒã²ããåºæã®å€æ°ãã³ãã³ãã©ã€ã³å€æ°ãããã³
ç°å¢å€æ°ã¯ãã®ããã«ã¯è¡šç€ºãããŸããã) ãããã£ãŠãäœæãã Perl ã³ãŒãã¯ãã¹ãŠã®ç°å¢å€æ°ã«ã¢ã¯ã»ã¹ã§ããŸãã
ã¡ã€ã¯ãã¡ã€ã«å€æ°ã ã°ããŒãã«å€æ°ã¯ãMpp::globalãããã±ãŒãžã«ä¿åãããŸãã èŠã
詳现ã«ã€ããŠã¯ Makefile å€æ°ãåç §ããŠãã ããã
åã¹ããŒãã¡ã³ã (ifperl / ifmakeperlãperl / makeperlãsub / makesub)ã
é¢æ° (perl / makeperlãmap / makemap) ããã³ã«ãŒã« ã¢ã¯ã·ã§ã³ (perl / makeperl)
Makefile ã« Perl ã³ãŒããçŽæ¥èšè¿°ããæ¹æ³ã«ã¯ XNUMX ã€ã®æ¹æ³ããããŸãã äžã€ç®ã¯çµ¶å¯Ÿã«
éåžžã® Perl ã®å Žåã次ã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«ãf_ããã¬ãã£ãã¯ã¹ã䜿çšããå¿ èŠãããããšãæå³ããŸãã
makepp é¢æ°ãåŒã³åºããããšããŸãã XNUMX çªç®ã®ããªã¢ã³ãã¯ãæåã«ã¹ããŒãã¡ã³ããæž¡ããŸãã
Make ã¹ã¿ã€ã«ã®å€æ°å±éãã€ãŸããPerl ã«èªèããããã$ãã XNUMX åã«ããå¿ èŠããããŸãã
makepp ã® (ãã«ã ã·ã¹ãã ã«å¿ããŠ) ããŒã¿ãèšå€§ã§ããããããšã³ãåŠçã¯ç¹æ®ã§ãã
éåžžã®çµäºã§ã¯ãæ§é äœã®ã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ã«ã¯æ°ç§ããããŸãã ããã§ã
匷åŒãªéåºã ã¡ã€ã³ããã»ã¹ã§ã¯ãŸã ãENDããããã¯ã䜿çšã§ããŸããã
ã°ããŒãã« ãã¡ã€ã« ãã³ãã«ã¯ãã©ãã·ã¥ãããªãå¯èœæ§ããããŸãã ãã ããçŸä»£ã®èªåœã䜿çšããå¿ èŠããããŸã
ãã¡ã€ã«ãã³ãã«ãã¹ã³ãŒãå€ã«åºããšé©åã«éããããŸãã
Perl ã³ãŒãã§ã¯ãã«ãŒã« ã¢ã¯ã·ã§ã³ãšããŠçŽæ¥å®è¡ããããå®çŸ©ããã³ãã³ããä»ããŠå®è¡ãããŸãã
å察ã ãENDããããã¯ã¯å®è¡ãããŸããããã°ããŒãã« ãã¡ã€ã«ãã³ãã«ã¯ãã©ãã·ã¥ãããŸãã ã®
ã°ããŒãã«ãªããžã§ã¯ãã®ãDESTROYãã¯å®è¡ãããŸããã
è¿œå æ°è£œå ããã¹ã æ©èœ
次㮠Perl ãµãã«ãŒãã³ãå®çŸ©ããã ãã§ãmakepp ã®ã¬ããŒããªãŒã«æ°ããé¢æ°ãè¿œå ã§ããŸãã
åãååã§ãããæ¥é èŸãf_ããä»ããŠããŸãã äŸãã°ïŒ
ãµã f_myfunc {
ç§ã® $argument = &arg; # åŒæ°ã«ååãä»ããŸãã
my( undef, $mkfile, $mkfile_line ) = @_; # åŒæ°ã«ååãä»ããŸãã
...ããã§äœããããŠãã ãã
$return_value ãè¿ããŸãã
}
XYZ := $(myfunc ç§ã® func åŒæ°)
é¢æ°ãåŒæ°ãåããªãå Žåã¯ãäœãããå¿ èŠã¯ãããŸããã é¢æ°ã XNUMX ã€ãåãå Žå
åŒæ°ãååŸããã«ã¯ãäžèšã®äŸã®ããã«ãåçŽãªã¢ã¯ã»ãµãŒ &arg ã䜿çšããŸãã ããããããã
ããã«å€ãã®åŒæ°ãå¿ èŠãªå Žåã¯ã以äžã§èª¬æããããè€éãªã¢ã¯ã»ãµãŒãargsããå¿ èŠã§ãã
ãããã®ã¢ã¯ã»ãµãŒã¯ãä»»æã®ãf_ãã«æž¡ãå¿ èŠãããåã XNUMX ã€ã®ãã©ã¡ãŒã¿ãŒãåŠçããŸãã
é¢æ°ãã€ãŸãé¢æ°ã®åŒæ°ãmakefile ãªããžã§ã¯ããããã³è¡èšè¿°å
ã¡ãã»ãŒãžã ãããã£ãŠãæåã®ã±ãŒã¹ã§ã¯å¹çç㪠&arg 圢åŒã䜿çšã§ããŸãã
&arg ã¢ã¯ã»ãµãŒã¯ã次ã®ããšãåŠçããŸãã åŒæ°ããã§ã«
å±éãããå ŽåïŒäŸïŒã$(my$(function) argãã§é¢æ°ã®ååãèŠã€ããããïŒãåŒæ°ã¯æ¬¡ã®ãšããã§ãã
æååãšããŠæž¡ãããè¿ãããã ãã§ãã åŒæ°ãããã«å±éããå¿ èŠãããå Žåã¯ã次ã®ããã«ãªããŸãã
éåžžã®å Žåãããã¯æååãžã®åç §ã§ãã &arg ã¢ã¯ã»ãµãŒã¯ãããå±éããŸãã
ãã®ããã«ã¯ã2 çªç®ã®ãã©ã¡ãŒã¿ãšã㊠makefile ãªããžã§ã¯ããå¿ èŠã§ãã
ããã«å€ãã®åŒæ° (å Žåã«ãã£ãŠã¯å¯å€æ°) ãå¿ èŠãªå Žåããžã§ãã¯ãargsãã«ãã£ãŠå®è¡ãããŸãã
ãã®ã¢ã¯ã»ãµãŒã¯ãarg ãšåã 3 ã€ã®ãã©ã¡ãŒã¿ãŒã«å ããŠãè¿œå ã®ãã©ã¡ãŒã¿ãŒãåãåããŸãã
max: åŒæ°ã®æ° (ããã©ã«ã㯠2): ç¡éã®å Žå㯠~0 (maxint) ãäžããŸã
min: åŒæ°ã®æ° (max ã ~0 ã®å Žåã¯ããã©ã«ã 0ããã以å€ã®å Žå㯠max ãšåã)
Only_comma: ã«ã³ãã®åšå²ã®ã¹ããŒã¹ã¯äœ¿çšããŸãããéåžžã¯ãã¡ã€ã«å以å€ã®å Žåã«äœ¿çšããŸãã
å±éåã«ååšããæ倧ã§æ倧ãå°ãªããšãæå°ã®ã«ã³ãã¯ãåå²ããããã«äœ¿çšãããŸãã
åŒæ°ã makepp ã®çµã¿èŸŒã¿é¢æ°ã®äŸãããã€ã瀺ããŸãã
my( $prefix, $text ) = åŒæ° $_[0], $_[1], $_[2], 2, 2, 1; # ãã¬ãã£ãã¯ã¹ãè¿œå
ç§ã® $cond ( args $_[0], undef, $_[2], ~0 ) ... # ãããŠããŸãã¯
ç§ã® @args= args $_[0], $_[1], $_[2], ~0, 1, 1; ïŒ é»è©±
my( $filters, $words ) = åŒæ° $_[0], $_[1], $_[2]; ïŒ ãã£ã«ã¿ãŒ
é¢æ°ã¯ã¹ã«ã©ãŒæåå (é åã§ã¯ãªã) ãè¿ããããã
ãã®æã®ããã¹ãã
é¢æ°ã§ãšã©ãŒãçºçããå Žåã¯ãéåžžã® Perl die ã¹ããŒãã¡ã³ãã䜿çšããŠé¢æ°ãçµäºããå¿ èŠããããŸãã
ãã㯠makepp ã«ãã£ãŠãã©ããããããã¡ã€ã«åãšæ¬¡ã®è¡ã衚瀺ãããšã©ãŒ ã¡ãã»ãŒãžã衚瀺ãããŸãã
ãšã©ãŒã®åå ãšãªã£ãåŒã®çªå·ãåºåãããŸãã
é¢æ°ãå®è¡ã§ããããšã«ã¯åºæ¬çã«å¶éã¯ãããŸããã ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããŠå®è¡ã§ããŸã
ã·ã§ã«ã³ãã³ããªã©ã
çŸåšãäŸåé¢ä¿ããã³ã«ãŒã«ã¢ã¯ã·ã§ã³ã«çŸããåŒãæ¡åŒµãããŠããŸãã
ã¿ãŒã²ããã«çŸããåŒã¯ XNUMX åå±éãããŸãããXNUMX åå±éãããããã
é¢æ°ã«ã¯å¯äœçšããããã¿ãŒã²ããã®åŒã«ååšããŸãã
é¢æ°ãè©äŸ¡ãããç°å¢ (ç¹ã« cwd) ã¯ã
Makefile ã®ã«ãŒã«ãé©çšãããç°å¢ãšå¿ ãããäžèŽãããšã¯éããŸããã
è©äŸ¡ãããé¢æ°ãå®è¡ãããŸãã ãããåé¡ã«ãªãå Žåã¯ãé¢æ°
ãããã次ã®ããã«ãªã£ãŠããã¯ãã§ã:
ãµã f_foo {
...
chdir $makefile->{CWD};
...ãªã©ã
}
ãããã£ã³ã° æ©èœ ã« a ããŒã« ã¢ãžã¥ãŒã«
é¢æ°ãã€ã³ã¯ã«ãŒã ãã¡ã€ã«ã«å ¥ãããšãMakeppfile ããšã« XNUMX ã€ã®ã³ããŒãäœæãããŸãã
ããã䜿çšããŸãã ãããåé¿ããã«ã¯ãããšã¯ã¹ããŒã¿ãŒãã䜿çšããŠéåžžã® Perl ã¢ãžã¥ãŒã«ãšããŠäœæã§ããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããããã䜿çšããŸãã ããã«ãããèªã¿èŸŒã¿ãéããªããã¡ã¢ãªãç¯çŽãããŸãã
perl { mymodule ã䜿çšãã }
ããŒã«{
ç§ã®::ã¢ãžã¥ãŒã«ã䜿çšããŸãã # : ãæ°ããè¡ã«çœ®ããšãããã¯ååãšããŠè§£æãããŸãã
}
éåžž Makefile ã§äœ¿çšã§ããé¢æ° (ãf_ããªã©) ãå¿ èŠãªå Žåã¯ã
é¢æ°ã"arg" ãŸã㯠"args") ã䜿çšããã«ã¯ã次ã®è¡ãã¢ãžã¥ãŒã«ã«è¿œå ããå¿ èŠããããŸãã
Mpp::Subs ã䜿çšããŸãã
æ¬ ç¹ã¯ãã¢ãžã¥ãŒã«ãé¢æ°ãšã¯çŽæ¥ç°ãªãããã±ãŒãžå ã«ããããšã§ãã
ã¡ã€ã¯ãã¡ã€ã«ã«çŸããŸãã ãããã£ãŠããã¹ãŠããã©ã¡ãŒã¿ãšããŠæž¡ãããæ§ç¯ããå¿ èŠããããŸã
Perl ã®ãcallerãé¢æ°ã䜿çšããŠååãä»ããŸãã
åŒã³åºã å€éš ããŒã« ã¹ã¯ãªãã
ãã·ã¹ãã ãçµç±ã§å€éš Perl ã¹ã¯ãªãããåŒã³åºãå ŽåããŸãã¯ã«ãŒã«ã¢ã¯ã·ã§ã³ãšããŠãmakepp ã¯
æ°ããããã»ã¹ (æåŸã®ã«ãŒã« ã¢ã¯ã·ã§ã³ã§ãªãéã) ãäœæããæ°ãã Perl ã€ã³ã¿ãŒããªã¿ãèµ·åããŸãã
ããå¹ççãªæ¹æ³ãããããšãé€ããŠãããã«ã¯äœãåé¡ã¯ãããŸããã
& command åŒæ°..ã
ããã¯ã«ãŒã«ã¢ã¯ã·ã§ã³ã§ããå¯èœæ§ããããŸãã é¢æ°ãåŒã³åºããŸã command ãc_ããšããæ¥é èŸãä»ãã
æ®ãã®éšåãæž¡ããŸã (ãªãã·ã§ã³ã§åŒçšç¬Šã§å²ãŸãã makepp ã¹ã¿ã€ã« -- ãšãŸã£ããåãã§ã¯ãããŸãã)
ã·ã§ã«) åŒæ°ã ãã®ãããªé¢æ°ãèŠã€ãããªãå Žåã¯ããã¹ãŠã®æååã次ã®é¢æ°ã«æž¡ããŸãã
"èµ°ã"ã
sub c_mycmd { ç§ã® @args = @_; ... }
$(åœã® callcmd):
&mycmd 'arg with space' arg2 "arg3" # c_mycmd ãåŒã³åºããŸã
ïŒ ãã§ã¢ãŠã
&myscript -o $(output) $(input) # å€éš myscript ãåŒã³åºããŸã
çµã¿èŸŒã¿ã®ãã¬ãŒã ã¯ãŒã¯å ã§ã³ãã³ããèšè¿°ããŠã次ã®ããšãè¡ãããšãã§ããŸãã
ããããæã€ã®ãšåãæšæºãªãã·ã§ã³ãããã³ããããæäŸãã I/O åŠçã
ãããã¯æŒç®åãMpp::Cmds::frameãã®åŸã«ã¯ã次㮠XNUMX æåã®ãªãã·ã§ã³ ãªã¹ããç¶ããŸãã
çµã¿èŸŒã¿é¢æ° (æ倧ã¯ãqw(fi I o O rs)ã)ã ç¬èªã®ãªãã·ã§ã³ãæå®ããå Žåã§ã
ãããã®ããããããªãŒããŒã©ã€ãããŠããæšæºãªãã·ã§ã³ã® XNUMX æåãæå®ããããšã«ãªããŸãã
ããããã®ç¬èªã®ãªãã·ã§ã³ã¯ãã[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 ã§ã¯ãªã --separator ã®ã¿ãæå®ããŸã
[qw(s short), \$short], # ãªãã·ã§ã³ãªã arg -> $short == 1
[qw(l long), \$long, 1, sub { warn "get arg $long"}];
}
ããã§ã¯ãåå ¥åã®æåã®æåã®ã¿ã倧æåã«å€æããåçŽãªã³ãã³ãã瀺ããŸãã
ã¬ã³ãŒã (ã&sed '$$_ = "\u\L$$_"'ããšåç):
ãµã c_uc {
ããŒã«ã« @ARGV = @_;
Mpp::Cmds::frame {
<> ã®é "\u\L$_" ãåºåããŸãã
'f', qw(i I o O rs);
}
ãã¬ãŒã ã«ãã£ãŠåŠçããããããã¯å ã«ãéèŠãªåŠçãå®è¡ããããã®ãã¹ãããããããã¯ãå«ããããšãã§ããŸãã
ä»ã®ãã¡ã€ã«ãéããªã©ã®æäœã
Mpp::Cmds::perform { ... } 'ã¡ãã»ãŒãž';
ããã¯ã次ã®å Žåã«ã--verboseãïŒãã¹ãŠã®ã³ãã³ããåãå ¥ããŸãïŒãå«ãã¡ãã»ãŒãžãåºåããŸãã
ã³ãã³ãã¯æ£åžžã«å®è¡ãããŸããã ãã ãããããã¯ã false ãšè©äŸ¡ãããå Žåã¯ã次ã®ããã«çµäºããŸãã
åŠå®ãããã¡ãã»ãŒãžã
ã©ã³ ã¹ã¯ãªãã åŒæ°..ã
ããã¯ãã¡ã€ã¯ãã¡ã€ã«å ã®ä»»æã® Perl ã³ã³ããã¹ãã§äœ¿çšã§ããéåžžã® Perl é¢æ°ã§ãã
ãã㯠system ã®è€æ°åŒæ°åœ¢åŒã«äŒŒãŠããŸãããå éšã§ Perl ã¹ã¯ãªãããå®è¡ããŸãã
çŸåšã®ããã»ã¹ã makepp ã¹ããŒãã¡ã³ãã®å Žåãperl é¢æ°ãŸãã¯ç¬èªã®é¢æ°
ããã makepp ãå®è¡ããŠããããã»ã¹ã§ãã ãã ãããµãããã»ã¹ãå®è¡ããã«ãŒã«ã®å Žåã¯ã
ããã ã¹ã¯ãªããã¯åŒã³åºããããã³ã«è§£æãããŸãããå®éã®ã¹ã¯ãªãããæžã蟌ãããšãã§ããŸãã
pod2html ãšåæ§ã«ãã©ã€ãã©ãªã«åã蟌ãŸããŸãã ãã®ã©ã€ãã©ãªã¯ãããã¬ãã«ã§äœ¿çšã§ããããã
ããããã§ã«ååšããŠããããš:
perl { use mylib } # å解æããå¿ èŠã®ãªããã¹ãŠã®ã«ãŒã«ã«ãã©ãŒã¯ãããŸã
ïŒ ãã§ã¢ãŠã
makeperl { run qw'myscript -o $(output) $(input)' }
ã¹ã¯ãªããããexitããåŒã³åºããå Žåãæšæºã®ãã¡ã€ã«èšè¿°åãéããããã·ã¹ãã ã«äŸåããŸãã
ãã®åŸã¯ãªãŒã³ã¢ããããå Žå (ãã¡ã€ã«ãéããã¡ã¢ãªãªã©)ãããã¯ãå®è¡ãã«åé¡ãããå¯èœæ§ããããŸãã ããã
ã¹ããŒãã¡ã³ããŸã㯠Perl é¢æ°å 㧠"run" ãåŒã³åºããšãmakepp ã劚害ããããã
ã¯ãªãŒã³ã¢ãã㯠makepp ã®æåŸã«ã®ã¿è¡ãããŸãã
åè¿°ã®åé¡ãçºçããå Žåã¯ãã¹ã¯ãªãããå€éšããå®è¡ããŸããã€ãŸãã
代ããã«ã³ãã³ãã©ã€ã³ã䜿çšããŸãã ã«ãŒã«å ã§ã¯ã¯ãªãŒã³ã¢ããã¯ããã»ã©åé¡ã§ã¯ãããŸããã
ãããã«ããŠãã«ãŒã«ã®ãµãããã»ã¹ã¯ãã®åŸçµäºãããããã«ãŒã«ã®æåŸã®ã¢ã¯ã·ã§ã³ãšããŠã
Windows ãé€ãã
æžã蟌㿠èªå㮠眲å ã¡ãœãã
makepp ã«å¥ã®ææ³ã䜿çšããŠçœ²åã¡ãœãããèšç®ããããå ŽåããããŸãã ããã«
ããšãã°ãå ±æã©ã€ãã©ãªã«äŸåãããã€ããªããããšããŸãã éåžžãããªãã
å ±æã©ã€ãã©ãªãå€æŽããŠããããã«äŸåããå®è¡å¯èœãã¡ã€ã«ãåãªã³ã¯ããå¿ èŠã¯ãããŸããã
ãªã³ã¯ã¯å®è¡æã«è¡ãããŸãã (ãã ããå®è¡å¯èœãã¡ã€ã«ãåãªã³ã¯ããããšã¯å¯èœã§ã)
å¿ èŠãªå ŽåããããŸãããã®ããããããããã©ã«ãã«ããŸããã§ããã) makepp ãå¿ èŠãªãã®
å ±æã©ã€ãã©ãªã®çœ²åãå€æŽãããå Žåã§ãåãã«ããå¿ èŠããããŸãã
ããã¯ããã€ãã®æ¹æ³ã§å®çŸã§ããŸãã æãç°¡åãªæ¹æ³ã¯ãç¬èªã®æ°ãããã®ãäœæããããšã§ã
眲åã¡ãœãã (ãshared_objectããšåŒã³ãŸã)ã ãã®çœ²åæ¹æ³ã䜿çšããŸã
次ã®ãããªãã€ããªããªã³ã¯ããã«ãŒã«ã®ã¿:
ç§ã®ããã°ã©ã : *.o lib1/lib1.so lib2/lib2.so
: 眲åå ±æãªããžã§ã¯ã
$(CC) $(å ¥å) -o $(åºå)
次ã«ã眲åã¡ãœãããäœæããå¿ èŠããããŸãã
ãã¹ãŠã®çœ²åã¡ãœããã¯ç¬èªã®ã¯ã©ã¹ã§ããå¿ èŠãããããã®ã¯ã©ã¹ã«ã¯ããã€ãã®ç¹å¥ãªã¡ãœãããå«ãŸããŠããå¿ èŠããããŸãã
(詳现ã«ã€ããŠã¯ããã£ã¹ããªãã¥ãŒã·ã§ã³ã® Mpp/Signature.pm ãåç §ããŠãã ãã)ã ã¯ã©ã¹åã¯æ¬¡ã®ããã«ããå¿ èŠããããŸã
ãMpp::Signature::ããšããæ¥é èŸãä»ããŠããããããã®å Žåã¯ã¯ã©ã¹ãåŒã³åºãå¿ èŠããããŸã
ãMpp::Signature::shared_objectãã ãšãããã¡ã€ã«ãäœæããå¿ èŠããããŸãã å ±æãªããžã§ã¯ã.pm ãããŠã眮ããŸã
ããã Mpp::眲å Perl ã€ã³ã¯ã«ãŒã ãã¹å ã®ã©ããã®ãã£ã¬ã¯ããªã äžçªç°¡åãªå Žæ
ã«ãããããããªã MPP/眲å makepp ã€ã³ã¹ããŒã«å ã®ãã£ã¬ã¯ã㪠(äŸ:
/usr/local/share/makepp/Mpp/眲å ãŸãã¯ã€ã³ã¹ããŒã«ããå Žæ)ã
ãã®ã¯ã©ã¹ã«å«ãŸãããã®ã«ã€ããŠã®æ£ç¢ºãªè©³çŽ°ã«ã€ããŠã¯ã以äžã泚ææ·±ã確èªããŠãã ããã
ãã¡ã€ã« Mpp/眲å.pm ãããŠãããããŸã Mpp/眲å/exact_match.pm ãã±ããã§
ååžã ããããç§ãã¡ã®å Žåã¯ãéåžžã«å°ããªå€æŽãå ããã ãã§ãã
æ¢åã®çœ²åã¡ã«ããºã ã ãã¡ã€ã«ãå ±æã©ã€ãã©ãªã®å Žåãå®æ°ãå¿ èŠã§ãã
äžæ¹ããã¡ã€ã«ããã以å€ã®å Žåã¯ãmakepp ã®éåžžã®çœ²åã«äŸåããããšèããŸãã
眲åã¡ã«ããºã ã ãããè¡ãæè¯ã®æ¹æ³ã¯ã以äžããç¶æ¿ããããšã§ãã
ãMpp::Signature::c_compilation_md5ããéåžžéžæããã眲åæ¹æ³ã§ãã
makepp ããªã³ã¯ ã³ãã³ããèªèãããšãã
ãããã£ãŠããã¡ã€ã« Mpp/眲å/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()ããå®çŸ©ãããšããŸãïŒãããåŒã³åºããŸãïŒ ãªããã·ãºïŒã ãã®ãããªïŒ
my_program: main.o lib1/lib1.so xyz/libxyz.a
ãlibxyzã㯠.a ãã¡ã€ã«ã§ã¯ãªã ããã ãã¡ã€ã«ã®å Žåããxyz()ããåã蟌ãŸããªãå¯èœæ§ããããŸã
æ£ãããã libxyz.a ãã€ããªãåãªã³ã¯ããªãéãã
Mpp::Signature ã¡ãœããã¯ã
ãã¡ã€ã«ã¯å€æŽãããŸããããæååã®æ¯èŒã«äœ¿çšãããã¢ã«ãŽãªãºã ã¯å€æŽãããŸããã ããšãã°ã
makepp ãã£ã¹ããªãã¥ãŒã·ã§ã³ã®çœ²åã¡ãœãããtarget_newerãã§ã¯ãåã«
ã¿ãŒã²ããã¯äŸåé¢ä¿ãããæ°ãããã®ã§ããã眲åã¡ãœãããexact_matchãïŒããã³
ããã«äŸåãããã¹ãŠã®ãã® (ãmd5ãããc_compilation_md5ããªã©) ã§ã¯ã
ãã¡ã€ã«ã«ã¯æåŸã®ãã«ããšåã眲åãä»ããŠããŸãã
以äžã«ã䟿å©ãªä»ã®çš®é¡ã®çœ²åæ¹æ³ãããã€ã瀺ããŸãã
å¯èœæ§ãã æ±çšæ§ãååã§ããã°ããã®ãã¡ã®ããã€ãã¯æçµçã«ã¯
makepp ã«çµã¿èŸŒãŸããŸã:
· ãšã¯ã¹ããŒãããããã¹ãŠã®ãã¡ã€ã«ã®ãã§ãã¯ãµã ãè¿ãå ±æã©ã€ãã©ãªã®çœ²åã¡ãœãã
ã·ã³ãã«ãããã³ä»ã®ã©ã€ãã©ãªããå¿ èŠãªãã¹ãŠã®ã·ã³ãã«ãå«ãŸããŸãã ããã«ããã
äžèšã®äŸã®åé¡ã解決ããããããç¶æ³äžã§æ£ãããªã³ã¯ãä¿èšŒããŸãã
makepp ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ãããè¡ãããã®å®éšçãªè©Šã¿ãè¡ãããŸãã (ã
Mpp/眲å/shared_object.pm)ããã ããGNU binutils ãš ELF ã§ã®ã¿åäœããŸãã
çŸæç¹ã§ã®å³æžé€šã
· ãã¡ã€ã«ã«æžã蟌ãŸããæ¥ä»ã¹ã¿ã³ããç¡èŠãã眲åæ¹æ³ã ããšãã°ãããªãã
çæãã .c æååãæ¿å ¥ããããšãèŠæ±ããããã°ã©ã ã䜿çšããŠèªåçã«ãã¡ã€ã«ãäœæãã
ãã®ããã«ïŒ
static char * date_stamp = "01 幎 2004 æ XNUMX æ¥ã«èª°ãã«ãã£ãŠèªåçã«çæãããŸãã";
æ¥ä»ã¹ã¿ã³ãã®å€æŽãç¹ã«ç¡èŠãã眲åã¡ãœãããäœæããããšãã§ããŸãã
ãããã£ãŠãæ¥ä»ã¹ã¿ã³ãã®ã¿ãå€æŽãããå Žåãmakepp ã¯åæ§ç¯ããŸããã
· éåžžã®æ¹æ³ã§çœ²åãèšç®ããŸããã
åæ§ç¯ãããã©ããã決å®ããéã®ã¢ãŒããã¯ãã£ãžã®äŸåã ããã¯æ¬¡ã®ãããªå Žåã«åœ¹ç«ã¡ãŸãã
çã«ã¢ãŒããã¯ãã£ã«äŸåããªããã¡ã€ã«ã çŸåšãXNUMX ã€ã®ã¢ãŒããã¯ãã£ã«åºã¥ããŠæ§ç¯ããå Žåã
makepp ã¯ãåãæ¿ãæã«ã¢ãŒããã¯ãã£ã«äŸåããªããã¡ã€ã«ã§ãåæ§ç¯ããããšãèŠæ±ããŸãã
å¥ã®ã¢ãŒããã¯ãã£ãžã
· ã©ããã¯ã¹ ãã¡ã€ã«å ã®ã³ã¡ã³ããç¡èŠããæ¹æ³ãèªèãã眲åã¡ãœããã
ãc_compilation_md5ãã¡ãœããã¯ãC ãã¡ã€ã«å ã®ã³ã¡ã³ããç¡èŠããæ¹æ³ãç¥ã£ãŠããŸãã
· ææžã®ã¿ããã§ãã¯ãµã ããèªåææžæœåºçšã®çœ²åæ¹æ³ã
ããã¥ã¡ã³ãæœåºæ©èœãå¿ èŠãšããã³ã¡ã³ããè¿œå ãããœãŒã¹ã«å¯Ÿãããã®ä»ã®å€æŽãç¡èŠããŸãã
ãã¡ã€ã«ã«ãœãããŠã§ã¢ãæå®ããå¿ èŠããããŸãã
æªå®
ãã®ææžã¯ãŸã å®æããŠããŸããã ç¬èªã®ã¹ãã£ããŒãäœæããæ¹æ³ã«ã€ããŠã説æããŸãã
ãã¡ã€ã«ãªã©ãå«ããŸãã
onworks.net ãµãŒãã¹ã䜿çšããŠãªã³ã©ã€ã³ã§ makepp_extending ã䜿çšãã