2008-09-09 137 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 ...)行)。