make ユーティリティとメークファイルを使用すると、Sun WorkShop でアプリケーションを自動構築することができます。この付録では、make ユーティリティ、メークファイル、メークファイルマクロに関する基本情報を示します。また、メークファイルオプションを設定したり、メークファイルマクロを追加、変更、無効にするための Sun WorkShop のダイアログボックスについても説明します。
make ユーティリティを使用すると、プログラムのコンパイルやリンクの作業を効率的に行うことができます。一般的に、大きなアプリケーションはソースファイルとヘッダーファイルの集まりであり、複数のライブラリとリンクしています。このため、いずれか 1 つまたは複数のソースファイルを変更した場合、該当するプログラム部分の再コンパイルと再リンクが必要です。各部分の再コンパイルと再リンクに必要なコマンドと、アプリケーションを構成するファイル間の相互依存関係を指定することで、この処理を自動化することができます。指令ファイルにこのような指定が含まれていると、再コンパイルが必要なファイルだけが再コンパイルされ、必要なオプションやライブラリを使用して再リンクが行われます。
メークファイルと呼ばれるファイルは、ソースファイルやオブジェクトファイルの依存関係を体系付けて make ユーティリティに指示します。また、ファイルのコンパイルやリンクに必要なコマンドも、このファイルで定義されます。
構築する各ファイル (実行のステップ) をターゲットと呼びます。メークファイルの各エントリが、ターゲットオブジェクトの依存関係やそのオブジェクトを構築 (make) する上で必要なコマンドを表す規則に相当します。規則の構造は次のとおりです。
target: dependencies-list
TAB build-commands
target はターゲット、dependensies-list は依存関係リスト、build-commands は構築コマンドです。
依存関係リスト−各エントリは、ターゲットファイル名を示す行で始まり、そのターゲットが依存するすべてのファイルが続きます。
構築コマンド−各エントリには、このエントリに対してターゲットファイルを構築する Bourne シェルコマンドを指定する行が 1 行以上含まれます。コマンド行とコマンド行の間は、タブ記号でインデントします。
次のような 4 つのソースファイルとメークファイルから構成されるプログラムがあるとします。
makefile
commonblock
computepts.f
pattern.f
startupcore.f
pattern.f と computepts.f の両方は、commonblock をインクルードし、各 .f ファイルをコンパイルします。この 3 つの再配置可能ファイルを一連のライブラリとともに pattern という名前のプログラムにリンクする場合を考えてみます。
pattern: pattern.o computepts.o startupcore.o f77 pattern.o computepts.o startupcore.o -lcore77 ¥ -lcore -lsunwindow -lpixrect -o pattern pattern.o: pattern.f commonblock f77 -c -u pattern.f computepts.o: computepts.f commonblock f77 -c -u computepts.f startupcore.o: startupcore.f f77 -c -u startupcore.f
このメークファイルの先頭行は、pattern の作成が pattern.o、computepts.o、startupcore.o に依存していることを表します。2 行目以降は、再配置可能な .o ファイルとライブラリから pattern を作成するためのコマンドです。
次のような 5 つのソースファイルとメークファイルから構成されるプログラムがあるとします。
manythreads.cc
Makefilemany.cc
thr.cc
misc.h
defines.h
ターゲットファイルは、many、manythreads、thrI の 3 つとします。
all: many manythreads thrI many: many.cc CC -o many many.cc -g -D_REENTRANT -lm -lnsl -lsocket -lthread thrI: thr.cc CC -o thrI thr.cc -g -D_REENTRANT -lm -lnsl -lsocket -lthread manythreads: manythreads.cc CC -o manythreads -g -D_REENTRANT manythreads.cc -lnsl -lsocket -lthread
このメークファイルの先頭行では、all というラベルを使って、一連のターゲットファイルをまとめています。2 行目以降は、ソースファイルのいずれかと依存関係にある 3 つのターゲットファイルを作成するためのコマンドです。
make コマンドは引数を指定せず、ただ次のように指定するだけで呼び出すことができます。
demo% make
Sun WorkShop の「オプション」ダイアログボックスを使用して、アプリケーションに応じて make コマンドに必要なオプションを付けることができます。「make オプションの指定」を参照してください。
make ユーティリティは、現在のディレクトリ内にある makefile または Makefile という名前のファイルを検索し、そのファイルから指示を受け取ります。
make ユーティリティは、次の処理を行います。
メークファイルを読み取り、処理するべきすべてのターゲットファイル、ターゲットファイルが依存するファイル、ターゲットファイルを構築する上で必要なコマンドを特定する
それぞれのファイルが前回変更された日時を検索する
依存するファイルよりも古いターゲットファイルがあれば、そのターゲットファイルに対してメークファイルで指定されているコマンドを使用して再構築する
make ユーティリティのマクロ機能を使用すると、パラメータを使用しないで、簡単に文字列を置き換えることができます。たとえば、ターゲットプログラム pattern を構成する再配置可能なファイルの一覧を 1 つのマクロ文字列として表すと、変更する際も処理が簡単です。
マクロ文字列は、次の形式で定義します。
NAME=string
マクロ文字列は
$(NAME)
のように指定します。すると、make ユーティリティによって、指定のマクロ文字列の実際の値に自動的に置き換えられます。
次に示す例は、すべてのオブジェクトファイルを指定するマクロ定義をメークファイルの先頭に追加するものです。
OBJ = pattern.o computepts.o startupcore.o
これで、ターゲット pattern に対して、メークファイル内で依存関係のリストと f77 リンクコマンドの両方にこのマクロを使用することができます。
pattern: $(OBJ) f77 $(OBJ) -lcore77 -lcore -lsunwindow -lpixrect -o pattern
マクロ文字列の名前が 1 文字の場合は、括弧を省略することができます。
Sun WorkShop の「マクロ作成」ダイアログボックスを使用すると、WorkShop ターゲットの「マクロ」リストにマクロを追加したり、リストからマクロを削除したり、リスト中のメークファイルマクロに値を割り当て直すことができます。このダイアログボックスの使い方の詳細については、「メークファイルマクロの使い方」を参照してください。
make のコマンド行オプションを使用して、メークファイルマクロの初期値を無効にすることができます。たとえば、メークファイルの先頭に
FFLAGS=-u
という行を指定し、computepts.f のコンパイル行を
f77 $(FFLAGS) -c computepts.f
とすると、最終的なリンクは
f77 $(FFLAGS) $(OBJ) -lcore77 -lcore -lsunwindow lpixrect -o pattern
となります。
この例で、引数を指定しないで make コマンドだけを実行すると、上記の FFLAGS セットの値が使用されます。この設定は、次のコマンド行を付加することで無効になります。
demo% make "FFLAGS=-u -o"
make コマンド行の FFLAGS マクロの定義はメークファイルの初期設定に優先し、-o フラグと -u フラグの両方が f77 に渡されます。コマンド行で "FFLAGS=" と指定しても、マクロをリセットすることができます。
Sun WorkShop の「マクロ作成」ダイアログボックスを使用して、マクロ値を無効にすることができます。「メークファイルマクロの使い方」を参照してください。
メークファイルの作成を簡便化するため、make ユーティリティには、ターゲットファイルの接尾辞に基づいて使用されるデフォルトの規則が割り当てられています。.f 接尾辞を認識すると、make は、f77 コンパイラを使用し、FFLAGS マクロで指定されるフラグ、-c フラグ、コンパイルするソースファイル名を引数として渡します。
OBJ = pattern.o computepts.o startupcore.o FFLAGS=-u pattern: $(OBJ) f77 $(OBJ) -lcore77 -lsore -lsunwindow -lpixrect -o pattern pattern.o: pattern.f commonblock f77 $(FFLAGS) -c pattern.f computept.o: computepts.f commonblock startupcore.o: startupsore.f
make は、デフォルトの規則を使用して、computepts.f と startupcore.f をコンパイルします。
同じように、.f90 ファイルの接尾辞の規則では、f90 コンパイラが起動されます。
プログラム開発ツールとしての make の使い方については、『Managing Projects with make』(Oram、Talbott 共著、O'Reilly & Associates) など、すばらしい書籍が多数出版されていますので、それらを参考にしてもよいでしょう。