当前位置: 技术问答>linux和unix
问一个Makefile的语法问题
来源: 互联网 发布时间:2016-05-02
本文导语: # ========================================================================== # Installing modules # ========================================================================== PHONY := __modinst __modinst: include scripts/Kbuild.include # __modules := $(sort $(shell grep...
# ==========================================================================
# Installing modules
# ==========================================================================
PHONY := __modinst
__modinst:
include scripts/Kbuild.include
#
__modules := $(sort $(shell grep -h '.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o)))
PHONY += $(modules)
__modinst: $(modules)
@:
quiet_cmd_modules_install = INSTALL $@ to $(2)
cmd_modules_install = mkdir -p $(2); cp $@ $(2)
# Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra
ext-mod-dir = $(INSTALL_MOD_DIR)$(subst $(KBUILD_EXTMOD),,$(@D))
modinst_dir = $(if $(KBUILD_EXTMOD),$(ext-mod-dir),kernel/$(@D))
$(modules):
$(call cmd,modules_install,$(MODLIB)/$(modinst_dir))
# Declare the contents of the .PHONY variable as phony. We keep that
# information in a variable se we can use it in if_changed and friends.
.PHONY: $(PHONY)
请问上述quiet_cmd_modules_install = INSTALL $@ to $(2)是什么意思, 特别是INSTALL $@ to $(2)这里的2是什么意思
# Installing modules
# ==========================================================================
PHONY := __modinst
__modinst:
include scripts/Kbuild.include
#
__modules := $(sort $(shell grep -h '.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o)))
PHONY += $(modules)
__modinst: $(modules)
@:
quiet_cmd_modules_install = INSTALL $@ to $(2)
cmd_modules_install = mkdir -p $(2); cp $@ $(2)
# Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra
ext-mod-dir = $(INSTALL_MOD_DIR)$(subst $(KBUILD_EXTMOD),,$(@D))
modinst_dir = $(if $(KBUILD_EXTMOD),$(ext-mod-dir),kernel/$(@D))
$(modules):
$(call cmd,modules_install,$(MODLIB)/$(modinst_dir))
# Declare the contents of the .PHONY variable as phony. We keep that
# information in a variable se we can use it in if_changed and friends.
.PHONY: $(PHONY)
请问上述quiet_cmd_modules_install = INSTALL $@ to $(2)是什么意思, 特别是INSTALL $@ to $(2)这里的2是什么意思
|
我来说下,不一定十分准确,大概就这个意思!!
quiet_cmd_modules_install 这个定义其实用来构造在make modules_install时需要的打印信息的!
执行make modules_install时,最终会调用到如下这个规则:
$(modules):
$(call cmd,modules_install,$(MODLIB)/$(modinst_dir))
该规则调用call函数执行cmd代表的语句时,会打印的信息就是:INSTALL $@ to $(2),只是要把其中$@替换为具体的$(modules),而$2替换为执行call函数传入的第二个参数$(MODLIB)/$(modinst_dir)!
举个例子,如果$(modules)内容为:a.ko, b.ko ...,$(MODLIB)/$(modinst_dir)内为:/lib/modules/2.6.18-1.2798.fc6/extra/test/。那么quiet_cmd_modules_install 这个变量构造出来的用作打印的内容就为:
INSTALL a.ko to /lib/modules/2.6.18-1.2798.fc6/extra/test/
INSTALL b.ko to /lib/modules/2.6.18-1.2798.fc6/extra/test/
...
也就是说,你执行make modules_install的时侯就会看到很多类似上面的打印信息!它们都是由
quiet_cmd_modules_install = INSTALL $@ to $(2) 这句话构造出来的!当然这是选择quiet编译
模式的时侯才会用到quiet_cmd_modules_install!否则用作打印的语句便是变量cmd_modules_install 构造
出来的。很显然,用cmd_modules_install构造的打印信息没有 quiet_cmd_modules_install 构造的“简洁”,
这也正是“quiet”(安静)这一次的含义。
不管是quiet模式,不是quiet模式,而具体执行安装(install)的动作都是由cmd_modules_install变量构造的命令执行来完成的。
要完全弄明白这个这句话背后的东西,你可能需要知道:
1. make的call函数的使用方法;参考:http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html
2. 用知道cmd 变量是如何定义的? 这个可以看内核scripts/kbuild.include文件。类似定义如下:
cmd = @$(echo-cmd) $(cmd_$(1))
3. $(modules)的内容是如何产生的?
... ...
内核的Makefile相对来说是比较复杂的,不过结合GNU Makefile手册和网络还是不难搞明白的! 上面的东西不是一两句话
能完全将明白,总之,你看内核Makefile就把它当作是源代码一样来看,总有看明白的一天 :)
废话很多,目的是希望能说清楚:) 高手的话就不要听我罗嗦了! 感觉自己的语言表达能力真的是越来越退化了!
good luck!
quiet_cmd_modules_install 这个定义其实用来构造在make modules_install时需要的打印信息的!
执行make modules_install时,最终会调用到如下这个规则:
$(modules):
$(call cmd,modules_install,$(MODLIB)/$(modinst_dir))
该规则调用call函数执行cmd代表的语句时,会打印的信息就是:INSTALL $@ to $(2),只是要把其中$@替换为具体的$(modules),而$2替换为执行call函数传入的第二个参数$(MODLIB)/$(modinst_dir)!
举个例子,如果$(modules)内容为:a.ko, b.ko ...,$(MODLIB)/$(modinst_dir)内为:/lib/modules/2.6.18-1.2798.fc6/extra/test/。那么quiet_cmd_modules_install 这个变量构造出来的用作打印的内容就为:
INSTALL a.ko to /lib/modules/2.6.18-1.2798.fc6/extra/test/
INSTALL b.ko to /lib/modules/2.6.18-1.2798.fc6/extra/test/
...
也就是说,你执行make modules_install的时侯就会看到很多类似上面的打印信息!它们都是由
quiet_cmd_modules_install = INSTALL $@ to $(2) 这句话构造出来的!当然这是选择quiet编译
模式的时侯才会用到quiet_cmd_modules_install!否则用作打印的语句便是变量cmd_modules_install 构造
出来的。很显然,用cmd_modules_install构造的打印信息没有 quiet_cmd_modules_install 构造的“简洁”,
这也正是“quiet”(安静)这一次的含义。
不管是quiet模式,不是quiet模式,而具体执行安装(install)的动作都是由cmd_modules_install变量构造的命令执行来完成的。
要完全弄明白这个这句话背后的东西,你可能需要知道:
1. make的call函数的使用方法;参考:http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html
2. 用知道cmd 变量是如何定义的? 这个可以看内核scripts/kbuild.include文件。类似定义如下:
cmd = @$(echo-cmd) $(cmd_$(1))
3. $(modules)的内容是如何产生的?
... ...
内核的Makefile相对来说是比较复杂的,不过结合GNU Makefile手册和网络还是不难搞明白的! 上面的东西不是一两句话
能完全将明白,总之,你看内核Makefile就把它当作是源代码一样来看,总有看明白的一天 :)
废话很多,目的是希望能说清楚:) 高手的话就不要听我罗嗦了! 感觉自己的语言表达能力真的是越来越退化了!
good luck!