2012-02-12 47 views
0
ifeq ($(KBUILD_SRC),) 

我在linux kernel的Makefile上面看到了。makefile中的shell語法

它看起來並不像大多數其他腳本語言,據我所知定期if聲明。

甚至沒有關閉標籤存在於其他地方。

它是如何工作的?

+0

http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7 .html - 你不明白什麼? (在後面有一個'endif',可能不是你期望的地方。) – Mat 2012-02-12 09:44:06

回答

0

ifeq檢查兩個語句是否相等。由於第二條語句爲空,因此基本語句檢查$KBUILD_SRC是否爲空/未設置。通過用ifneq代替ifeq它應該檢查變量是否被設置。

endif必須在某個地方,否則有語法錯誤和make會抱怨。

而且作爲Mario已經說明了,使用兩個階段,第一個解析Makefile並擴展所有的宏,包含等。它還評估條件。所以之後所有的目標都是根據條件和其他包含的Makefile創建的。在第二階段,make使用目標及其依賴項(在其他目標上)實際執行命令(例如構建內核)。遇到的第一個目標被用作「父目標」,除非包括make命令的一個或多個的父目標的

+0

你知道'$(如果$(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))'是什麼意思嗎? – 2012-02-12 11:25:19

+0

當$(KBUILD_EXTMOD)被設置(即它包含某些內容)時,該命令將返回':$(KBUILD_EXTMOD)',否則不會。它可以用來填充另一個變量或提供一個命令的參數(一種內聯if語句)。同樣,在執行實際的目標/命令之前,它會在我描述的「階段1」中處理。 – Veger 2012-02-12 12:54:48

+0

':$(KBUILD_EXTMOD)'中的':'是什麼意思? – 2012-02-12 12:58:50

0

First hit on Google

這是可能的,有一個ENDIF(在你需要的東西畢竟關閉條件塊結束;如果有沒有文件的其餘部分是有條件的我猜的一部分)。與其他語言中看到的常規條件唯一真正的巨大差異是,這些條件僅評估一次 - 在生成文件實際執行之前。所以它們就像預處理器定義一樣,不像真正的腳本語言。我不確定支持的範圍有多廣(即在非GNU製造替代方案中)。但是這看起來像是使用shell腳本/ configure/cmake/etc的有趣替代方案。爲簡單的條件和決定。