[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
make
を使用するアーカイブファイルはメンバーと呼ばれるサブファイルを含んでいます。
それらはプログラムar
でメインテナンスされ、リンクのための
サブルーチンライブラリとして使用されます。
11.1 ターゲットとしてのアーカイブメンバー | Archive members as targets. | |
11.2 アーカイブメンバーのターゲットに対する暗黙のルール | The implicit rule for archive member targets. | |
11.3 アーカイブ使用する際の危険性 | Dangers to watch out for when using archives. | |
11.4 アーカイブファイルに対するサフィックスルール | You can write a special kind of suffix rule for updating archives. |
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
make
では、アーカイブファイルの個々のメンバーがターゲットとして
使用されます。以下のようにアーカイブファイルarchiveのmemberと
名付けられたメンバーを指定します。
archive(member) |
この構成はターゲットと必要条件においてだけ利用可能で、コマンドでは利用でき
ません。コマンドで用いる大部分のプログラムはこのシンタックスをサポートせず、
アーカイブメンバーに直接働くことはありません。ただし、ar
と
アーカイブに対して操作を行なうように設計されたプログラムだけはそれが可能です。
したがって、アーカイブメンバーのターゲットをアップデートする適切なコマンドは
ar
を使用すべきです。たとえば、このルールはメンバー‘hack.o’を
アーカイブ‘foolib’にファイル‘hack.o’をコピーすることで作成します。
foolib(hack.o) : hack.o ar cr foolib hack.o |
実際には、ほとんどのアーカイブメンバーのターゲットはこの方法でだけ
アップデートされ、そこには暗黙のルールがあります。[Note:]
アーカイブファイルがすでに存在している場合にはar
に対する‘c’
フラグが必要であることに注意してください。
同一のアーカイブでいくつかのメンバーを指定するには、括弧のなかにそのすべての メンバーを記述します。たとえば、
foolib(hack.o kludge.o) |
は、以下と同じです。
foolib(hack.o) foolib(kludge.o) |
アーカイブメンバーの参照にはシェルスタイルのワイルドカードが使用できます。 See section ファイル名におけるワイルドカードの使用.。 たとえば、‘foolib(*.o)’は‘foolib’アーカイブの‘.o’で終わる 名前のすべてのメンバーに展開されます。この例では、‘foolib(hack.o) foolib(kludge.o)’となります。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
‘a(m)’のように見えるターゲットはアーカイブファイル aのmと名付けられたメンバーを表わすことを思い出してください。
make
がそのようなターゲットに対する暗黙のルールを探す際、特殊な機能
として、実際のターゲット‘a(m)’にマッチするのと同様に、
‘(m)’とマッチする暗黙のルールを考慮します。
これは、ターゲットが‘%’である特別なルールをマッチさせます。 このルールは、ファイルmをアーカイブにコピーすることによって ターゲット‘a(m)’をアップデートします。たとえば、 ファイル ‘bar.o’をアーカイブファイル‘foo.a’に‘bar.o’ という名前のメンバーとしてコピーすることによってアーカイブメンバーの ターゲット‘foo.a(bar.o)’をアップデートします。
このルールがほかのルールと連鎖になっている場合は非常に強力です。たとえば、 ‘bar.c’の存在のうえで‘make "foo.a(bar.o)"’(クォート記号は、 シェルによって解決される際に、‘(’と‘)’を使用する場合に 必要です)は、たとえmakefileがない場合でも、以下のコマンドを 実行するのに十分です。
cc -c bar.c -o bar.o ar r foo.a bar.o rm -f bar.o |
ここで、make
はファイル‘bar.o’を中間ファイルとして想定しました。
See section 暗黙のルールの連鎖.。
このような暗黙のルールは自動変数‘%’を使用して書かれています。 See section 自動変数.。
アーカイブのメンバーの名前はディレクトリを含むことはできません。しかし、
makefile中でそうみせかけることが有益な場合もあります。アーカイブメンバーの
ターゲット‘foo.a(dir/file.o)’を記述する際、make
は
このコマンドで自動的にアップデートを行ないます。
ar r foo.a dir/file.o |
これは、ファイル‘dir/file.o’を‘file.o’と名付けられたメンバーに
コピーすることになります。そのような用法においては、自動変数%D
と
%F
が有益です。
11.2.1 アーカイブシンボルディレクトリのアップデート | How to update archive symbol directories. |
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
ライブラリとして使用されるアーカイブファイルは通常、ほかのすべてのメンバーに よって定義された外部のシンボル名のディレクトリを含む特別なメンバー ‘__.SYMDEF’を含んでいます。何かほかのメンバーをアップデートしたあと、 ほかのメンバーを適切に要約するように、‘__.SYMDEF’をアップデートする 必要があります。
ranlib archivefile |
通常、このコマンドをアーカイブファイルのためのルールに入れ、 アーカイブファイルのすべてのメンバーをルールの必要条件にします。たとえば、
libfoo.a: libfoo.a(x.o) libfoo.a(y.o) … ranlib libfoo.a |
の場合は、アーカイブメンバーの‘x.o’や‘y.o’などをアップデートし、
ranlib
の実行によって、シンボルディレクトリメンバーである
‘__.SYMDEF’のアップデートをします。メンバーのアップデートに
関するルールはここでは示されません。おそらく、それは省略され、
先の節で記述したようにアーカイブにファイルをコピーする暗黙の
ルールが用いられます。
GNUのar
プログラムを使用する場合は、‘__.SYMDEF’のメンバーは
自動的にアップデートされるため、これは必要ではありません。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
パラレル実行(-j
スイッチ、see section パラレル実行.)を
使用する際は慎重に行なうことが重要です。同時に複数のar
コマンドが同じ
アーカイブファイルに対して実行されるとき、互いにそれを知らないため、
ファイルが不完全になる可能性があります。
おそらく将来のバージョンのmake
では、同じアーカイブファイルへの
すべてのコマンド操作を連続して行なうようにしてこの問題を解決するメカニズムを
提供すると考えられますが、それまで時間がない場合には、ほかの方法でこの問題を
回避するようにmakefileに記述するか、-j
を使用しないことが必要です。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
アーカイブファイルを扱うために、特別な種類のサフィックスルールを記述する
ことができます。サフィックスルールの詳細な説明は
See section 古いスタイルのサフィックスルール.。
アーカイブサフィックスルールはGNUのmake
では時代遅れです。
なぜならば、アーカイブに対するパターンルールがより汎用的なメカニズム
(see section アーカイブメンバーのターゲットに対する アップデート.)だからです。しかし、ほかのmake
との互換性のために
残されています。
アーカイブに対するサフィックスルールを書くためには、ターゲットの サフィックス‘.a’を使ってサフィックスルールを簡単に書くだけです。 たとえば、ここにCのソースファイルからライブラリのアーカイブを アップデートする古いスタイルのサフィックスルールがあります。
.c.a: $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o $(AR) r $@ $*.o $(RM) $*.o |
あたかもパターンルールを記述してあるかのごとく動作します。
(%.o): %.c $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $*.o $(AR) r $@ $*.o $(RM) $*.o |
実際には、‘.a’をターゲットサフィックスとしてサフィックスルールを
make
が読み込んだときに行なう動作がこれです。どんな
ダブルサフィックスルール‘.x.a’もターゲットパターン
‘(%.o)’と‘%.x’の必要条件パターンを持つパターンルールに
変換されます。
ほかのいくつかの種類のファイルに対して‘.a’をサフィックスとして
使用したいかもしれないため、make
は普通、アーカイブサフィックスを
パターンルールに変換します(see section 古いスタイルのサフィックス ルール.)。したがって、ダブルサフィックスルール‘.x.a’は
2つのパターンルールを導きます。それは、‘(%.o): %.x’と
‘%.a: %.x’です。
[ << ] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
この文書は新堂 安孝によって2009年9月22日にtexi2html 1.82を用いて生成されました。