14

次のような 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.outwith undefined symbol が生成されます。MY_LISTの順序をMY_LIST逆にすると、正しくリンクされます (と思います)。リンクの順序を正しくするためのよりスマートな方法をご存知でしたら、教えてください。

4

5 に答える 5

22

純粋な GNU make での解決策:

デフォルト: すべて

foo = 反転してください

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

all : @echo $(call reverse,$(foo))

与えます:

$メイク

私を逆にしてください

于 2009-04-24T16:07:43.810 に答える
7

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

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

  • より良い停止条件、元は空の文字列を使用して関数呼び出しを無駄にします
  • 元のリストとは異なり、反転リストに先頭のスペースを追加しません
于 2013-01-10T14:59:40.200 に答える
4

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

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

于 2008-09-09T19:39:52.803 に答える
4

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

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

グループ内のオブジェクトが新しい未解決のシンボルを満たさなくなるまで、aa、ba、および ca を反復します。

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

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

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

于 2008-09-09T21:04:44.003 に答える
1

Ben Collinselmarco の両方の回答を利用して、空白を「適切に」処理する 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 ...)上記の行)によると。

于 2013-05-28T15:10:38.020 に答える