[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

11. アーカイブファイルのアップデートにmakeを使用する

アーカイブファイルメンバーと呼ばれるサブファイルを含んでいます。 それらはプログラムarでメインテナンスされ、リンクのための サブルーチンライブラリとして使用されます。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

11.1 ターゲットとしてのアーカイブメンバー

makeでは、アーカイブファイルの個々のメンバーがターゲットとして 使用されます。以下のようにアーカイブファイルarchivememberと 名付けられたメンバーを指定します。

 
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)’となります。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

11.2 アーカイブメンバーのターゲットに対する暗黙のルール

a(m)’のように見えるターゲットはアーカイブファイル amと名付けられたメンバーを表わすことを思い出してください。

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 アーカイブシンボルディレクトリのアップデート

ライブラリとして使用されるアーカイブファイルは通常、ほかのすべてのメンバーに よって定義された外部のシンボル名のディレクトリを含む特別なメンバー ‘__.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’のメンバーは 自動的にアップデートされるため、これは必要ではありません。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

11.3 アーカイブ使用する際の危険性

パラレル実行(-jスイッチ、see section パラレル実行.)を 使用する際は慎重に行なうことが重要です。同時に複数のarコマンドが同じ アーカイブファイルに対して実行されるとき、互いにそれを知らないため、 ファイルが不完全になる可能性があります。

おそらく将来のバージョンのmakeでは、同じアーカイブファイルへの すべてのコマンド操作を連続して行なうようにしてこの問題を解決するメカニズムを 提供すると考えられますが、それまで時間がない場合には、ほかの方法でこの問題を 回避するようにmakefileに記述するか、-jを使用しないことが必要です。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

11.4 アーカイブファイルに対するサフィックスルール

アーカイブファイルを扱うために、特別な種類のサフィックスルールを記述する ことができます。サフィックスルールの詳細な説明は 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を用いて生成されました。