0

バックグラウンド:

最近、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:]*=/強制的に機能させるために(これはバグですか?)。何か不足していますか?

4

1 に答える 1

4

いいえ、角括弧文字は正規表現では特別です。文字どおりに一致させたい場合は、 を使用します\[。角括弧内の式[:upper:]は、大文字で構成される文字クラスを表します。私はあなたが欲しいと思います

/[][:upper:][]+=/

リテラルの閉じ角括弧、大文字、およびリテラルの開き角括弧で構成されるブラケット式を形成します。また、単独の等号での一致を防ぐ+代わりにへの切り替えにも注意してください(は 0 個以上を意味するため、繰り返しが 0 の場合、任意の等号で一致します)。**

お使いの Awk が POSIX 文字クラスをまったくサポートしていない可能性があります。次に、ロケールに依存して一致[:upper:]しませんが、に置き換えることができます。A-Z

于 2017-03-13T08:10:29.823 に答える