make 変数内の文字列の順序を逆にする最も簡単な方法

StackOverflow https://stackoverflow.com/questions/52674

  •  09-06-2019
  •  | 
  •  

質問

Makefile フラグメントに次のような変数があるとします。

MY_LIST=a b c d

では、そのリストの順序を逆にするにはどうすればよいでしょうか?私は欲しい:

$(warning MY_LIST=${MY_LIST}) 

見せる

MY_LIST=d c b a

編集:本当の問題はそれです

ld -r some_object.o ${MY_LIST}

を生成します a.out 未定義のシンボルがある場合、 MY_LIST 実際にはアーカイブですが、順序が間違っています。の注文であれば、 MY_LIST を逆にすると、正しくリンクされると思います(私はそう思います)。リンクの順序を正しくするためのより賢い方法を知っている場合は、ヒントを教えてください。

役に立ちましたか?

解決

純粋な GNU make での解決策:

デフォルト:全て

foo = 逆にしてください

reverse = $(if $(1)、$(call reverse、$(wordlist 2、$(words $(1))、$(1))))$(firstword $(1))))

全て :@echo $(call reverse,$(foo))

与えるもの:

$メイク

逆にしてください

他のヒント

ドー!シェル スクリプトレットを使用することもできました。

(for d in ${MY_LIST}; do echo $$d; done) | tac

ld を使用して検索グループを定義することもできます。

ld -r foo.o -( a.a b.a c.a -)

グループ内のどのオブジェクトも新しい未解決のシンボルを満たすことができなくなるまで、a.a、b.a、および c.a を繰り返します。

gnu ld を使用している場合は、次のこともできます。

ld -r -o foo.o --whole-archive bar.a

これは、foo.o からの未解決のシンボルを満たすかどうかに関係なく、bar.a からのすべてのオブジェクトを含めるという点で、少し強力です。

GNU make ソリューションの改善:

reverse = $(if $(wordlist 2,2,$(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1))) $(firstword $(1) ),$(1))

  • より良い停止条件、オリジナルは空の文字列を使用し、関数呼び出しを無駄にしています
  • 元のリストとは異なり、反転リストに先頭のスペースを追加しません。

両者ともプレーオフ ベン・コリンズ そして エルマルコの 答えは、空白を「適切に」処理する bash へのパントです。1

reverse = $(shell printf "%s\n" $(strip $1) | tac)

これは正しいことをします、おかげで $(shell) 自動的に空白を削除し、 printf 引数リスト内の各単語を自動的にフォーマットします。

$(info [ $(call reverse,  one two   three four  ) ] )

得られるもの:

[ four three two one ]

1...私の限定的なテストケースによると(つまり、 $(info ...) 上の行)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top