转载地址:https://blog.youkuaiyun.com/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
来源:优快云
原文:https://blog.youkuaiyun.com/charliewangg12/article/details/41483261
版权声明:本文为博主原创文章,转载请附上博文链接!