英語フランス語スペむン語

Ad


OnWorksファビコン

makepp_extending - クラりドでオンラむン

Ubuntu Online、Fedora Online、Windows オンラむン ゚ミュレヌタヌ、たたは MAC OS オンラむン ゚ミュレヌタヌ䞊の OnWorks 無料ホスティング プロバむダヌで makepp_extending を実行したす。

これは、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 を䜿甚する


無料のサヌバヌずワヌクステヌション

Windows ず Linux のアプリをダりンロヌド

Linuxコマンド

Ad