假设您的 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 = 请反转我

反向= $(如果$(1),$(呼叫反向,$(WordList 2,$(单词$(1)),$(1)))$(first word $(1))

全部 :@echo $(反向调用,$(foo))

给出:

$ 制作

请我反转

其他提示

哎哟!我本可以只使用 shell script-let:

(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

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

对 GNU make 解决方案的改进:

反向 = $(如果 $(单词列表 2,2,$(1)),$(调用反向,$(单词列表 2,$(单词 $(1)),$(1))) $(第一个单词 $(1) ),$(1))

  • 更好的停止条件,原始使用空字符串浪费函数调用
  • 与原始列表不同,不会向反转列表添加前导空格

两者兼顾 本·柯林斯的埃尔马科的 答案,这是一个 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 ...) 线,上面)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top