2013-01-01 114 views
1

奇怪的行爲,認爲這種小的Makefile:的Makefile:在變量賦值

test: var ?= foo 

test: 
     echo $(var) 

化妝的文檔說?=分配尚未以前(未定義)分配 一個變量。 但如果通過命令行分配:

make var=1234 

一些隨機(ASCII,非ASCII,只有空白)字符,而不是1234打印到終端。 使用的=代替?=按預期工作,但不能在我的 情況下,從呼叫撥打使用,因爲它會覆蓋「繼承」,出口任務。 此外,如果不使用目標爲基礎,但全球的分配,如預期輸出 。 這些字符序列從哪裏來?

測試在Linux上的Gentoo(GNU使v3.82)和DEB-喘息(GNU使v3.81)。

感謝您的提示!

+0

我無法在OSX 10.7.5上使用GNUMake 3.81重現此操作。 – Beta

+0

在你的例子中'var?= foo'是一個目標,它是一個錯字嗎? –

+0

不是錯字;有條件的分配:http://www.gnu.org/software/make/manual/html_node/Target_002dspecific.html#Target_002dspecific –

回答

0

我可以重現GNU Make 3.81的問題,但請注意,只有在命令行上設置var(根據make的術語),纔會出現此問題。如果var的價值來自環境,例如用下面的命令:

var=1234 make test 

然後一切工作正常。這聞起來有點像化妝給我的錯誤,特別是鑑於以下配方 (它根據我的部分6.5的理解和手冊的6.11應該是等同於你原來的Makefile):

test: var:=$(if $(findstring undefined,$(origin var)),foo,$(var)) 

test: 
     echo $(var) 

在任何情況下都能正常工作。

0

這的確是讓GNU的錯誤。問題出現在3.81甚至3.82。由於某些原因,許多系統仍在使用3.81(即2013年10月27日)。這個bug只能在Linux上出現。在使用make 3.81的MacOS上,錯誤沒有顯示出來。

使用GIT commit ae2ab76fac(GNU make),問題得到解決,現在的行爲如預期的那樣。

也有一些有趣的薩凡納與BUG#31743這說明了這個問題。當薩凡納遭到入侵時,那個人就迷了路。 bug編號現在分配給其他的東西。請參閱http://lists.gnu.org/archive/html/bug-make/2010-12/msg00009.html

+0

非常感謝您提供這些信息。 –