2016-10-13 8 views
1

Sub-makeに渡される変数の面白い動作が見えてきました。 make depssub-makeで変数を "リセット"しないようにする

/Library/Developer/CommandLineTools/usr/bin/make -C foo 
1 - SOME_VAR=something 
2 - SOME_VAR=something else 
Getting deps 
1 - SOME_VAR=something 
2 - SOME_VAR=something else 
make[2]: `app' is up to date. 
を実行しているの

./make_test 
| -- foo 
| \ -- Makefile 
\ -- Makefile 

make_test/Makefile

.PHONY: deps 
deps: 
     $(MAKE) -C foo 

.PHONY: deps2 
deps2: export SOME_VAR=something 
deps2: 
     $(MAKE) -C foo 

make_test/foo/Makefile

SOME_VAR ?= something 
$(info 1 - SOME_VAR=$(SOME_VAR)) 

SOME_VAR += else 
$(info 2 - SOME_VAR=$(SOME_VAR)) 

all: deps 
     @$(MAKE) app 

.PHONY: deps 
deps: 
     $(info Getting deps) 

app: foo_a foo_b 
     touch app 

foo_a: 
     touch foo_a 

foo_b: 
     touch foo_b 

結果:私は次のようなレイアウトでおもちゃの例のプロジェクトを作りました210

私はSOME_VARが二度評価されていることを理解しmake deps2

/Library/Developer/CommandLineTools/usr/bin/make -C foo 
1 - SOME_VAR=something 
2 - SOME_VAR=something else 
Getting deps 
1 - SOME_VAR=something else 
2 - SOME_VAR=something else else 
make[2]: `app' is up to date. 

を実行した結果。しかし、depsの場合、最終結果はsomething elseであり、一方deps2something else elseとなります。 depsではなくdeps2を呼び出すとき

私の質問は、なぜSOME_VARの値は、第二の評価の前に「リセット」されません。サブメイクに初期値を渡すのはなぜこの影響を受けますか?

答えて

0

export変数の場合、後でunexportを指定しない限り、その変数は再帰的にexportになります。

ルートのMakefileにexportにそれを作る告げたので、あなたはそれexportSOME_VARsomething elseとしてfoo/Makefile$(MAKE)を呼び出します。

+0

この動作を防止するにはどうしますか?まだサブメイクに値を渡しますか? 'else 'が既に' SOME_VAR'に追加されているかどうかを確認するために 'findstring'を使うことができますが、もっと良い方法があるのでしょうか? – GuessBurger

+0

@GuessBurger私は、あなたの例があまりにもそれに答えるために工夫していると思います。実際にあなたが何をしようとしているかの例はなく、おそらく同じフォルダに再帰するべきではないと思います。 – user657267

関連する問題