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 核...