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

时间:2008-09-09 19:21:23

标签: makefile

假设您在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的顺序颠倒了,它将正确链接(我认为)。如果您知道一种更明智的方法来获得正确的链接顺序,请告诉我。

5 个答案:

答案 0 :(得分:19)

纯GNU make的解决方案:

  

默认:全部

     

foo =请逆转我

     

反向= $(如果是$(1),$(来电   反向,$(wordlist 2,$(单词   $(1)),$(1))))$(firstword $(1))

     

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

给出:

  

$ make

     请反过来

答案 1 :(得分:4)

您还可以使用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中未解析的符号。

答案 2 :(得分:4)

对GNU make解决方案的改进:

  

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

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

答案 3 :(得分:3)

卫生署!我本来可以使用shell脚本 - 让:

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

答案 4 :(得分:1)

播放Ben Collins'elmarco's个答案,这里有一个用于处理“正确”空白空间的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 ...)行)。