2011-01-19 101 views
0

我正在學習Makefiles和應用程序交叉編譯,我想找到一種方法來防止變量在Makefiles中被重新定義。防止變量在Makefiles中被重寫?

舉個例子,我寫了一個頂層Makefile /usr/src/someapp.mk那將...

1)從網絡到/ usr/src目錄/ someapp-下載應用程序的源代碼1.2.3/

2)解壓縮的源極,和

3)運行其原始/usr/src/someapp-1.2.3/Makefile

由於原來的生成文件被寫爲一項獨立獨自一人的腳本,它會不知不覺地(重新)用當地val定義通常的嫌疑犯(CC,AR/RANLIB等)統一電力公司,從而有效地擦除我選擇在頂層Makefile值:

#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)... 

我想用戶能夠下載原始的源代碼,而不是提供我自己的,修改的版本:有沒有辦法來當變量在本地被重新定義或者在運行中重寫它們時,「make」要麼忽略?

謝謝。

回答

1

?=運算符將只定義一個變量,如果它未被設置。

VAR ?= value 

到目前爲止,雖然最有用的方法是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 2011-01-19 18:07:05