[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
ファンクションは、makefileにおいて操作するファイルや使用するコマンドの 計算をするためにテキスト処理を行なうことを可能にします。ファンクションは ファンクションコールで用い、ファンクション名を与えた場所で操作を行なう ファンクションの引数をテキストとして与えます。この処理の結果をちょうど 変数の代用のようにmakefileの呼び出した場所に代用するのです。
8.1 ファンクションコールのシンタックス | How to write a function call. | |
8.2 文字列の代用と分析のファンクション | General-purpose text manipulation functions. | |
8.3 ファイル名に対するファンクション | Functions for manipulating file names. | |
8.4 foreach ファンクション | Repeat some text with controlled variation. | |
8.5 if ファンクション | Conditionally expand a value. | |
8.6 call ファンクション | Expand a user-defined function. | |
8.7 origin ファンクション | Find where a variable got its value. | |
8.8 shell ファンクション | Substitute the output of a shell command. | |
8.9 Makeをコントロールするファンクション | Functions that control how make runs. |
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
ファンクションコールは、変数の参照と似ています。以下のように表わします。
$(function arguments) |
あるいは、以下のように表わします。
${function arguments} |
ここで、functionはファンクション名で、make
の一部である短い
名前のリストです。また、組み込みファンクションであるcall
を使用して
独自のファンクションを作成することもできます。
argumentsはファンクションの引数で、ファンクション名と複数の スペースまたはタブで区切られています。1つ以上の引数を持つ場合はカンマで 区切られます。しかし、空白やカンマは引数の値の一部ではありません。 括弧あるいはブラケットであろうと、ファンクションコールで用いたデリミタは 引数においてもペアで用い、そのほかのデリミタは単独で用います。引数自身が ほかのファンクションコールや変数の参照を含む場合、すべての参照に対して同一の デリミタを使用することが賢明です。すなわち、‘$(subst a,b,${x})’ ではなく‘$(subst a,b,$(x))’と記述するほうがよいのです。 このほうがわかりやすく参照の終わりをみつけるのに1種類のデリミタと マッチさせられるからです。
個々の引数に対して書かれたテキストは変数の代用と引数の値を生み出す ファンクションコールの代用によって処理されます。その代用は引数の順序に 従って行なわれます。
カンマと対応のない括弧あるいはブラケットは引数のテキストに書いては
なりません。また、スペースは最初の引数に書いてはいけません。
これらは変数の代用による引数の値となるからです。最初にカンマと
スペース文字とは異なる変数comma
とspace
の定義を行ないます。
そしてそれらの文字が必要な場所で代用をします。以下に例を示します。
comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
# barは`a,b,c'。
|
ここで、subst
ファンクションはfoo
の値を通して、
スペースをカンマで置換し、結果を代用します。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
ここでは、文字列の操作を行なういくつかのファンクションを扱います。
$(subst from,to,text)
textにおいてテキストの置換を行ないます。fromはtoですべて 置換されます。結果はファンクションコールに代用されます。たとえば、 以下のように、
$(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
は付随的に重複した語を削除しますので、ソートの順を気にせずに
これを使用することができます。
subst
とpatsubst
の使用例として現実的なものをあげます。
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
ディレクティブ.)。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
ここでは、ファイル名やファイル名のリストに関連したいくつかの組み込み済みの 拡張ファンクションについて解説します。
以下のファンクションのそれぞれはファイル名について指定された変換を 行なうものです。ファンクションの引数は一連のファイル名としてみなされ、 空白で区切られます。(前後の空白は無視されます。)それぞれの ファイル名は同じ方法で変換され、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個のスペースに 置き換えられます。
このファンクションは、dir
とnotdir
ファンクションの結果を
マージし、この2つのファンクションに与えられたファイルのリストを独自に
作り出します。
$(word n,text)
textのn番目の語を返します。このときのnは1から始まります。 nがtextの語の数よりも多い場合には値は空になります。 たとえば、
$(word 2, foo bar baz) |
は、‘bar’を返します。
$(wordlist s,e,text)
textのなかのsで始まりeで終わる語のリストを返します。 sとeの値は同じく1から始まります。eがtextの 語の数よりも多い場合にはtextの終わりまでの語を返し、sが eよりも多い場合には何も返しません。たとえば、
$(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 ファイル名におけるワイルドカードの使用.。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
foreach
ファンクションforeach
ファンクションは、ほかのファンクションとは大きく異なります。
テキストのまとまりを繰り返し使用できるようにし、それぞれ異なる代用とともに
使用されます。これはシェルsh
におけるfor
コマンドや
Cシェル:csh
におけるforeach
コマンドに似ています。
foreach
ファンクションのシンタックスは以下のようになります。
$(foreach var,list,text) |
varとlistの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
の実行のあいだの一時的な効果しか持ちません。変数varは
foreach
の実行のあいだは単純展開を行なう変数です。
もしforeach
ファンクションの呼び出し以前にvarが
定義されていない場合には、その呼出し語も定義されないままです。
See section 変数の2つのフレーバー.。
変数名を、結果的に生じる複雑な変数表現を使用する際には注意しなければ なりません。理由は、多くの予期しないものが有効な変数名であるもののそれが 意図したものではないことがあるからです。たとえば、
files := $(foreach Esta escrito en espanol!,b c ch,$(find_files)) |
find_files
の値が、名前が‘Esta escrito en espanol!’である変数を
参照する場合は有益ですが、誤りのように見えます。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
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
ファンクションコールのような)を
持つかもしれません。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
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の値が特別な展開のルールを持つ
foreach
やif
のような組み込みファンクションへの参照を
含んでいることを意味します。そしてそれは期待どおりには働かないかもしれません。
いくつかの例がこのことを明らかにしてくれます。
このマクロは引数を単純に反対にします。
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
にパラメータを提供する際にはすべての空白を取り除くことが
もっとも安全な方法です。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
origin
ファンクションorigin
ファンクションは変数の値に基づいて動作しないほかの大部分の
ファンクションとは異なり、変数についての情報を示します。とくにその変数が
どこから由来するものかについて示します。
origin
ファンクションのシンタックスは以下のようなものです。
$(origin variable) |
注意すべきことは、variableは問い合わせを行なう変数の名前で あることで、その変数への参照ではないことです。したがって、記述する際に 通常は‘$’や括弧は使用しません。(しかし、名前が定数でないことを望む場合は 名前において変数の参照を使用します。)
このファンクションの結果はvariableがどのように定義されたかを示す 文字列です。
variableが定義されていない場合。
CC
などで一般的なように、variableがデフォルトの定義を持つ場合。
See section 暗黙のルールで使用される変数.。
そのデフォルトの値を再定義する場合にはorigin
ファンクションは
あとの定義の始まりを返すことに注意してください。
variableが環境変数として定義されている場合で、‘-e’オプションが 有効になっていない場合(see section オプションのサマリー.)。
variableが環境変数として定義されている場合で、‘-e’オプションが 有効になっている場合(see section オプションのサマリー.)。
variableがmakefileのなかで定義されている場合。
variableがコマンド行で定義されている場合。
variableがmakefileのoverride
ディレクティブで定義されている場合
(see section override
ディレクティブ.)。
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 文字列の代用と分析のファンクション.。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
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)’と同じ結果をもたらします。
[ < ] | [ > ] | [ << ] | [上] | [ >> ] | [冒頭] | [目次] | [見出し] | [ ? ] |
これらのファンクションは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を用いて生成されました。