背景
最近我试图在Ubuntu 14.04上构建libopencm3-examples并遇到构建错误(对于Ubuntu 16.04.1 LTS,它可以正常工作)。我开始挖掘以找到原因。正如我所发现的,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:]]*=/
适用于ubuntu 16.04(GNU Awk 4.1.3)(为什么?),而对于14.04我需要更改/[[:upper:]]*=/
- &gt; /[:upper:]*=/
迫使它起作用(这是一个错误还是什么?)。我错过了什么吗?
答案 0 :(得分:4)
不,方括号字符在正则表达式中是特殊的。如果您想要按字面意思匹配,请使用\[
。方括号内的表达式[:upper:]
是指由大写字符组成的字符类。我猜你想要
/[][:upper:][]+=/
形成一个括号表达式,包括文字结束方括号,大写字符和文字开口方括号。另请注意,切换到+
而非*
以阻止匹配单独的等号(*
表示零或更多,因此零重复时,它将匹配任何等号)。
你所拥有的Awk可能根本不支持POSIX角色类。然后,您可以将[:upper:]
替换为A-Z
,但它不会与区域设置敏感匹配。