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.out带有未定义符号的 an,因为其中的项目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

嗬!我本可以只使用一个 shell script-let:

(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

稍微强一点,因为它将包含来自 bar.a 的每个对象,无论它是否满足来自 foo.o 的未解析符号。

于 2008-09-09T21:04:44.003 回答
1

根据Ben Collinselmarco 的答案,这里有一个 bash 可以“正确”处理空格1

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

这样做是正确的,这要归功于$(shell)自动清除空格并printf自动格式化其 arg 列表中的每个单词:

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

产量:

[ four three two one ]

1 ...根据我有限的测试用例(即$(info ...)上面的行)。

于 2013-05-28T15:10:38.020 回答