Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1119204
  • 博文数量: 284
  • 博客积分: 8223
  • 博客等级: 中将
  • 技术积分: 3188
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 13:26
文章分类

全部博文(284)

文章存档

2012年(18)

2011年(33)

2010年(83)

2009年(147)

2008年(3)

分类: LINUX

2012-03-08 10:06:25

1. origin
  1. # To put more focus on warnings, be less verbose as default
  2. # Use 'make V=1' to see the full commands
  3. ifdef V
  4. ifeq ("$(origin V)", "command line")
  5. KBUILD_VERBOSE = $(V)
  6. endif
  7. endif
  8. ifndef KBUILD_VERBOSE
  9. KBUILD_VERBOSE =0
  10. endif

   
代码中注释的意思是,为了能将精力集中在警告信息上面,默认上不输出详细而显得冗余的编译信息,如果想看到完整的命令执行情况,可以在 make 时使用参数 V=1 。

    下面根据代码分析这 4 个符号的作用,实际上它们和 C 语言中的意思是一样的。

   

  1.     ifdef V 表示如果 V 变量被定义过,那么会执行下面的 ifeq 语句。V 变量的定义来源可以有不同,如在文件中定义,在命令行中定义,在环境变量中定义等。

  2.     ifeq ("$(origin V)", "command line") 表示若 V 是在命令行里已被定义,那么执行下面的 KBUILD_VERBOSE = $(V) 语句。也就是说,ifeq 用以判断后面括号里的两个值是否相等,如果相等则执行下面的语句。如果不相等,则不执行。关于 origin 函数的用法见:
  
2.  ?= /:=

  1. KBUILD_EXTMOD ?= $(SUBDIRS)
  2. KBUILD_EXTMOD := $(M)
  3. PHONY := _all
     如果操作符“?=”前面的变量KBUILD_EXTMOD没有定义过,那么就将SUBDIRS赋给KBUILD_EXTMOD;
    在使用“:=”定义变量时,变量值中对另外变量的引用或者函数的引用在定义时被展开(对变量进行替换)而=是在使用时才进行替换
  1. 举例:
  2. CFLAGS = $(include_dirs) -O
  3. include_dirs = -Ifoo -Ibar
  4. “CFLAGS”会在命令中被展开为“-Ifoo -Ibar -O”
  5. CFLAGS := $(include_dirs) -O
  6. include_dirs := -Ifoo -Ibar
  7. 由于在变量“include_dirs”的定义出现在“CFLAGS”定义之后。因此在“CFLAGS”的定义中,
  8. “include_dirs”的值为空。“CFLAGS”的值为“-O”而不是“-Ifoo -Ibar -O”。


3. if
  1. $(if $(KBUILD_OUTPUT),, \
  2. $(error output directory "$(saved-output)" does not exist))
    函数if对在函数上下文中扩展条件提供了支持(相对于GNU make makefile文件中的条件语句,例如ifeq指令。)函数的语法是:$(if ,) 或是 $(if ,,)。如果条件$(KBUILD_OUTPUT)为真(非空字符串),那么两个逗号之间的空字符(注意连续两个逗号的作用)将会是整个函数的返回值,如果$(KBUILD_OUTPUT)为假(空字符串),那么$(error output directory "$(saved-output)" does not exist)会是整个函数的返回值。此时如果没有被定义,那么,整个函数返回空字串。

   函数error的语法是:$(error ;)。 函数error的功能是:产生一个致命的错误,output directory "$(saved-output)" does not exist是错误信息。注意,error函数不会在一被使用就会产生错误信息,所以如果你把其定义在某个变量中,并在后续的脚本中使用这个变量,那么也是可以的。

   命令“$(if $(KBUILD_OUTPUT),, \”中最后的“\”的作用是:紧接在“\”下面的“哪一行”的命令是“\”所在行的命令的延续。


4. flter-out

  1. $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
    反过滤函数——filter-out,语法是:$(filter-out ;,;), 函数filter-out的功能是:去掉$(MAKECMDGOALS)中符合规则_all的所有字符串后,剩下的作为返回值。
函数filter-out调用与伪目标_all在同一行。伪目标_all下面的以tab开头的三行是命令,因为每行最后都有"\",所以这三行命令应该是写在同一行的,即后面的命令要受到处于它之前的那些命令的影响。


5.  :1=
  1. KBUILD_VERBOSE:1=
  $(KBUILD_VERBOSE:1=)为变量替换,如果为1就替换为空。

6. 
%:: FORCE

  1. %:: FORCE

$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= $@
#从代码中可以看出,这里使用了一个双冒号的模式匹配规则。
#百分号代表任何目标都使用这个规则,其中
#$(srctree) 为内核代码树所在目 录 , KBUILD_SRC 定义为空 。
#所以如果 make 命令为 : make s3c2410_defconfig all
#那么构建系统就会分别执行下面两条命令:
#make -C $(srctree) KBUILD_SRC= s3c2410_defconfig
#make -C $(srctree) KBUILD_SRC= all
#这其实和简单的用手动的输入两条连续命令
#(make s3c2410_defconfig 和 make all) 是一样效果的。

  1. %config: scripts_basic outputmakefile FORCE
%config 跟 “make menuconfig”匹配



阅读(2094) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~