0

Makefile の文字列を解析して .c ファイルに含めたい。私の管理外の状況により、多くのファイルに冗長なエントリがあります。エントリの形式は若干異なる場合があります。元の定義の下流にあるものを変更して、物事をより困難にすることができます。だからここに私が持っているものがあります:

これは、呼び出し元の makefile からの入力として得られるものの 3 つの例です (数字はランダムです)。

ORIG1=S12a1234A5678

ORIG2=S123a1234A5678

ORIG3=S123123456789

だから私は最後の9桁に興味があり、次のようにフォーマットします。

文字列に「A」が含まれている場合は、文字列の末尾から 5 桁目の前に「0」を挿入することにより、出力を別のメイクファイル変数のセットに割り当てる必要があります。それ以外の場合は、最後の 9 桁を取得します。OUT1=12340A5678

OUT2=12340A5678

OUT3=123456789

シェルアウトするのではなく、Makefile で出力を作成できる方が望ましいです。私はsedで惨めに失敗しました。どんな助けでも感謝します。

4

2 に答える 2

1
targ:
    @echo $(ORIG1) | sed '/A/s/\(.*\)\(\([0-9][^0-9]*\)\{5\}\)/\10\2/;s/.*\(\([0-9\][^0-9]*\)\{9\}\)/\1/' >> destination.c

この変換はコマンドで行われるため、シェルのsedによって処理されることに注意してください。

シェルを呼び出さなくても、Make関数を使用してそれを行うことができますが、実際にはそうすべきではありません。Makeはこの種の構文解析用に設計されていないため、解決策は恐ろしいものになります。

于 2013-01-04T00:45:56.400 に答える
1

質問者は3年後に移動したと確信していますが、他の誰かがここに興味を持っている場合は、makeを使用してタスクを実行するモジュール式の方法です.

hasA     = $(findstring A,$(1))
lastN    = $(shell echo -n $(1) | tail -c $(2))
firstN   = $(shell echo -n $(1) | head -c $(2))
smack0   = $(1)0$(2)
AFormat  = $(call smack0,$(call firstN,$(1),4),$(call lastN,$(1),5))
myFormat = $(if $(call hasA,$(1)),$(call AFormat,$(1)),$(1))
func9    = $(call myFormat,$(call lastN,$(1),9))

# AFormat   = smack0 (firstN (string,4),lastN (string,5))
# myFormat  = hasA (string) ? AFormat (string) : string
# func9     = myFormat (last9 (string))

test:
    @echo hasA     "(1234B66547) ->" $(call hasA,1234B66547)
    @echo lastN    "(RosieODonnellSuperManVelociraptor123456789,9) ->" $(call lastN ,RosieODonnellSuperManVelociraptor123456789,9)
    @echo smack0   "(1234,0,ABCD) ->" $(call smack0,1234,ABCD)
    @echo func9    "(S12a1234A5678 ) ->" $(call func9,S12a1234A5678)
    @echo func9    "(S123a1234A5678) ->" $(call func9,S123a1234A5678)
    @echo func9    "(S123123456789 ) ->" $(call func9,S123123456789)

確かに、これは、「func9」のタスクを自動化するスクリプトを 1 つ作成し、それを w/ で呼び出すというバリエーションと見なす$(shell func9 $(STR))ことができますが、make レシピにのみ関連する小さなスクリプトをわざわざ保存したくないかもしれません。 & ヘルパー makefile に保存した方がよいでしょう。

于 2016-12-21T22:43:55.067 に答える