背景:
最近,我尝试在Ubuntu14.04上构建libopencm3 3-实例,并遇到了一个构建错误(而对于Ubuntu16.04.1LTS,它工作正常)。我开始挖掘是为了找出原因。正如我所发现的,libopencm3使用特定的链接器脚本生成器:
请参阅libopencm3-examples/libopencm3/ld/README
该工具的目的是将特定于目标微控制器的定义传递给链接器脚本模板。因此,它使用模板脚本下的预处理程序,并传递目标特定参数,如下所示:
-D_FPU=hard-fpv5-sp-d16 -D_ROM_OFF=0x08000000 -D_RAM_OFF=0x20000000要检索此参数,需要使用awk脚本。
./libopencm3/scripts/genlink.awk为了生成-D_XXX键,该脚本在设备数据库./libopencm3/ld/devices.data下运行,如下所示:
awk -v PAT="$(DEVICE)" -v MODE="DEFS" -f $(OPENCM3_DIR)/scripts/genlink.awk $(OPENCM3_DIR)/ld/devices.data问题:
从数据库中提取定义信息的awk脚本部分如下所示:
...
for (i = 3; i <= NF; i = i + 1) {
...
else if ($i ~ /[[:upper:]]*=/) {
if ("DEFS" == MODE)
printf "-D_%s ",$i;
}
}由脚本处理的数据库中的行:
stm32f3[01]3?c* stm32f3ccm ROM=256K RAM=40K CCM=8K让我困惑的是,提议的模式(/[[:upper:]]*=/)应该与ROM=256K f.e.相匹配,而不是ROM=256K (是吗?)。无论如何,正如我已经提到的,/[[:upper:]]*=/适用于ubuntu16.04(GNUAwk4.1.3)(为什么?),而对于14.04,我需要更改/[[:upper:]]*=/ -> /[:upper:]*=/来强制它工作(这是一个bug还是什么?)我是不是遗漏了什么?
发布于 2017-03-13 08:10:29
不,方括号字符在正则表达式中是特殊的。如果您想真正匹配它,请使用\[。方括号内的表达式[:upper:]指的是由大写字符组成的字符类。我猜你想
/[][:upper:][]+=/若要形成由文字结束方括号、大写字符和文字开始方括号组成的括号表达式,请执行以下操作。还请注意切换到+而不是*,以防止在一个单独的等号上进行匹配(*的意思是零或更多,所以如果没有重复,它将匹配于任何等号)。
您所拥有的Awk可能根本不支持POSIX字符类。然后,您可以将[:upper:]替换为A-Z,尽管它将无法与地区敏感地匹配。
https://stackoverflow.com/questions/42758700
复制相似问题