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

时间:2020-03-05 18:50:16  来源:igfitidea点击:

假设我们在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的顺序颠倒,它将正确链接(我认为)。如果我们知道正确执行链接顺序的更聪明的方法,请告诉我。

解决方案

回答

h!我本可以使用shell脚本:

(对于$ {MY_LIST}中的d;回显$$ d;完成)| 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的解决方案:

default: all
  
  foo = please reverse me
  
  reverse = $(if $(1),$(call
  reverse,$(wordlist 2,$(words
  $(1)),$(1)))) $(firstword $(1))
  
  all :     @echo $(call reverse,$(foo))

给出:

$ make
  
  me reverse please