バックグラウンド:
最近、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 fe に一致する必要があるが、ROM=256K に一致しない (はい?) ことです。とにかく、すでに述べたよう/[[:upper:]]*=/
に、ubuntu 16.04(GNU Awk 4.1.3)で機能します(なぜですか?)が、14.04では変更する必要がありました/[[:upper:]]*=/
->/[:upper:]*=/
強制的に機能させるために(これはバグですか?)。何か不足していますか?