プロフェショナルBSD

キーフレーズ

コマンド ファイル UNIX BSD システム ネットワーク etc ファイルシステム 場合 usr プロセス インターフェイス できる chofu 実行 プログラム プロトコル クライアント 設定 システムコール bin ディレクトリ 指定 ファイル名 アドレス 利用 home passwd 文字列 環境 機能 ホスト ftp dev 起動 ユーザー コマンドライン 必要 使っ カーネル ウインドウ u. サーバ set Mule オペレーティングシステム 入力 表示 計算機 使う 管理 行う Emacs 情報 記述 バケット make tcsh モード Wnn emacs オプション 現在 ソフトウェア開発 sendmail NIS TCP ソースコード ツール ホスト名 ソフトウェア 使用 シェル インターネット キーバインド アプリケーション UUCP 関数 処理 データ RFC 名前 出力 complete mode 方法 192 define フリーソフトウェア kei root メール local 番号 386 メッセージ uucp ユーサー ログイン

目次ページ

7.2 make る。ところがこの場合だと foo. c だけを変更しても bar. c も再コンパイルし てしまう。つまりこの方式ではファイルの依存関係を全く考慮していないた め、たった 1 つのファイルを変更しただけなのにすべてのファイルを再コン パイルするはめになってしまう ( もちろんシェルスクリプトでも if 文などを 駆使すれば可能だが、そのシェルスクリプトを作るのがたいへん ! ) make は Makefi1e ( あるいは makefile) と呼ばれるファイルの依存関係とそ の生成方法を記述したファイルを参照して自動的にコマンドを実行してくれ る。そのため必要最小限の時間で目的のファイルを生成することが可能だ。 上の例では Makefi1e は次のようになる。 foobar: f00.0 bar . 0 —C bar . C . C ー C f 00 . C cc ー 0 foobar f00.0 bar . 0 C C bar . 0 : bar CC f00.0 : f00. c f00. h 345 foobar : $(OBJ) OBJ = $ (SRC : . c= . 0 ) SRC = f00. c bar . c きる。以下に例を示す。 もう少し複雑な使い方として M efile ではマクロの定義をすることがで 法が記述してある。 ドを実行する。それ以下の行もそれぞれ f 。。 . 。、 bar. 。の依存関係と生成方 時刻を調べて f 。。 . 。あるいは bar. 。の時刻が f 。。 bar より新しければコマン して作るかが記述してある。このとき m e は f 。。 bar 、 f 。。 . 。、 bar. 。の更新 bar. 。から構成されていることを示している。次の行に f 。。 bar をどのように ドである ( コマンド行 ) 。この例では最初の行がプログラム f 。。 ba てが f 。。 . 。、 る。そして次の行からタブで 1 段下げてある部分が目的物を作る際のコマン ヾクの左側に書かれたものが目的物であり、右側は必要物のファイルであ

7 章ソフトウェア開発環境 f00.0 : f00. C bar . 0 : bar . c 最初の行では SRC というマクロの定義を行っている。定義には、、 = 〃を使う。 これは一般のプログラミング言語と同し意味である。 2 行目はマクロ OBJ の少し複雑な定義をしている。これは SRC というマクロの . c を . 。に置き換 えるという意味である。マクロの参照は $ と ( ) を使って行う。また 5 行目に cc という定義していないマクロを利用しているが、 make コマンドは起動時 に決められたファイル /usr/share/mk/sys. を読み込む。 cc はそこに定義さ れているマクロである。また同じ行に [email protected] というマクロを使っている。このマ クロの値は実行時に決定される。 [email protected]の値は目的物のファイル名を表す。この 場合 foobar になる。このほかにもこのようなマクロがいくつか存在する。 最後の 2 行はファイル間の依存関係しか定義していない。この場合 e コ マンドは暗黙の規則を用いて目的物を生成しようとする。つまり sys. で 拡張子 . c の付いたファイルから拡張子 . 。の付いたファイルを作るための規 則を定義しており、 M efile 中で明示的なコマンド行がない場合に、この規 則を適用する。このような規則は M efile 中にユーザーが定義することも 可能である。 . C . 0 : $(CC) -c $ く この定義の例では、、 . c の付いたファイルから . 。の付いたファイルを作るに は $ (CC) -c $ くを実行する〃となる。ここでマクロ $ くはやはり特殊なマクロで 必要物すべてのリストを表す。 さて、 make コマンドを使うには Makefi1e を作る必要がある。これを作る にはファイルの依存関係を調べなくてはいけない。特に C のソースファイ ルの場合は、インクルードファイルが問題となることがある。つまりインク ルードファイルが入れ子になっているような場合、依存関係を明確にするこ とが困難な場合がある。これを解決してくれるのが mkdep コマンドである。 このコマンドは引数に C のソースファイル名を与えるとインクルードファイ ルを追いかけ . depend というファイルにファイルの依存関係を出力してくれ る。実は m e コマンドは Makefi1e を読み込んだ後にこの . depend を言冗み込 346

7.2 make む。このように mkdep を使うと依存関係のチェックが非常に楽にできる。 これらの機能を駆使した例として BSD / 386 のコマンドを作るための M e file があげられる。これらのコマンドを作るための規則はある程度共有する ことができる。そのためその規則を /usr/share/mk/bsd ・ prog ・ mk として定義 し、各コマンドを作る Makef ile では必要なマクロを定義してあとはこのファ イルをインクルードしている。たとえば ls コマンドの Makefi1e は次のよう に簡単である。 @(#)Makefi1e 1s 5.3 (Berke1ey) 5 / 11 / 90 PROG= SRCS= DPADD= LDADD= . PATH : cmp. c 1s. c print . c uti1. c getbsize. c ${LIBUTIL} —lutil ${ . CURDIR}/ .. /df . include く bsd. prog. mk> ※これは BSD/386 1.1 の ls コマンドの MakefiIe です。 Berkeley Software Design 社の許諾により掲載させていただきました。 このはかにも make にはさまざまな機能があるが、 げることはできないのでマニュアルなどを参考にしてはしい。 7.2.2 touch コマンド make に関連したコマンドに t 。 uch コマンドがある。これは引数に指定した ファイルの変更時間を touch コマンドを実行した時間にするものである。 れは make が変更時間を比較してコマンドを実行していることを利用するもの で、たとえは強制的にプログラムの再構築をする場合には次のように t 。 uch コマンドを使う。 % touch * . c % make こですべてを取り上 347