linux3.1.0内核中/include/generated下mach-types.h的产生

转载地址:https://blog.csdn.net/charliewangg12/article/details/41483261

/arch/arm/tools下面有三个文件,Makefile gen-amch-types  mach-types。其中mach-types存放的就是

板级信息,通过Makefile和 gen-amch-types文件,把这些板级信息重新生成一个文件

include/generated/mach-types.h。

接下来看分析生成的。看一个目录,从Makefile入手:

include/generated/mach-types.h: $(src)/gen-mach-types $(src)/mach-types
@echo '  Generating $@'
@mkdir -p $(dir $@)
$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
$@ 目标为 include/generated/mach-types.h
$^ 依赖为 当前目录下的gen-mach-types  mach-types
$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false}
||表示左边的命令未执行成功,则执行右边的命令,即删除这个文件,执行出错程序
这里产生mach-types.h就是通过$(Q)$(AWK) -f $^ > $@ 这个命令。
$(Q) 不知道什么意思,但不影响理解。有知道的请在下面留个言。
展开$(Q)$(AWK) -f $^ > $@
awk -f /arch/arm/tools/gen-amch-types  /arch/arm/tools/mach-types > include/generated/mach-types.h
-f 读取文件去执行而不是命令行执行
awk读取gen-amch-types 、mach-types这两个文件,然后把文件作为命令去执行,产生的数据放到

mach-types.h中。

既然要读取文件执行,那么我们来看看这两个文件的主要行:

/arch/arm/tools/gen-amch-types文件
#!/bin/awk
#
# Awk script to generate include/generated/mach-types.h
#
BEGIN { nr = 0 }
/^#/ { next }
/^[ ]*$/ { next }
 
NF == 4 {
 machine_is[nr] = "machine_is_"$1;
 config[nr] = "CONFIG_"$2;
 mach_type[nr] = "MACH_TYPE_"$3;
 num[nr] = $4; nr++
}
END {
 printf("/*\n");
 printf(" * This was automagically generated from %s!\n", FILENAME);
 printf(" * Do NOT edit\n");
 printf(" */\n\n");
 printf("#ifndef __ASM_ARM_MACH_TYPE_H\n");
 printf("#define __ASM_ARM_MACH_TYPE_H\n\n");
 printf("#ifndef __ASSEMBLY__\n");
 printf("/* The type of machine we're running on */\n");
 printf("extern unsigned int __machine_arch_type;\n");
 printf("#endif\n\n");
 printf("/* see arch/arm/kernel/arch.c for a description of these */\n");
 for (i = 0; i < nr; i++)
   if (num[i] ~ /..*/)
     printf("#define %-30s %d\n", mach_type[i], num[i]);
 printf("\n");
   }
}
mach-types文件

# machine_is_xxx CONFIG_xxxxMACH_TYPE_xxx number
am335xevm MACH_AM335XEVMAM335XEVM 3589
关键执行代码就这几句

BEGIN { nr = 0 }
/^#/ { next }
/^[ ]*$/ { next }
NF == 4 {
 machine_is[nr] = "machine_is_"$1;
 config[nr] = "CONFIG_"$2;
 mach_type[nr] = "MACH_TYPE_"$3;
 num[nr] = $4; nr++
}
END
BEGIN之后END之前的操作将首先执行,扫描全部文件执行完这部分之后再执行END之后内容。 
NF其实是number of field, awk每次读取一行,得到这一行的词域数目。如mach-types中的
am335xevm MACH_AM335XEVMAM335XEVM 3589
即NF=4
这样$1=am335xevm;$2=MACH_AM335XEVM;$3=AM335XEVM;$4=3589
BEGIN开始分析:

{ nr = 0 } :nr赋值为0
 /^#/ { next } :如果这行以#开头则跳转到下一行
/^[ ]*$/ { next }:如果这行以空格开头则跳转到下一行
当读取的行NF=4时,把这一行的数据拼接之后存放到数组中。

假设am335xevm MACH_AM335XEVMAM335XEVM 3589是第一行满足条件的,那么

machine_is[0] = machine_is_am335xevm
config[0] = CONFIG_MACH_AM335XEVM
mach_type[0] = MACH_TYPE_AM335XEVM
 num[0] = 3589
nr++

得到这些数组之后,END之后就是把这些数据打印出来存放到 include/generated/mach-types.h中。
--------------------- 
作者:ToureYaya 
来源:CSDN 
原文:https://blog.csdn.net/charliewangg12/article/details/41483261 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/kunkliu/article/details/83578604