Makefileの変数とShellの変数
変数とは、文字列を連結する名前です.この文字列は変数の値です.
変数の定義は「=」またはインジケータ「define」を使用します.
変数の展開は、厳密な文字列置換です.
変数の参照
Makefile中:
Makefileでは、変数の参照方法:
Makefileには、記号
shell中:
Shellにおいて、変数の参照方法:
Makefileでは、いくつかの簡単な変数に対する参照は、
一般的な多文字変数の参照には括弧が必要です.そうでないと、makeは文字列全体ではなく変数名の頭文字を変数として使用します.
MakefileではMakefileの変数とShellの変数が混同されないようにします.
Makefileの3つの基本的な要素:目標、依存、コマンド.
コマンドは、shellコマンドラインの下で実行されるコマンドであり、shellスクリプトの実行内容として理解されます.
shellスクリプトで変数が使用できるなら、Makefileのコマンドでshell変数も使用できます.
では、Makefileの変数とshellの変数を混同しないためにはどうすればいいですか?例二と例三中echoは、Makefile中の変数であり、その値はbcd である.の例の一例では、 である.の例四において、シナリオが実行されたに相当し、シナリオの内容は 私たちがMakefileを書く時、各部分の変数が引用するフォーマットは以下のように提案します. make変数(Makefileで定義されている環境変数またはmakeの環境変数)の参照は、 は、ルールコマンドラインにおいてshell変数(一般的には実行中の一時変数であり、Makefile変数ではなく、shell変数)が参照され、shellを使用する ペアのコマンドラインに表示されるmake変数についても、
変数の定義は「=」またはインジケータ「define」を使用します.
変数の展開は、厳密な文字列置換です.
変数の参照
Makefile中:
Makefileでは、変数の参照方法:
$(VAR)
または${VAR}
;Makefileでは、変数名が単一文字でない限り、$VAR
は使用できません.Makefileには、記号
$
には特殊な意味(変数または関数の参照を示す)があり、規則では記号$
自体を使用する必要があり、2つの連続する$$
を書く必要がある.shell中:
Shellにおいて、変数の参照方法:
$VAR
または${VAR}
.Shellでは、$(VAR)
を使用して変数を参照することはできません.Shell $() ` ` ( )
bash shell ,$( ) ` ` ( ) (command substitution) 。
$( ) : ` ` unix shell , 。 $( ) shell 。
ブログを参照してくださいMakefileでは、いくつかの簡単な変数に対する参照は、
$(x)
および${x}
を使用して変数を参照することなく、$x
のフォーマットを直接使用して実施することもでき、このような使用は、変数名が単一文字である場合に限られる.また、自動化変数にもこのフォーマットが使われています.一般的な多文字変数の参照には括弧が必要です.そうでないと、makeは文字列全体ではなく変数名の頭文字を変数として使用します.
$PATH
は、Makefileでは実際に$(P)ATH
である.この点はshellの変数の参照方法とは異なる.shellにおける変数の参照は、${xx}
または$xx
フォーマットとすることができる.しかし、Makefileにおける多文字変数名の参照は、$(xx)
または${xx}
形式だけである.MakefileではMakefileの変数とShellの変数が混同されないようにします.
Makefileの3つの基本的な要素:目標、依存、コマンド.
コマンドは、shellコマンドラインの下で実行されるコマンドであり、shellスクリプトの実行内容として理解されます.
shellスクリプトで変数が使用できるなら、Makefileのコマンドでshell変数も使用できます.
では、Makefileの変数とshellの変数を混同しないためにはどうすればいいですか?
# :
var = bcd
all:
var="abc";echo $${var}
# :
zyao@ubuntu:~$ make
var="abc";echo ${var}
abc
zyao@ubuntu:~$
# :
var = bcd
all:
var="abc";echo ${var}
# :
zyao@ubuntu:~$ make
var="abc";echo bcd
bcd
zyao@ubuntu:~$
# :
var = bcd
all:
var="abc";echo $(var)
# :
zyao@ubuntu:~$ make
var="abc";echo bcd
bcd
zyao@ubuntu:~$
# :
var = bcd
all:
var="abc";echo $$(var)
# :
zyao@ubuntu:~$ make
var="abc";echo $(var)
/bin/sh: var: command not found
zyao@ubuntu:~$
上記の4つの例の分析:$$
はここで必要とされる$
号自体を表しているので、allターゲットが実行するコマンドはスクリプトを実行するのに相当し、シナリオの内容はvar="abc";echo ${var}
var="abc";echo $(var)
であり、このようなスクリプトの実行はエラーとなります.$(VAR)
フォーマットを使用しており、「VER」が単文字変数名であるか、それとも多文字変数名であるかにかかわらず.$tmp
フォーマットである.$(CMDVAR)
フォーマットを使用して参照します.# example
:
:
SUBDIRS := module1_src module2_src
subdir:
@for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir || exit 1; \
done
:
: