makeコマンドを使ってみよう #4
コンパイラオプションをどう渡す?
このシリーズの1回目で、-O3や-Wallなどのオプションに言及しました。次のようにコマンドを自分で定義すれば、もちろんこれらのオプションがgccに渡されます。
hello: hello.c
gcc $< -o $@ -O3 -Wall -g
しかし、前回説明した組み込みルールを利用する場合、どうすればいいでしょう。組み込みルールでは、ユーザー自身がコマンドを記述しません。
Makefile内の変数定義
その方法を説明する前にMakefile内の変数定義について説明します。上のMakefileのコンパイラオプションを部分を次のように変数として別途定義しておくことができます。使用時には$とカッコを使います。
CFLAGS = -O3 -Wall -g
hello: hello.c
gcc $< -o $@ $(CFLAGS)
このMakefileを使ってmakeを実行すると、変数が定義された文字列に展開されているのが分かります。
$ make
gcc hello.c -o hello -O3 -Wall -g
組み込みルールと特定名称の変数
ここで、次のようにMakefileからコマンド部を削除します。
CFLAGS = -O3 -Wall -g
hello: hello.c
このMakefileを使って、makeをしても、先ほどと同様に、これらのコンパイラオプションが使用されます。
$ make
gcc hello.c -o hello -O3 -Wall -g
実は、makeの組み込みルールは、C言語のソース・ファイルをコンパイルする際、CFLAGSという名前の変数が定義されていれば、それはコンパイラオプションとして使用します。つまり、本稿の上から2つ目のMakefileのコマンド部分が組み込みルールとほぼ同じなのです。
特別な意味をもつ変数名
このような特別な意味を持つ変数名はいくつかあります。よく使用されるものを以下に紹介します。
変数名 | 意味 |
---|---|
CFLAGS | C言語のコンパイラオプション |
CXXFLAGS | C++言語のコンパイラオプション |
LDFLAGS | リンカオプション |
他の変数については、以下を参照してください。
https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
まとめ
今回は、コンパイラオプションを指定する方法を紹介しました。組み込みルールと合わせて使用すると、簡潔さを維持したまま、それを実現できることが分かったと思います。次回は、ちょっと嗜好を変えて、C言語などのプログラミング以外の用途にmakeを利用してみます。