2011-10-21 93 views
2

聲明我有一個Makefile具有可變如下:生成文件設定如果目標

AVAR="" 

all : 
    if [ -d ../old ]; then \ 
    (echo "[email protected] Ping!"; AVAR="../old"; echo $(AVAR)) \ 
    fi 
    @echo $(AVAR) 

的想法是,根據目錄的存在「../old」我還是不 有信息在AVAR(稍後可用),但是,如果評估爲真,Ping!被迴應,但沒有分配給AVAR,無論是在if語句內部還是外部。

輸出如下:

$ make all 
if [ -d ../old ]; then \ 
     (echo "all Ping!"; AVAR="../old"; echo "") \ 
     fi 
all Ping! 

任何見解理解。

回答

0

問題解決了,做了非常糟糕的遞歸make選項重新定義的東西,並重新詮釋。

0

嘗試

(echo "[email protected] Ping!"; AVAR="../old"; echo $$AVAR) \ 

代替

(echo "[email protected] Ping!"; AVAR="../old"; echo $(AVAR)) \ 
+0

差不多,它適用於echo _within_ if,但不是if之外的那個。 – NWS

+0

最簡單的解決方案?通過在'fi'之後放置; \來鏈接它。 – eriktous

0

1)在生成文件配方每個命令運行在其自己的子shell。您在第一個命令(「if」語句)中定義了AVAR,因此它不可用於第二個命令(@echo $(AVAR))。

2)在第一個命令中,你定義了AVAR,但是你沒有把它稱爲正確的。術語$(AVAR)是Make語法;在執行命令之前進行擴展,由於Make對這樣的變量一無所知,所以它擴展爲無。您必須使用shell來擴展它,使用shell語法:$AVAR。但是,如果你嘗試這樣做,Make會將$A擴大爲空,你會得到「VAR」。所以,你「逃」了$另一個$

all : 
    if [ -d ../old ]; then \ 
    (echo "[email protected] Ping!"; AVAR="../old"; echo $$AVAR) \ 
    fi 
+0

幾乎,它適用於if中的回聲,但不適用於if之外的回聲。 – NWS

+0

@NWS,正如我在1)所說的,你在一個命令中賦值的值在另一個命令中不可用。你是否想用同樣的規則('all')或不同的規則再次使用該值? – Beta

+0

「以後可以使用」 - 我認爲這意味着在這個規則中,_and_當其他規則在後面進行評估時,這就是爲什麼我在AVAR _before_規則定義中聲明的原因。 – NWS

相關問題