[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8. テキスト変換のためのファンクション

ファンクションは、makefileにおいて操作するファイルや使用するコマンドの 計算をするためにテキスト処理を行なうことを可能にします。ファンクションは ファンクションコールで用い、ファンクション名を与えた場所で操作を行なう ファンクションの引数をテキストとして与えます。この処理の結果をちょうど 変数の代用のようにmakefileの呼び出した場所に代用するのです。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.1 ファンクションコールのシンタックス

ファンクションコールは、変数の参照と似ています。以下のように表わします。

 
$(function arguments)

あるいは、以下のように表わします。

 
${function arguments}

ここで、functionはファンクション名で、makeの一部である短い 名前のリストです。また、組み込みファンクションであるcallを使用して 独自のファンクションを作成することもできます。

argumentsはファンクションの引数で、ファンクション名と複数の スペースまたはタブで区切られています。1つ以上の引数を持つ場合はカンマで 区切られます。しかし、空白やカンマは引数の値の一部ではありません。 括弧あるいはブラケットであろうと、ファンクションコールで用いたデリミタは 引数においてもペアで用い、そのほかのデリミタは単独で用います。引数自身が ほかのファンクションコールや変数の参照を含む場合、すべての参照に対して同一の デリミタを使用することが賢明です。すなわち、‘$(subst a,b,${x})’ ではなく‘$(subst a,b,$(x))’と記述するほうがよいのです。 このほうがわかりやすく参照の終わりをみつけるのに1種類のデリミタと マッチさせられるからです。

個々の引数に対して書かれたテキストは変数の代用と引数の値を生み出す ファンクションコールの代用によって処理されます。その代用は引数の順序に 従って行なわれます。

カンマと対応のない括弧あるいはブラケットは引数のテキストに書いては なりません。また、スペースは最初の引数に書いてはいけません。 これらは変数の代用による引数の値となるからです。最初にカンマと スペース文字とは異なる変数commaspaceの定義を行ないます。 そしてそれらの文字が必要な場所で代用をします。以下に例を示します。

 
comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
# barは`a,b,c'。

ここで、substファンクションはfooの値を通して、 スペースをカンマで置換し、結果を代用します。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.2 文字列の代用と分析のファンクション

ここでは、文字列の操作を行なういくつかのファンクションを扱います。

$(subst from,to,text)

textにおいてテキストの置換を行ないます。fromtoですべて 置換されます。結果はファンクションコールに代用されます。たとえば、 以下のように、

 
$(subst ee,EE,feet on the street)

は、‘fEEt on the strEEt’の文字列を代用します。

$(patsubst pattern,replacement,text)

tesxtのなかの空白で区切られた語のpatternとマッチする部分を みつけだし、replacementでそれらを置換します。このpatternは ワイルドカードの‘%’を含み、語のなかのすべての文字とマッチさせます。 replacementにも‘%’がある場合、その‘%’はpatternの なかの‘%’にマッチしたテキストに置換されます。

patsubstファンクション呼び出しにおいて‘%’文字は先行する バックスラッシュによって引用されます。‘%’文字を別の形で引用する バックスラッシュは、さらに複数のバックスラッシュで引用されます。 ‘%’文字、あるいはほかのバックスラッシュを引用するバックスラッシュは ファイル名の比較やstemの代用がされるまえにパターンから削除されます。 たとえば、パターン‘the\%weird\\%pattern\\’は‘%’文字のまえに ‘the%weird\’を持ち‘pattern\\’があとに続きます。 終わりの2つのバックスラッシュは‘%’文字に何の影響も与えないため 取り残されます。

語と語のあいだの空白は1個の空白にまとめられ、それ以外のスペースは 破棄されます。

たとえば以下のようになります。

 
$(patsubst %.c,%.o,x.c.c bar.c)

は、‘x.c.o bar.o’を導きます。

代用参照(see section 代用の参照.)は patsubstの効果を得るのに、より簡単な方法です。

 
$(var:pattern=replacement)

は、以下と同じです。

 
$(patsubst pattern,replacement,$(var))

2番目の方法としては、patsubstの一般的な用法の1つを簡素化したもので、 ファイル名の最後のサフィックスを置換するものです。

 
$(var:suffix=replacement)

は、以下と同じです。

 
$(patsubst %suffix,%replacement,$(var))

たとえば、以下のようなオブジェクトファイルのリストがあるとします。

 
objects = foo.o bar.o baz.o

対応するソースファイルのリストを得るには、以下のように簡単に書くことができます。

 
$(objects:.o=.c)

一般的な書式を使うかわりに、

 
$(patsubst %.o,%.c,$(objects))

と書くことができます。

$(strip string)

stringから前後の空白を切り取り、なかの複数の空白を1個のスペースで 置換します。たとえば、‘$(strip a b c )’の結果は‘a b c’ となります。

stripファンクションは条件文と連携して用いた場合には非常に有益です。 ifeqあるいはifneqを使用して空の文字列と何かを比較する際、 空白と空の文字列がマッチしてほしいと願うはずです (see section Makefileの条件文.)。

しかし、以下の例は望んだ結果とは異なる結果になるでしょう。

 
.PHONY: all
ifneq   "$(needs_made)" ""
all: $(needs_made)
else
all:;@echo 'Nothing to make!'
endif

ifneqディレクティブにおいて、ファンクションコール ‘$(strip $(needs_made))’を用いて変数参照 ‘$(needs_made)’を置換するほうが確実です。

$(findstring find,in)

findの出現に対してinをサーチする場合、値はfindになり、 さもなければ値は空になります。与えられた文字列の特定の部分文字列の存在を テストするために条件文のなかでこのファンクションを使用することができます。 したがって、以下の2つの例

 
$(findstring a,a b c)
$(findstring a,b c)

は、‘a’と‘’(空の文字)を導きます。 findstringの実用的なアプリケーションについては、 See section フラグテストの条件文.。

$(filter pattern…,text)

どのpatternとマッチするtextにおける空白で区切られた 語のすべてを返します。そして、マッチしない語はすべて削除します。ここで、 パターンは‘%’を使用して書かれたもので、patsubstファンクションで 用いられたものとよく似ています。

filterファンクションは変数におけるファイル名のような異なった タイプの文字列を分離するのに用いられます。たとえば、以下のように、

 
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
        cc $(filter %.c %.s,$(sources)) -o foo

は、‘foo’は‘foo.c’、‘bar.c’、‘baz.s’と‘ugh.h’に 依存していますが、‘foo.c’、‘bar.c’と‘baz.s’だけはコマンドで コンパイラに対して指定されているという意味です。

$(filter-out pattern…,text)

どのpatternともマッチしないtextにおける空白で 区切られた語のすべてを返します。そしてマッチする語はすべて削除します。 これはfilterファンクションの完全に逆のファンクションです。

patternの語とマッチするtext中の空白で区切られたすべての語を 削除し、マッチしないものだけを返します。この機能は filterとはまったく正反対のものです。

たとえば、以下のようなものです。

 
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o

以下の例では、‘main’にないすべてのオブジェクトファイルのすべてのリストを 生成します。

 
$(filter-out $(mains),$(objects))
$(sort list)

listの語を辞書的な順でソートし、重複した語を削除します。出力は1個の スペースで区切られた語のリストです。

 
$(sort foo bar lose)

は、値として‘bar foo lose’を返します。

sortは付随的に重複した語を削除しますので、ソートの順を気にせずに これを使用することができます。

substpatsubstの使用例として現実的なものをあげます。 makefileがVPATH変数によってディレクトリリストを指定し、makeは 必要条件のファイルをサーチするとしてください (see section VPATH:すべての必要条件のサーチパス.)。 この例では、Cのコンパイラに対してディレクトリの同じリストにおける ヘッダファイルをサーチすることをどのように伝えるかを示しています。

VPATHの値は‘src:../headers’のようなコロンで区切られた ディレクトリのリストです。最初にsubstファンクションでコロンが スペースに置換されます。

 
$(subst :, ,$(VPATH))

この結果‘src ../headers’が得られます。そして、patsubstが それぞれのディレクトリ名を‘-I’フラグに戻すために用いられます。 この結果は変数CFLAGSの値に付加され、Cコンパイラに自動的に渡されます。

 
override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

この効果はテキスト‘-Isrc -I../headers’を以前に与えられたCFLAGS の値に追加することになります。overrideディレクティブは、以前の CFLAGSの値がコマンドの引数で指定されていたとしても新しい値を 割り当てるのに用いられます (see section overrideディレクティブ.)。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.3 ファイル名に対するファンクション

ここでは、ファイル名やファイル名のリストに関連したいくつかの組み込み済みの 拡張ファンクションについて解説します。

以下のファンクションのそれぞれはファイル名について指定された変換を 行なうものです。ファンクションの引数は一連のファイル名としてみなされ、 空白で区切られます。(前後の空白は無視されます。)それぞれの ファイル名は同じ方法で変換され、1個のスペースで連結された結果となります。

$(dir names…)

namesのファイル名からディレクトリ部を抜き出します。ファイル名の ディレクトリ部はそのなかの最後のスラッシュよりまえのすべてです。スラッシュを 含まない場合は、ディレクトリ部は文字列‘./’となります。

 
$(dir src/foo.c hacks)

の結果は、‘src/ ./’となります。

$(notdir names…)

namesのファイル名からディレクトリ部でない部分を抜き出します。 スラッシュを含まない場合は、そのまま変更されません。または、最後の スラッシュは破棄されます。

スラッシュで終わるファイル名は空の文字列となります。結果がつねに、 引数として持つ空白で区切られたファイル名と同じ数を 持つわけではないため、好ましくない結果を招きます。しかし、 有効な選択肢はほかに見あたりません。

たとえば、

 
$(notdir src/foo.c hacks)

の場合は、‘foo.c hacks’という結果になります。

$(suffix names…)

namesにおけるファイル名のサフィックスを抜き出します。ピリオドを 含む場合は、最後のピリオドからサフィックスが始まります。サフィックスが 空の文字列の場合もあります。namesがない場合には結果は空となり、 namesが複数のファイル名を含んでいる場合は、より少ないファイル名を 含んだ結果になることを示しています。

たとえば、

 
$(suffix src/foo.c src-1.0/bar.c hacks)

の場合は、‘.c .c’という結果になります。

$(basename names…)

namesにおけるファイル名のサフィックスではない部分を抜き出します。 ピリオドを含む場合は、最後のピリオドから前がベース名になります。 ディレクトリ部のピリオドは無視されます。ピリオドがない場合には、 ベース名はファイル名そのものになります。 たとえば、

 
$(basename src/foo.c src-1.0/bar hacks)

の場合は、‘src/foo src-1.0/bar hacks’となります。

$(addsuffix suffix,names…)

引数のnamesは一連の名前とみなされ、空白で区切られます。 suffixはユニットとして使用されます。suffixの値は個々の ファイル名の終わりに追加され、結果的に大きな名前になるものは1個の スペースをあいだに入れて連結されます。たとえば、

 
$(addsuffix .c,foo bar)

の場合は、‘foo.c bar.c’となります。

$(addprefix prefix,names…)

引数のnamesは一連の名前とみなされ、空白で区切られます。 prefixはユニットとして使用されます。prefixの値は個々の ファイル名の始めに追加され、結果的に大きな名前になるものは1個のスペースを あいだに入れて連結されます。たとえば、

 
$(addprefix src/,foo bar)

の場合は、‘src/foo src/bar’となります。

$(join list1,list2)

2つの引数を1語ずつ連結します。2つの語(それぞれの引数から1語ずつ)を 連結して1番目の結果とします。2番目についても同じように連結して これを繰り返します。結果的にn番目の語はそれぞれの引数の n番目を連結したものになります。片方の引数がもう一方より 多くの語を持つ場合には、結果が変わらないように特別な語がコピーされます。

例としては、‘$(join a b,.c .o)’は‘a.c b.o’を導きます。

リストのなかの語のあいだのスペースは保存されず、1個のスペースに 置き換えられます。

このファンクションは、dirnotdirファンクションの結果を マージし、この2つのファンクションに与えられたファイルのリストを独自に 作り出します。

$(word n,text)

textn番目の語を返します。このときのnは1から始まります。 ntextの語の数よりも多い場合には値は空になります。 たとえば、

 
$(word 2, foo bar baz)

は、‘bar’を返します。

$(wordlist s,e,text)

textのなかのsで始まりeで終わる語のリストを返します。 seの値は同じく1から始まります。etextの 語の数よりも多い場合にはtextの終わりまでの語を返し、seよりも多い場合には何も返しません。たとえば、

 
$(wordlist 2, 3, foo bar baz)

は、‘bar baz’を返します。

$(words text)

textのなかの語数を返します。したがって、textの最後の語は $(word $(words text),text)となります。

$(firstword names…)

引数namesは空白で区切られた一連の名前とみなされます。 値はその一連のなかの最初の名前となります。残りの名前は無視されます。

たとえば、

 
$(firstword foo bar)

は、‘foo’という結果を導きます。$(firstword text)$(word 1,text)と同じですが、firstwordファンクションは その簡便さを保ちます。

$(wildcard pattern)

引数patternはファイル名のパターンで、一般にワイルドカード文字 (シェルにおけるファイル名のパターンのように)を含みます。wildcardの 結果はパターンにマッチした実在するファイル名のリストでそれはスペースで 区切られています。See section ファイル名におけるワイルドカードの使用.。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.4 foreachファンクション

foreachファンクションは、ほかのファンクションとは大きく異なります。 テキストのまとまりを繰り返し使用できるようにし、それぞれ異なる代用とともに 使用されます。これはシェルshにおけるforコマンドや Cシェル:cshにおけるforeachコマンドに似ています。

foreachファンクションのシンタックスは以下のようになります。

 
$(foreach var,list,text)

varlistの2つの引数はほかに先駆けて最初に展開されます。最後の 引数に注目してください。textは同時に展開されません。listの 展開された値のそれぞれの語に対して、varの展開された値による変数名が 語にセットされ、その後textが展開されます。おそらくtextは 変数への参照を含むため、その展開結果は毎回異なります。

結果として、listの空白で区切られた語の数と同じ回数textは 展開されます。textの複数展開はスペースで連結され、foreach ファンクションの結果となります。

ここでの簡単な例では、リスト‘dirs’のなかのディレクトリのすべての ファイルのリストに対して変数‘files’をセットします。

 
dirs := a b c d
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))

ここで、textは‘$(wildcard $(dir)/*)’です。最初の繰り返しが dirに対する変数‘a’でみつかります。したがって、 ‘$(wildcard a/*)’という同じ結果を導きます。2番目の繰り返しは ‘$(wildcard b/*)’を導き、3番目は‘$(wildcard c/*)’を導きます。

この例では以下の例と同じ結果(‘dirs’へのセットを除けば)になります。

 
files := $(wildcard a/* b/* c/* d/*)

textが複雑な場合、付加的な変数を用いてそれに名前を与えて読みやすさを 改善することができます。

 
find_files = $(wildcard $(dir)/*)
dirs := a b c d
files := $(foreach dir,$(dirs),$(find_files))

ここではその方法を用い、変数find_filesを使用します。再帰的展開を 行なう変数を‘=’を使用して定義します。そしてその値は、foreachの コントロールのもとで再度展開されるように実際のファンクションコールの値を 持ちます。find_filesの定義の際に1度だけwildcardが 呼び出されるため、単純展開される変数は定義できません。

foreachファンクションは変数varに対して永続的な効果を 持ちません。foreachファンクションの呼び出し以降の変数の値と フレーバーは以前のものと同じです。listから得られたほかの値は foreachの実行のあいだの一時的な効果しか持ちません。変数varforeachの実行のあいだは単純展開を行なう変数です。 もしforeachファンクションの呼び出し以前にvarが 定義されていない場合には、その呼出し語も定義されないままです。 See section 変数の2つのフレーバー.。

変数名を、結果的に生じる複雑な変数表現を使用する際には注意しなければ なりません。理由は、多くの予期しないものが有効な変数名であるもののそれが 意図したものではないことがあるからです。たとえば、

 
files := $(foreach Esta escrito en espanol!,b c ch,$(find_files))

find_filesの値が、名前が‘Esta escrito en espanol!’である変数を 参照する場合は有益ですが、誤りのように見えます。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.5 ifファンクション

ifファンクションは文脈のなかで条件文の展開を補助する機能を提供します (GNUのmakeのmakefileでifreq (see section 条件文のシンタックス.)のようなの条件文に 対比されるもの)。

ifファンクションコールは2つあるいは3つの引数をとります。

 
$(if condition,then-part[,else-part])

最初の引数であるconditionは前後の空白を取り除かれ展開されます。 空でない文字列に展開された場合、その条件は真とみなされます。反対に空の 文字列に展開された場合は偽とみなされます。

条件が真であるとき、2番目の引数then-partが評価されます。そして ifファンクションの全体の評価の結果としてこれが使用されます。

条件が偽であるとき、3番目の引数else-partが評価されます。そして ifファンクションの結果としてこれが使用されます。 3番目の引数がない場合にはifファンクションは評価されません (空の文字列と評価)。

注意すべきことは、then-partあるいはelse-partの一方だけが 評価されることで、両方評価されることはないということです。したがって、 どちらの場合も副次的な作用(shellファンクションコールのような)を 持つかもしれません。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.6 callファンクション

callファンクションは新しいパラメータファンクションを作成する点で ユニークです。変数の値に応じて複雑な表現を記述でき、callを 使用して異なる値でそれを展開することができます。

callファンクションのシンタックスは以下のようになります。

 
$(call variable,param,param,…)

makeがこのファンクションを展開する際、個々のparamを一時的な 変数$(1)$(2)などに割り当てます。変数$(0)には variableが入ります。パラメータの引数の数の最大値には制限がありません。 最小値にも制限がありませんが、パラメータなしでcallを使用するのは 無意味です。

また、variableはそれらの一時的な割り当ての文脈のなかでmakeの 変数として展開されます。したがって、variableの値における$(1)に 対するすべての参照はcallの呼び出しのなかの1番目のparamに 決められます。

注意しなければならないのは、variableは変数の名前であって、 その変数への参照ではないことです。したがって、通常は記述する際に ‘$’や括弧を使わないのです。(しかし、名前が定数でないことを望む場合は 名前において変数の参照を使用します。)

variableが組み込みファンクションの名前である場合にはその組み込み ファンクションがつねに呼び出されます(makeの変数として すでに存在したとしても)。

callファンクションはparam引数を一時的な変数に割り当てるまえに 展開します。このことはvariableの値が特別な展開のルールを持つ foreachifのような組み込みファンクションへの参照を 含んでいることを意味します。そしてそれは期待どおりには働かないかもしれません。

いくつかの例がこのことを明らかにしてくれます。

このマクロは引数を単純に反対にします。

 
reverse = $(2) $(1)

foo = $(call reverse,a,b)

ここで、fooは‘b a’を含みます。

次の例はもう少し意味深いものです。PATHにおいてプログラムの最初の インスタンスをサーチするマクロを定義しています。

 
pathsearch = $(firstword $(wildcard $(addsufix /$(1),$(subst :, ,$(PATH)))))

LS := $(call pathsearch,ls)

変数LS/bin/ls、あるいは似たものを含みます。

callファンクションはネストが可能です。それぞれの再帰的な呼び出しは $(1)に対する自身のローカルな値を得て、より上位のcallの値を マスクします。例としては、mapファンクションのインプリメンテーションが それに相当します。

 
map = $(foreach a,$(2),$(call $(1),$(a)))

ここで、originのような1つだけ引数をとるファンクションを1ステップで 複数の値にmapできます。

 
o = $(call map,origin,o map MAKE)

そして、‘file file default’のような何かを含むoで終わることが できます。

最終的な警告:callの引数に空白を加える際は注意してください。 ほかのファンクションと一緒に使用する場合、2番目と補助的な引数のなかの スペースは保持されます。このことが奇妙な結果を招きます。一般的に、 callにパラメータを提供する際にはすべての空白を取り除くことが もっとも安全な方法です。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.7 originファンクション

originファンクションは変数の値に基づいて動作しないほかの大部分の ファンクションとは異なり、変数についての情報を示します。とくにその変数が どこから由来するものかについて示します。

originファンクションのシンタックスは以下のようなものです。

 
$(origin variable)

注意すべきことは、variableは問い合わせを行なう変数の名前で あることで、その変数への参照ではないことです。したがって、記述する際に 通常は‘$’や括弧は使用しません。(しかし、名前が定数でないことを望む場合は 名前において変数の参照を使用します。)

このファンクションの結果はvariableがどのように定義されたかを示す 文字列です。

undefined

variableが定義されていない場合。

default

CCなどで一般的なように、variableがデフォルトの定義を持つ場合。 See section 暗黙のルールで使用される変数.。 そのデフォルトの値を再定義する場合にはoriginファンクションは あとの定義の始まりを返すことに注意してください。

environment

variableが環境変数として定義されている場合で、‘-e’オプションが 有効になっていない場合(see section オプションのサマリー.)。

environment override

variableが環境変数として定義されている場合で、‘-e’オプションが 有効になっている場合(see section オプションのサマリー.)。

file

variableがmakefileのなかで定義されている場合。

command line

variableがコマンド行で定義されている場合。

override

variableがmakefileのoverrideディレクティブで定義されている場合 (see section overrideディレクティブ.)。

automatic

variableが個々のルールに対するコマンドの実行に対して定義された 自動変数の場合(see section 自動変数.)。

この情報は変数の値を信用するかどうかを決める際にもっとも有益なものです (好奇心のためではないとして)。たとえば、makefile ‘bar’を含む makefile ‘foo’があると考えてください。コマンド‘make -f bar’を 実行する場合には、たとえ環境変数にbletchの定義があるとしても、 変数bletchが‘bar’で定義されていることを期待します。 しかしながら、‘bar’をインクルードするまえに‘foo’がbletchを 定義する場合、その定義をオーバーライドすることは望まないはずです。 これは‘foo’のなかのoverrideディレクティブを使用することで 解決できます。これは、‘bar’のなかのあとで定義されたものよりも 優位な定義を与えることです。しかし、overrideディレクティブは コマンド行での定義をオーバーライドしてしまうため、結果的に‘bar’が インクルードしてしまいます。

 
ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf, gag, etc.
endif
endif

bletchが環境変数から定義される場合、再定義されます。

-e’オプションが使用されていて、環境変数からきているbletchの 以前の定義をオーバーライドしたい場合には、以下のように記述します。

 
ifneq "$(findstring environment,$(origin bletch))" ""
bletch = barf, gag, etc.
endif

$(origin bletch)’が‘environment’あるいは‘environment override’ を返す場合に再定義が行なわれます。 See section 文字列の代用と分析のファンクション.。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.8 shellファンクション

shellファンクションは、makeの外部との伝達をする点で wildcardファンクション (see section ワイルドカードの機能.)を除いてほかの ファンクションと似ていません。

shellファンクションは多くのシェルでのバッククォート‘`’の動作と 同様の働き、すなわちコマンドの展開をします。これは、それが シェルコマンドでありコマンドの出力を返す引数をとることを意味しています。 結果に対してmakeが行なう唯一の処理は、周囲のテキストに代入するまえに、 改行あるいはキャリッジリターン/改行を1個のスペースに置換することです。 また、最後あるいは後続の改行(またはキャリッジリターン/改行)も また取り除かれます。

呼び出しによってshellファンクションで実行されるコマンドは ファンクションコールが展開されるときに実行されます。ほとんどのケースでは、 makefileが読み込まれるタイミングです。例外は、ルールのコマンドのなかの ファンクションコールはコマンドが実行されるときであるということで、 ほかの場合と同じようにshellファンクションに適用されます。

ここにshellファンクションの仕様のいくつかの例をあげます。

 
contents := $(shell cat foo)

は、contentsをファイル‘foo’のコンテンツにセットします。 このとき改行ではなくスペースで各行を分離します。

 
files := $(shell echo *.c)

は、filesを‘*.c’の展開にセットします。makeがおかしな シェルを使用しない限り、‘$(wildcard *.c)’と同じ結果をもたらします。


[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

8.9 Makeをコントロールするファンクション

これらのファンクションはmakeの動作をコントロールします。一般的に、ある種の 環境によるエラーが検出された場合、それらはmakefileのユーザーに情報を提供し、 makeを停止させます。

$(error text…)

メッセージがtextである場所で致命的なエラーを生成します。 注意しなければならないのは、このファンクションが評価された場合は つねにエラーが生成されるということです。したがって、コマンドスクリプトの 内部や再帰的変数割り当ての右側に置いた場合、評価されないままになるでしょう。 textはエラーが生成されるまえに展開されます。

たとえば

 
ifdef ERROR1
$(error error is $(ERROR1))
endif

は、make変数がERROR1であると検出された場合に、makefileの 読み込み時に致命的なエラーを生成します。

 
ERR = $(error found an error!)

.PHONY: err
err: ; $(ERR)

は、errターゲットが呼び出された場合、makeの実行中に致命的な エラーを生成します。

$(warning text…)

このファンクションはerrorファンクションと似た動作をしますが、 makeは終了しません。かわりに、textが展開され、結果の メッセージが表示されます。しかしmakefileの処理は継続します。

このファンクションの展開の結果は空の文字列となります。


[ << ] [ >> ]           [冒頭] [目次] [見出し] [ ? ]

この文書は新堂 安孝によって2009年9月22日texi2html 1.82を用いて生成されました。