クリプキクローネ日記帳

ある種の音楽と数学とランニングはミニマルなところが似ていると思う。

make 改訂版 [Andrew Oram, Steve Talbott (著), 矢吹 道郎(監訳), 菊池 彰 (訳)]

「make 改訂版」
最高のタイトルです。
本の内容を知るために必要にして十分な、これ以外ないタイトルです。
本屋の自己啓発本コーナーあたりでよく見るような
「明日から使える◯◯」とか「3分で分かる◯◯」みたいな煽りタイトルとは一線を画しています。
makeファイルについて知りたいヤツだけ読め、というはっきりしたスタンスが素晴らしいです。
そして由緒正しきオライリー動物本です。

正直makeファイルを直接いじったことはないのですが、
プログラムのビルドにおいてとても重要な概念なはずなので
何ができて何ができないのかくらい把握しておこうと思って読みました。
歴史を感じる表現も多くておもしろかったです。


・ファイルの依存関係の記述
program : main.o iodat.o

・コンパイル/リンク
タブのあとでcc -c main.c
とか。
普通は定義済みマクロ ${CC} を使う。

・マクロ
DIR=/usr/proj
みたいに書くと、${DIR}と使える。
$? や $< や$* はターゲットよりも新しいもののみ対象にするマクロ。
$@ や $$@ は今のターゲットの名前。

Dはディレクトリ、Fはファイル。
${D@} や ${F@} みたいに使う。

・サフィックスルール
main.c を main.o にする、みたいな対応関係のルール。
デフォルトのルールを使えばいちいち記述しなくてもmain.oを作る場合にmain.cを探してくれる。
.SUFFIXES : .c .o
のように使うサフィックスをまず定義して
.c.o:
の次の行にルールを書く。

・シェルコマンド
cc 以外の普通のコマンドも使える。
なのでビルド時にファイルのコピーや移動を行うこともできる。
実際にファイルを生成するわけではないような作業の名前をダミーターゲットで書いたりする。

・再帰make
makeファイルの中に別のmakeを書く。
ディレクトリごとにmakeファイルを作って、
下層のmakeを上層から再帰的に呼び出すことで、
複数ディレクトリにまたがるmakeをまとめて実行できる。

・コンパイラオプションや#ifdef
make実行時のコマンドのパラメータにシンボルの定義を入れて、
最初に中間ファイルをcleanする命令を書けば、指定した条件でビルドできる。
しかしmakeはファイルの更新日時しかみないので、コンパイラオプションごとにバージョン管理したりはできない。
毎回cleanするか、ターゲットのファイル名を変えるとか、ディレクトリを変えるとか、サフィックスを変えるとかするしかない。

・nmake
ソースディレクトリ、ヘッダディレクトリ、ライブラリディレクトリ、のようなディレクトリ構成になっているときに
他のディレクトリも探せるように書ける拡張make。
ソースの中身を読んで依存するヘッダを解析する機能もある。というか標準makeにはそれがない。

・GNU make
#ifdef のようなことがmakeファイル中でできる。
makeファイル中で文字列操作ができる。(ファイル名とか)

・imake
メイクファイル用のプリプロセッサ。


「ビルド」と「リビルド」の違いについて
「原則的には基本的には一般的にはビルドで正しいバイナリができるはずである」
みたいなモヤモヤした言い方がよく聞かれますが、
依存関係の自動解析がどれだけ難しいか、ということなんでしょうね。
実際リビルドしないとうまく動かないことあるし。

  1. 2017/05/12(金) 22:34:03|
  2. | トラックバック:0
  3. | コメント:0
<<情報理論 [今井秀樹(著)] | ホーム | ディジタル信号処理 [貴家仁志(著)]>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://myumbrella.blog42.fc2.com/tb.php/373-21c24487
この記事にトラックバックする(FC2ブログユーザー)