Sun WorkShop 入門

付録 B make ユーティリティとメークファイル

make ユーティリティとメークファイルを使用すると、Sun WorkShop でアプリケーションを自動構築することができます。この付録では、make ユーティリティ、メークファイル、メークファイルマクロに関する基本情報を示します。また、メークファイルオプションを設定したり、メークファイルマクロを追加、変更、無効にするための Sun WorkShop のダイアログボックスについても説明します。

make ユーティリティ

make ユーティリティを使用すると、プログラムのコンパイルやリンクの作業を効率的に行うことができます。一般的に、大きなアプリケーションはソースファイルとヘッダーファイルの集まりであり、複数のライブラリとリンクしています。このため、いずれか 1 つまたは複数のソースファイルを変更した場合、該当するプログラム部分の再コンパイルと再リンクが必要です。各部分の再コンパイルと再リンクに必要なコマンドと、アプリケーションを構成するファイル間の相互依存関係を指定することで、この処理を自動化することができます。指令ファイルにこのような指定が含まれていると、再コンパイルが必要なファイルだけが再コンパイルされ、必要なオプションやライブラリを使用して再リンクが行われます。

メークファイル

メークファイルと呼ばれるファイルは、ソースファイルやオブジェクトファイルの依存関係を体系付けて make ユーティリティに指示します。また、ファイルのコンパイルやリンクに必要なコマンドも、このファイルで定義されます。

構築する各ファイル (実行のステップ) をターゲットと呼びます。メークファイルの各エントリが、ターゲットオブジェクトの依存関係やそのオブジェクトを構築 (make) する上で必要なコマンドを表す規則に相当します。規則の構造は次のとおりです。

target: dependencies-list

TAB build-commands

target はターゲット、dependensies-list は依存関係リスト、build-commands は構築コマンドです。

FORTRAN 77 の例

次のような 4 つのソースファイルとメークファイルから構成されるプログラムがあるとします。

makefile

commonblock

computepts.f

pattern.f

startupcore.f

pattern.fcomputepts.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.ocomputepts.ostartupcore.o に依存していることを表します。2 行目以降は、再配置可能な .o ファイルとライブラリから pattern を作成するためのコマンドです。

C++ の例

次のような 5 つのソースファイルとメークファイルから構成されるプログラムがあるとします。

manythreads.cc

Makefilemany.cc

thr.cc

misc.h

defines.h

ターゲットファイルは、manymanythreadsthrI の 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 コマンド

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 ユーティリティの接尾辞の規則

メークファイルの作成を簡便化するため、make ユーティリティには、ターゲットファイルの接尾辞に基づいて使用されるデフォルトの規則が割り当てられています。.f 接尾辞を認識すると、make は、f77 コンパイラを使用し、FFLAGS マクロで指定されるフラグ、-c フラグ、コンパイルするソースファイル名を引数として渡します。

次の例では、この規則を 2 度示しています。


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.fstartupcore.f をコンパイルします。

同じように、.f90 ファイルの接尾辞の規則では、f90 コンパイラが起動されます。

詳細情報

プログラム開発ツールとしての make の使い方については、『Managing Projects with make』(Oram、Talbott 共著、O'Reilly & Associates) など、すばらしい書籍が多数出版されていますので、それらを参考にしてもよいでしょう。