質問
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 ...)
上の行)。