Makefileの変数とShellの変数


変数とは、文字列を連結する名前です.この文字列は変数の値です.
変数の定義は「=」またはインジケータ「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つの例の分析:
  • 例二と例三中echoは、Makefile中の変数であり、その値はbcd
  • である.
  • の例の一例では、$$はここで必要とされる$号自体を表しているので、allターゲットが実行するコマンドはスクリプトを実行するのに相当し、シナリオの内容はvar="abc";echo ${var}
  • である.
  • の例四において、シナリオが実行されたに相当し、シナリオの内容はvar="abc";echo $(var)であり、このようなスクリプトの実行はエラーとなります.
  • 私たちがMakefileを書く時、各部分の変数が引用するフォーマットは以下のように提案します.
  • make変数(Makefileで定義されている環境変数またはmakeの環境変数)の参照は、$(VAR)フォーマットを使用しており、「VER」が単文字変数名であるか、それとも多文字変数名であるかにかかわらず.
  • は、ルールコマンドラインにおいてshell変数(一般的には実行中の一時変数であり、Makefile変数ではなく、shell変数)が参照され、shellを使用する$tmpフォーマットである.
  • ペアのコマンドラインに表示されるmake変数についても、$(CMDVAR)フォーマットを使用して参照します.
  • # example
    :
    :
    SUBDIRS := module1_src module2_src
    subdir:
    	@for dir in $(SUBDIRS); do \
    		$(MAKE) -C $$dir || exit 1; \
    	done
    :
    :