反转 make 变量中字符串顺序的最简单方法
假设您的 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
的顺序颠倒,它将正确链接(我认为)。 如果您知道一种更聪明的方法来获得正确的链接顺序,请告诉我。
Let's say you have a variable in a makefile fragment like the following:
MY_LIST=a b c d
How do I then reverse the order of that list? I need:
$(warning MY_LIST=${MY_LIST})
to show
MY_LIST=d c b a
Edit: the real problem is that
ld -r some_object.o ${MY_LIST}
produces an a.out
with undefined symbols because the items in MY_LIST
are actually archives, but in the wrong order. If the order of MY_LIST
is reversed, it will link correctly (I think). If you know a smarter way to get the link order right, clue me in.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
GNU Make 4.4 版本添加了新函数
$(let ...)
。 手册提供了以下可以使用的宏用于颠倒单词的顺序GNU Make version 4.4 adds the new function
$(let ...)
. The manual offers the following macro which can be used for reversing the order of words与 Ben Collins 和 elmarco 的 答案,这里有一个 bash 的下注,它“正确”处理空格1,
它做了正确的事情,这要归功于
$(shell)
自动清理空格和 printf 自动格式化其参数列表中的每个单词:产量:
1...根据我有限的测试用例(即
$(info ... )
行,上面)。Playing off of both Ben Collins' and elmarco's answers, here's a punt to bash which handles whitespace "properly"1
which does the right thing, thanks to
$(shell)
automatically cleaning whitespace andprintf
automatically formatting each word in its arg list:yields:
1...according to my limited test case (i.e., the
$(info ...)
line, above).哎哟! 我本可以只使用 shell script-let:
(for d in ${MY_LIST}; do echo $$d; done) | tac
Doh! I could have just used a shell script-let:
(for d in ${MY_LIST}; do echo $$d; done) | tac
您还可以使用 ld 定义搜索组:
将迭代 aa、ba 和 ca,直到组中的任何对象都无法满足新的未解析符号。
如果您使用 gnu ld,您还可以这样做:
后者稍强一些,因为它将包含 bar.a 中的每个对象,无论它是否满足 foo.o 中未解析的符号。
You can also define search groups with ld:
Will iterate through a.a, b.a, and c.a until no new unresolved symbols can be satisfied by any object in the group.
If you're using gnu ld, you can also do:
Which is slightly stronger, in that it will include every object from bar.a regardless of whether it satisfies an unresolved symbol from foo.o.
纯 GNU make 的解决方案:
给出:
A solution in pure GNU make:
Gives:
对 GNU make 解决方案的改进:
An improvement to the GNU make solution: