核心makefile echo cmd表示式

2021-07-09 03:13:10 字數 1515 閱讀 8902

kbuild.include中提供了核心編譯時基礎函式,其中echo-cmd變數的功能讓我一直能疑惑。其定義如下:

echo-cmd = $(if $($(quiet)cmd_$(1)),\

echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)

從字面理解,應該是回顯命令,而且初看也是列印命令到終端。但是,事實上,那只是他一半的功能,另一半是執行命令。空口無憑,來試一下

squote  := '

escsq = $(subst $(squote),'\$(squote)',$1)

echo-cmd = $(echo ' $(call escsq,ls)';)

vmlinux:force

$(echo-cmd) ls

force:

這段makefile是我從kbuild.include中擷取和修改的,執行的結果為:

root@ubuntu:~/desktop# make -f echo-cmd.mk

ls39-usb-reboot.rules linux-3.7.4.tar.xz udev

展開這個規則,首先escsq = $(subst $(squote),'\$(squote)',$1)是乙個表示式,call函式除了可以呼叫函式,還可以呼叫表示式,形如下面的規則:

reverse =  $(2) $(1)

squeue=$(1) $(2)

__all:

@echo foo=$(call reverse,a,b)

@echo foo=$(call squeue,a,b)

執行的結果是:

root@ubuntu:~/desktop# make -f call.mk

foo=b a

foo=a b

因此不用懷疑$(call escsq,ls)這句的正確性,call傳遞給escsq的引數1是ls,因此,表示式escsq = $(subst $(squote),'\$(squote)',$1)的結果為 echo ls。最終echo-cmd變數的值是echo 'ls';。把這個變數在vmlinux目標中擴充套件開,就是

vmlinux:force

echo 'ls';ls 

這個規則中有兩條命令,makefile規定,命令間用分號分割,因此這個規則做了兩件事:1.顯示命令,2.執行命令

最後,看下kbuild.include中完整的echo-cmd命令

echo-cmd = $(if $($(quiet)cmd_$(1)),\

echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)

這裡可以分別用@和空帶入到$(quiet)和$(echo-why)中。一般cmd_$(1)會對應乙個變數,如cmd_ls=ls,這樣應該可以理解這個變數的作用了~

Solr核心(核心)

solr核心 core 是lucene索引的執行例項,包含使用它所需的所有solr配置檔案。我們需要建立乙個solr core來執行索引和分析等操作。solr應用程式可以包含乙個或多個核心。如果需要,solr應用程式中的兩個核心可以相互通訊。安裝和啟動solr後,可以連線到solr的客戶端 web介...

核心 核心編譯 proc sys

單核心體系設計 但充分借鑑了微核心設計體系的優點,為核心引入模組化機制。核心組成部分 kernel 核心核心,一般為bzimage,通常在 boot目錄下,名稱為vmlinuz version release kernel object 核心物件,一般放置於 lib modules version ...

Linux 核心 vs Windows 核心

windows 和 linux 可以說是我們比較常見的兩款作業系統的。windows 基本占領了電腦時代的市場,商業上取得了很大成功,但是它並不開源,所以要想接觸原始碼得加入 windows 的開發團隊中。這兩個作業系統各有千秋,不分伯仲。作業系統核心的東西就是核心,這次我們就來看看,linux 核...