2011-01-19 10 views
0

私はMakefileとアプリケーションのクロスコンパイルについて学んでいます。私は、Makefilesでさらに変数を定義し直すことを防ぐ方法を見つけたいと思っています。Makefilesで変数が書き換えられないようにしますか?

例として、私が)う...

1トップレベルのMakefileの/usr/src/someapp.mkを書き込むは/ usr/src/someapp-へのWebからのアプリケーションのソースコードをダウンロードソースを解凍し1.2.3/

2)、及び

3)オリジナルのMakefileは、スタンドのように書かれたので、元の/usr/src/someapp-1.2.3/Makefile

を実行(CC、AR/RANLIBなど)を定義します。

#My top-level /usr/src/someapp.mk: 
all: 
    wget someapp-1.2.3.tar.gz 
    tar xzvf someapp-1.2.3.tar.gz 
    cd someapp-1.2.3 && $(MAKE) 

#Original Makefile from www /usr/src/someapp-1.2.3/Makefile: 
#RANLIB locally redefined... :-/ 
RANLIB=ranlib 

all: 
    $(RANLIB)... 

が、私は、ユーザーが自分自身の、修正版を提供するのではなく、元のソースコードをダウンロードできるようにしたいと思います:UEの、効果的に私はトップレベルのMakefileで選択した値を消去する方法にはあります変数がローカルで再定義されたときに "make"を無視するか、それらを即座に書き直すか?

ありがとうございます。

答えて

1

?=オペレータは、変数が設定されていない場合にのみ変数を定義します。

VAR ?= value 

ただし、makeコマンドラインで変数を定義するのが最も便利です。このような変数は、makeの実行中は読み取り専用になります。

$ cat Makefile 
VAR := hello 
$(error [${VAR}]) 

その後、

$ make 
Makefile:2: *** [hello]. Stop. 

しかし

$ make VAR='value overridden' 
Makefile:2: *** [value overridden]. Stop. 

これはあなたのスニペットcd someapp-1.2.3 && $(MAKE)$(MAKE) -C someapp-1.2.3 RANLIB=myvalなっ示唆しています。

+0

おかげで多くのことを。私は実験しますか?= – Gulbahar

+0

GNU Makeで少なくとも 'override'指示文で更新されない限り、オーバーライドされます。 –

関連する問題