検索まずは、検索! Index人気の20件
最新の20件2018-12-022018-01-092017-05-072017-04-252016-05-012015-02-24
|
Makefile目次このページについてこのページで使用している"make"は、主にGNU make(gmake)について解説しています。 MakefileとはmakeコマンドMakefileを知る前に、makeを学ぶ必要がありそうなため、まずはmakeの説明から。 GNUでプログラムを作る場合、gccというコマンドを使ってコンパイルをします。
このような構成でコンパイルからリンクまでが終わっている状態のとき、Common.hを書き換えた場合は、再度Main.cとSub.cをコンパイルし、リンクし直す必要があります。 数ファイルから成るプロジェクトなら問題ないですが、大規模になるととてもやっていられないので、コンパイル、アセンブル、リンクなどを自動化する、makeというコマンドができました。 Makefileとはmakeコマンドでは、Makefileというファイルを使用します。 Makefileの記述方法コメントMakefileもプログラムのように記述することができるので、コメントも必須です。 #コメント。 ちなみに、Makefileは行指向のため、行コメントしかないようです。 基本文法目的ファイルの名前1 [目的ファイルの名前2,3...] : [依存ファイル1,2,3...] [目的ファイルを作成するためのコマンド1] [目的ファイルを作成するためのコマンド2] ...
以下は、最も単純な例です。
変数Makefileでも、プログラミング言語のように変数を扱うことができます。 $(foo) 非常に簡単です。$( )以外に、${ }でも使えます。 次は値の代入方法です。 単純展開代入演算子 :=単純展開変数に値を代入する場合にこの演算子を使います。 foo := $(CC) -o Hello.o Hello.c この場合、fooには、 gcc -o Hello.o Hello.c というふうに格納される。 もし、CCに値が入っていない場合は、 -o Hello.o Hello.c となります。 再帰展開代入演算子 =再帰展開代入変数に値を代入する場合にこの演算子を使います。 foo = $(CC) -o Hello.o Hello.c この場合、fooには、 $(CC) -o Hello.o Hello.c というふうに格納される。 単純展開との違いは、展開するタイミングです。 条件付き代入演算子 ?=この演算子は、代入する変数に値が定義されていれば代入されず、定義されていなければ値を代入されます。 追加演算子 +=変数に値を追加します。 foo = $(foo) 追加分 おそらく、こうなりますが、再帰展開変数の場合、makeがうまく扱えないため、自分自身を参照してしまい、無限ループに陥る可能性があります。 定義済みの変数GNUのmakeにはすでに定義されている変数があります。
自動変数makeするルールが決まった時に使えるようになる変数。
ルールが決まったときに使えるので、基本的にはコマンド行で使用する。 OS.img: BootLoader.bin OS.sys mformat -f 1440 -C -B $< -i $@ mcopy -i $@ $*.sys マクロ文字列置換$(macro:before=after) 変数macroのbeforeの部分をafterに置換します。 SOURCE = aiu.c aaa.cpp bbb.S TEMP_C = $(SOURCE:.c=.o) TEMP_CPP = $(TEMP_C:.cpp=.o) OBJECTS = $(TEMP_CPP:.S=.o) →aiu.o aaa.o bbb.o 先頭に文字列を結合$(addprefix prefix, string) 文字列stringの先頭にprefixを追加します。 OBJECTS = aiu.o aaa.o bbb.o $(addprefix dir/, $(OBJECTS)) →dir/aiu.o dir/aaa.o dir/bbb.o コマンドラインのオプションをつけたり、ディレクトリ名をつけたり、いろいろできます。 末尾に文字列を結合$(addsuffix suffix, string) 文字列stringの末尾にsuffixを追加します。 NAME = aiu aaa bbb $(addsuffix .o, $(NAME)) →aiu.o aaa.o bbb.o 参考・関連リンク書籍GNU MakeGNU Make公式マニュアル。 |