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