2011-08-10 10 views
1

私が使用しているMakefileがあります。これはどこかから得たもので、かなり大きいものです。私はmakefileの中で時々変更したいものもいくつか見つけました。私にとってはmakefileの最初に(スイッチの)変数(例えば、OVWRCHOICE)を定義することです。そしてその後にメイクファイルのコードでは、ような何か:すべてのダンディと罰金です変数への条件付きインクルード/実行

ifdef OVWRCHOICE 
    MYOPT = override 
    .... 
endif 

を...。

最後に、「オーバーライド」の部分も変更する必要があるので、ファイルの先頭に置いておきたいと思います。したがって、このオーバーライド部分にはいくつかのmakeコマンドが含まれています。defineを使用して、コマンド(これはifdef OVWRCHOICE...部分で実行される)を含む変数を使用しようとしました。

だから私はこの単純な例に到着しました:

# uncomment as needed; 
OVWRCHOICE = YES 

define SET_OVWRCHOICE 
    MYOPT = override 
endef 
export SET_OVWRCHOICE 

# ... many lines of code ... 

MYOPT = default 

# ... many lines of code... 

# without indent: Makefile:18: *** missing separator. Stop. 
# with tab indent: Makefile:18: *** commands commence before first target. Stop. 
ifdef OVWRCHOICE 
    $(SET_OVWRCHOICE) 
endif 

all: 
    @echo $(MYOPT) 

...エラーが指摘して失敗します。もちろん、投稿の最初のスニペットを代わりに使用すると、すべて正常に実行され、makeは「上書き」という結果を表示します。

このようなことを達成するにはどうすればいいですか?この文脈では、「Makefileコマンド」の「包含」または「実行」が正しい用語であるかどうかは不明です。だから私は検索のための出発点を見つけることに苦労しています:)

答えて

2

これは、Eval Function - GNU `make'に記載されています。右の構文は次のようになります。これは誰かに役立ちます

ifdef OVWRCHOICE 
$(eval $(call SET_OVWRCHOICE)) 
endif 

希望、
乾杯!

1

まあ、このスニペットをアーカイブする場所は本当に分かりませんでしたので、私のこの古い質問に戻ってください:これはOPのトピックです。しかし、ここに行く:

環境変数がメイクファイルによって処理されているかテストするには、ここでは簡単な例です:

Foo=something 
all : 
ifdef DEBUG 
    @echo "Debug defined" 
else 
    @echo "Debug NOT defined" 
endif 

...と、ここではそのためのテストです:

$ make 
Debug NOT defined 
$ make DEBUG 
make: *** No rule to make target `DEBUG'. Stop. 
$ DEBUG make 
DEBUG: command not found 
$ DEBUG= make 
Debug NOT defined 
$ DEBUG=1 make 
Debug defined 

...明らかに、コマンドラインからmakefileの中でその変数を設定する正しい構文は、 "DEBUG=1 make"

です。