プログラミングユーティリティ

アーカイブライブラリ

make プログラムには、アーカイブライブラリへのインタフェースがあります。ユーザーは、以下のようにライブラリのメンバーを指定できます。

projlib(object.o)

または

projlib((entry_pt))

2 番目の方法は、実際には、ライブラリ内のオブジェクトファイルのエントリポイントを指定します (make は、ライブラリを検索し、エントリポイントを特定し、正しいオブジェクトファイル名に変換します)。

この方法を使用してアーカイブライブラリを管理するには、以下のようなメークファイルが必要です。

projlib:: projlib(pfile1.o) 
        	$(CC) -c $(CFLAGS) pfile1.c 
        	$(AR) $(ARFLAGS) projlib pfile1.o 
        	rm pfile1.o 
projlib:: projlib(pfile2.o) 
        	$(CC) -c $(CFLAGS) pfile2.c 
        	$(AR) $(ARFLAGS) projlib pfile2.o 
        	rm pfile2.o

メークファイルでは、オブジェクトごとに projlib 行を記述する必要があります。これには手間がかかるうえ、誤りが発生しやすくなります。ほとんどの場合、C ファイルをライブラリに追加するコマンド文字列は各ファイルで共通していて、ファイル名だけが異なります。

make コマンドは、ライブラリを構築する規則も使用できます。使用するには、.a という接尾辞を使用します。たとえば、.c.a の規則は、C ソースファイルをコンパイルしてライブラリに追加し、.o ファイルを削除します。同様に、.y.a、.s.a、.l.a の各規則は、それぞれ yacc、アセンブラ、lex のファイルを再構築します。内部定義されたアーカイブの規則は、.c.a、.c‾.a、.f.a、.f‾.a、.s‾.a です (チルド (‾) については後述)。ユーザーは、記述ファイルで他の必要な規則を定義できます。

したがって、前述のメンバーが 2 つのライブラリは、以下のメークファイルで管理できます。

projlib: projlib(pfile1.o) projlib(pfile2.o) 
        	@echo projlib up-to-date.

この例では、内部の規則を使用して、前述のライブラリ管理を行います。実際の .c.a の規則は、以下のとおりです。

c.a:
        	$(CC) -c $(CFLAGS) $< 
        	$(AR) $(ARFLAGS) $@ $*.o 
        	rm -f $*.o

したがって、$@ マクロは .a ターゲット (projlib) です。$< および $* マクロは、古い C ファイルと接尾辞を除いたファイル名 (pfile1.c および pfile1) に設定されます。前述の規則での $< マクロ は、$*.c に変更できます。

make が構築を行う際の処理の詳細について説明しています。

projlib: projlib(pfile1.o) 
        	@echo projlib up-to-date

ライブラリ内のオブジェクトが pfile1.c よりも古くなっていて、pfile1.o ファイルは存在しないとします。

  1. make projlib を実行します。

  2. make projlib を使用する前に、projlib の依存関係を検査します。

  3. projlib(pfile1.o) が projlib の依存関係であるので、これを生成する必要があります。

  4. projlib(pfile1.o) を生成する前に、projlib(pfile1.o) の依存関係を検査します (依存関係は存在していません)。

  5. 内部の規則を使用して、projlib(pfile1.o) を作成します (明示的な規則はありません)。projlib(pfile1.o) では、ターゲットの接尾辞を .a に指定する括弧が名前に含まれています。projlib のライブラリ名の最後には、明示的な .a がありません。括弧は、.a という接尾辞を示します。この意味で、.a は make に組み込まれています。

  6. projlib(pfile.o) という名前を projlib および pfile1.o に分割します。$@(projlib) および $*(pfile1) という 2 つのマクロを定義します。

  7. .X.a という規則と、$*.X というファイルを検索します。.SUFFIXES リストにおいてこれらの条件を最初に満たす .X は .c であるため、規則は .c.a、ファイルは pfile1.c になります。$< を pfile1.c に設定し、規則を実行します。実際には、make は pfile1.c をコンパイルする必要があります。

  8. ライブラリが更新されます。projlib: の依存関係に対応する以下のコマンドを実行します。

    @echo projlib up-to-date

pfile1.o が依存関係を持つには、以下の構文が必要です。

projlib(pfile1.o): $(INCDIR)/stdio.h pfile1.c

また、この構文を使用する際には、アーカイブのメンバー名を参照するマクロも使用できます。$% マクロは、$@ が評価されるごとに評価されます。現在のアーカイブのメンバーがない場合は、$% は NULL になります。アーカイブのメンバーがある場合は、$% は括弧内の式になります。