今回もGNU makeに特徴的な機能を取り上げる。変数の種類を表示するorigin関数だ。使う機会は限られているかもしれないが、知っておいて損はない。

変数の種類を表示するorigin関数

GNU makeには変数の種類(状態)のようなものを表示する「origin」という関数が用意されている。makeの仕組みを把握していれば、特に必要な機能ではない。無理やり指定された変数をさらに上書きするなど強制的な処理を行う場合に使うことはできるが、あまり無理なことはしない方が良いと思う。

まず、origin関数の使い方とその機能を見てみよう。

関数 シンタックス
origin $(origin 変数名)
関数 内容
origin 変数の由来を表示する

今回も、実際のMakefileを見ながら、origin関数の動きを見ていってみよう。

origin関数の動きを調べるMakefile

今回はorigin関数の動きを知るために次のようなMakefileを用意した。

LANG=       C
val=        val
override val3=  val3

test: list-vals
    @echo $$\(origin nondef\)
    @echo " ==>" $(origin nondef)
    @echo 

    @echo $$\(origin CC\)
    @echo " ==>" $(origin CC)
    @echo 

    @echo $$\(origin PATH\)
    @echo " ==>" $(origin PATH)
    @echo 

    @echo $$\(origin LANG\)
    @echo " ==>" $(origin LANG)
    @echo 

    @echo $$\(origin val\)
    @echo " ==>" $(origin val)
    @echo 

    @echo $$\(origin val2\)
    @echo " ==>" $(origin val2)
    @echo 

    @echo $$\(origin val3\)
    @echo " ==>" $(origin val3)
    @echo 

    @echo $$\(origin @\)
    @echo " ==>" $(origin @)
    @echo 

list-vals:
    @echo "LANG=        C"
    @echo "val=     val"
    @echo "override val3=   val3"
    @echo

早速、実行結果を見てみよう。次のようになる。

% make -e val2=foo
LANG=           C
val=            val
override val3=  val3

$(origin nondef)
        ==> undefined

$(origin CC)
        ==> default

$(origin PATH)
        ==> environment

$(origin LANG)
        ==> environment override

$(origin val)
        ==> file

$(origin val2)
        ==> command line

$(origin val3)
        ==> override

$(origin @)
        ==> automatic
% 
  • 実行結果

    実行結果

origin関数は指定された変数が「何」であるかを表示している。ここで表示されている「何」とは、undefined、default、environment、environment override、file、command line、override、automaticだ。それぞれ何を意味しているのか見ていこう。