转载自: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
)
(Q)
(Q)(AWK) -f $^ > $@ || { rm -f KaTeX parse error: Expected 'EOF', got '}' at position 14: @; /bin/false}̲<br> ||表示左边的命令未…(Q)$(AWK) -f $^ > $@ 这个命令。
(
Q
)
不
知
道
什
么
意
思
,
但
不
影
响
理
解
。
有
知
道
的
请
在
下
面
留
个
言
。
<
b
r
>
展
开
(Q) 不知道什么意思,但不影响理解。有知道的请在下面留个言。<br> 展开
(Q)不知道什么意思,但不影响理解。有知道的请在下面留个言。<br>展开(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中。