2008-09-09 142 views
11

比方说,你有一个像下面的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

好笑!我希望它只是为了警告:) – elmarco 2008-09-09 19:23:46

回答

19

纯GNU一个解决方案使:

默认:所有

富=请扭转我

反向= $(如果$(1),$(叫 相反,$ (单词表2,$(字 $(1)),$(1))))$(firstword $(1))

所有:@echo $(呼叫反向,$(富))

给出:

$使

我扭转请

+1

谢谢!这个解决了我的确切问题,即按照年份的顺序降序排列PDF。 :) – 2010-11-07 15:01:38

2

Doh!我可以只用一个shell脚本-LET:

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

+0

$ for d in one two three;做echo $ d;完成| tac 三个 两个 一个 Superflous \ n。但了解tac很酷。 – elmarco 2008-09-09 19:48:14

4

您还可以定义搜索组,LD:

ld -r foo.o -(a.a b.a c.a -) 

会遍历AA,BA和CA,直到没有新的未解决的符号可以通过组中的任何对象来满足。

如果您使用GNU LD,你也可以这样做:

ld -r -o foo.o --whole-archive bar.a 

哪个稍强,因为它将包括来自bar.a的每一个对象,无论它是否满足从foo的一个未解决的符号的.o。

4

到GNU使解决方案的改进:

反向= $(如果$(单词表2 $(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))$(firstword $(1)),$(1))

  • 更好的停止条件,原来使用空字符串浪费一个函数调用
  • 领先的空间不添加到列表逆转,不像原来
1

播放关闭两个Ben Collins'elmarco's答案,这里是来砸平底船其处理空白 “正常”

reverse = $(shell printf "%s\n" $(strip $1) | tac) 

该做正确的事,这要归功于$(shell)自动清洗空白和printf在其ARG列表会自动格式化每个字:

$(info [ $(call reverse, one two three four ) ]) 

产量:

[ four three two one ] 

......根据我有限测试用例(即上面的$(info ...)行)。