2010-05-05 75 views
0
  • PACKAGE_VERSION:= $(版本)X0D $(日期)的Makefile:情侶語法問題

    是什麼版本和日期瓦爾之間的X0D一部分?它只是字符串?

  • 什麼$(dotin_files:。在=)不低於

代碼

dotin_files  := $(shell find . -type f -name \*.in) 
dotin_files  := $(dotin_files:.in=) 
  • 這意味着什麼$(dotin_files:=中)

cod Ë

$(dotin_files): $(dotin_files:=.in) 
$(substitute) [email protected] > [email protected] 
  • 可以針對包含多個文件?

  • 將目標變量聲明爲PHONY是什麼意思?

代碼

.PHONY: $(dotin_files) 
  • 在下面

代碼的正則表達式替換代碼

substitute := perl -p -e 's/@([^@]+)@/defined $$ENV{$$1} ? $$ENV{$$1} : $$&/ge' 

什麼$$ENV{$$1}$$&?我想這是Perl的範圍......

感謝您的時間

回答

2

變量擴展

$()是make變量擴展,這應該只是字符串替換 - 如果你的makefile是

version=1 
date=1.1.10 
package_version:=$(version)x0d$(date) 

然後變量package_version將擴大到1x0d1.1.10

換人

語法$(var:a=b)substitution reference和將擴大到varb取代的後綴a

例如,在

foobar:= foo bar 
faabar:=$(foobar:oo=aa) 

$(faabar)將擴大到字符串faa bar

多目標

在生成規則多個目標等同於具有單一物N規則,例如

foo bar:foo.c bar.c 
    $(CC) -o [email protected] $^ 

相當於

foo:foo.c bar.c 
    $(CC) -o [email protected] $^ 
bar:foo.c bar.c 
    $(CC) -o [email protected] $^ 

記住,任何這裏的變量被擴展。

僞目標

.PHONY目標聲明的規則不會產生實際的文件,所以它總是會建成。一如既往,變量首先被擴展。在你的情況,這將擴大到像

.PHONY: foo bar 

逃離

美元符號是在生成文件轉義字符,在你的Perl例如$$是文字$,如substitute將字符串

perl -p -e 's/@([^@]+)@/defined $ENV{$1} ? $ENV{$1} : $&/ge' 

這裏的美元符號是由perl處理的,可能會給環境變量(我不知道perl)。

+0

@斯科特威爾士:謝謝,但沒有回答我的問題。我知道什麼是變數,PHONY和轉義... – Pablo 2010-05-05 07:05:35

+0

@Michael:那麼哪個部分沒有回答? – 2010-05-05 07:16:12

+0

@Ignacio:在 – Pablo 2010-05-05 07:24:30

1

邁克爾,你一直在問很多基本的Makefile問題,而你現在問的是那些你應該能夠通過實驗爲自己回答的問題。

can target contain multiple files? 

試試:

現在嘗試make foo.inmake bar.in。怎麼了?

What $(dotin_files:.in=) does 

這是替代參考。試試吧,看看會發生什麼,如下所示:

dotin_files := foo.in bar.in 
dotin_files := $(dotin_files:.in=) 

all: 
    @echo $(dotin_files) 

它做了什麼?無論如果你想知道更多關於Perl或regexs,或發現,或讓

all: 
    @echo $(substitute) 

,或者,隨便問在這裏,但請大家:

substitute := perl -p -e 's/@([^@]+)@/defined $$ENV{$$1} ? $$ENV{$$1} : $$&/ge' 
what are $$ENV{$$1} and $$&? I guess it's Perl scope... 

讓我們來看看有一點時間想先弄明白。

1
  • x0d版本和日期變量之間的部分,它只是字符串?
    是的。

  • $(dotin_files:.in =)低於
    從使用shell find找到的文件名中除去.in。

  • 這是什麼意思$(dotin_files:=。in)
    我想你的意思是$(dotin_files:.in =)。正如已經回答的那樣,在變量dotin_files中,它用空字符串(「=」和「)」之間的部分替換任何「.in」。

  • 可以包含多個文件的目標嗎?

  • 將目標變量聲明爲PHONY是什麼意思?
    make將忽略目標時間戳並將它們視爲新的 ,從而每次都重新構建它們。

  • 在下面的正則表達式替換代碼中,什麼是$$ ENV {$$ 1}和$$ &?

爲了避免$ ENV的擴大,$加倍,想到用C格式字符串 '%',從而將字符串
的perl -p -e「S/@([^ @] + )@ /定義$$ ENV {$$ 1}? $$ ENV {$$ 1}:$$ &/ge'
當作爲shell命令調用時將變爲:
perl -p -e's/@([^ @] +)@/defined $ ENV {$ 1 }? $ ENV {$ 1}:$ &/ge'

$ ENV是perl環境散列,$ 1我認爲這是s /// regexp組中的反向引用。