题
假设您的 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
是相反的,它将正确链接(我认为)。如果您知道一种更聪明的方法来获得正确的链接顺序,请告诉我。
解决方案
纯 GNU make 的解决方案:
默认:全部
foo = 请反转我
反向= $(如果$(1),$(呼叫反向,$(WordList 2,$(单词$(1)),$(1)))$(first word $(1))
全部 :@echo $(反向调用,$(foo))
给出:
$ 制作
请我反转
其他提示
哎哟!我本可以只使用 shell script-let:
(for d in ${MY_LIST}; do echo $$d; done) | 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 解决方案的改进:
反向 = $(如果 $(单词列表 2,2,$(1)),$(调用反向,$(单词列表 2,$(单词 $(1)),$(1))) $(第一个单词 $(1) ),$(1))
- 更好的停止条件,原始使用空字符串浪费函数调用
- 与原始列表不同,不会向反转列表添加前导空格
不隶属于 StackOverflow