最简单的方法来反转make变量中字符串的顺序

Ben*_*ins 12 makefile

假设您在makefile片段中有一个变量,如下所示:

MY_LIST=a b c d
Run Code Online (Sandbox Code Playgroud)

然后,我如何反转该列表的顺序?我需要:

$(warning MY_LIST=${MY_LIST}) 
Run Code Online (Sandbox Code Playgroud)

显示

MY_LIST=d c b a
Run Code Online (Sandbox Code Playgroud)

编辑:真正的问题是

ld -r some_object.o ${MY_LIST}
Run Code Online (Sandbox Code Playgroud)

生成a.out带有未定义符号的符号,因为其中的项目MY_LIST实际上是归档,但顺序错误.如果顺序MY_LIST颠倒,它将正确链接(我认为).如果您知道一种更明智的方式来获得正确的链接,请告诉我.

小智 19

纯GNU的解决方案:

默认:全部

foo =请逆转我

reverse = $(如果$(1),$(反向调用,$(wordlist 2,$(单词$(1)),$(1))))$(firstword $(1))

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

得到:

$ make

我反过来请


stu*_*dog 6

对 GNU make 解决方案的改进:

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

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


Ben*_*ins 5

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

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


小智 5

您还可以使用 ld 定义搜索组:

ld -r foo.o -( a.a b.a c.a -)
Run Code Online (Sandbox Code Playgroud)

将迭代 aa、ba 和 ca,直到组中的任何对象都无法满足新的未解析符号。

如果您使用 gnu ld,您还可以执行以下操作:

ld -r -o foo.o --whole-archive bar.a
Run Code Online (Sandbox Code Playgroud)

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