2013-07-09 100 views
0

這對我不起作用。我想做一些替換,並將其分配給Makefile中的變量。一個例子如下,但我更喜歡用Perl來做,因爲其他替代可能比這更復雜。變量賦值與替換

eval.%: 
    # make eval.exp-1.ans 
    # $* --> exp-1.ans 
    folder=`echo $* | sed -e 's/\..*//g'` 
    # OR 
    folder=`echo $* | perl -ne 'm/(.*)\.ans/; print $$1' 
    # I want that folder will be exp-1 
    echo $$folder ${folder} 

爲什麼這不起作用?我如何在Makefile中做這種事情?

+0

是的,'$ *'是'exp-1.ans'。 '$(basename $ *)'是'exp-1'。 – bobbogo

+0

你能提供一些例子嗎? – bobbogo

+0

@bobbogo嗨。首先,'basename exp-1.ans'如何給我'exp-1'? basename刪除目錄路徑並提供基本文件名。例如:'basename/etc/parr.txt'給你'parr.txt'。 – Thorn

回答

0

你的問題不清楚。你是否試圖在makefile中設置一個變量,以便其他食譜等可以看到它?或者你只是試圖在你的配方的一部分中設置一個變量,可以在同一配方的其他部分使用該變量?

使它運行在它調用的shell中的食譜。這是UNIX的一項基本功能,沒有子進程可以修改內存/環境/工作目錄/ etc。其父程序。因此,在makefile的配方(subshel​​l)中分配的變量不能設置make環境變量。有辦法做到這一點,但不是在一個配方內。然而,這不會出現(從你的例子)是你想要做的。

接下來要注意的是make會在不同的shell中運行配方的每個邏輯行。因此,當一個邏輯行中設置的shell變量將在該shell退出時丟失,並且下一個邏輯行無法看到該值。解決的辦法是確保所有你的食譜中需要的可變訪問的線條都在相同的邏輯線,所以他們會被髮送到同一個shell腳本,像這樣:

eval.%: 
     folder=`echo $* | perl -ne 'm/(.*)\.ans/; print $$1' || exit 1 ; \ 
     echo $$folder 
+0

當然如@ bobbogo指出,如果你只是想刪除一個後綴,然後內置函數將做到這一點。更復雜的替換可以由其他shell函數執行,所以也許這就是你所需要的(注意這些是GNU make的特性:它們不能移植到其他版本的make上)。但是你說「其他替代品一般來說可能更復雜」,所以這將對此有所幫助。 – MadScientist

+0

我會澄清它。其實我想學習兩者。 – Thorn

0

你試過$(VARIABLE:suffix=replacement)語法?在你的情況下,$(*:.ans=)。這將適用於任何後綴,即使它不以點開頭。