変数は複数の値を入れられますが、正確にはスペース区切りの文字列が格納されているだけです。配列ではないので、添字で参照するようなことはできません。変数は遅延評価されます。変数は定義したときには評価されず、参照するときに毎回評価されます。遅延評価で困ることはあまりありませんが、知らないと変な挙動に惑わされることになるので、ちゃんと覚えておきましょう。ようにして、コマンドラインで上書きできます。後から動的に変更したいところを予め変数にしておくと、コマンドラインで簡単に値が変更できて便利です。書き換えると、こんな感じになります。$(objects)コマンドラインから変数を書き換えて実行してみます。変更して実行してみました。コマンドが変更されているのが確認できます。変数には自動で値が設定される自動変数があります。自動変数を使うと、実行するコマンドがより汎用的に記述できるようになります。自動変数はいろいろありますが、次の3つぐらいを覚えれば大丈夫でしょう。生成するコマンドが全く同じ内容になりました。生成するためのコマンドも、ターゲットや依存ファイルに依存しない汎用的な記述になっています。実際に実行してみましょう。main.o問題なく動作しています。生成しているルールでやっていることは同じです。今のままではファイルが増えるたびに似たようなルールを追加していかなくてはなりません。いう機能が追加されました。置き換わってしまいましたが、未だに使われていることもあるので紹介します。使うようにしましょう。次のような記述に変更します。順番でスペースを入れずに続け文字で指定します。実際に実行してみましょう。main.o問題なく実行できました。重要な問題点があります。依存ファイルを指定することができません。依存関係がありません。更新されてもコンパイルは実行されません。入れることができます。任意の文字列にマッチします。置き換えることが可能ですし、もっと柔軟な指定ができるようになります。できなかった依存ファイルの指定もできます。使ってルールを記述するようにしましょう。よって一つのルールにまとめられました。依存関係もちゃんと記述できています。実際に実行してみましょう。main.o問題なく実行できています。更新にも対応しています。ターゲットが設定されています。いうファイルが存在した場合の挙動はどうなるでしょうか。ターゲットファイルを生成するというのが基本的な考え方なので、ターゲットファイルが存在する場合は当然処理を実行してくれません。ファイルを削除するためにタスクとして定義しているものなので、ファイルの存在の有無に関わらず常に実行して欲しいものです。