反转 make 变量中字符串顺序的最简单方法

发布于 2024-07-05 02:56:39 字数 449 浏览 5 评论 0原文

假设您的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

も星光 2024-07-12 02:56:39

GNU Make 4.4 版本添加了新函数 $(let ...)手册提供了以下可以使用的宏用于颠倒单词的顺序

reverse = $(let first rest,$1,\
            $(if $(rest),$(call reverse,$(rest)) )$(first))
all: ; @echo $(call reverse,d c b a)

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

reverse = $(let first rest,$1,\
            $(if $(rest),$(call reverse,$(rest)) )$(first))
all: ; @echo $(call reverse,d c b a)
懵少女 2024-07-12 02:56:39

Ben Collins elmarco 的 答案,这里有一个 bash 的下注,它“正确”处理空格1

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

它做了正确的事情,这要归功于 $(shell) 自动清理空格和 printf 自动格式化其参数列表中的每个单词:

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

产量:

[ four three two one ]

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

Playing off of both Ben Collins' and elmarco's answers, here's a punt to bash which handles whitespace "properly"1

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

which does the right thing, thanks to $(shell) automatically cleaning whitespace and printf automatically formatting each word in its arg list:

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

yields:

[ four three two one ]

1...according to my limited test case (i.e., the $(info ...) line, above).

梦萦几度 2024-07-12 02:56:39

哎哟! 我本可以只使用 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

(り薆情海 2024-07-12 02:56:39

您还可以使用 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 中未解析的符号。

You can also define search groups with ld:

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

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:

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

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.

眼前雾蒙蒙 2024-07-12 02:56:39

纯 GNU make 的解决方案:

默认:全部

foo = 请反转我

反向 = $(如果 $(1),$(调用
反向,$(单词列表 2,$(单词
$(1)),$(1)))) $(第一个单词 $(1))

全部:@echo $(调用反向,$(foo))

给出:

$ 制作

请让我反转

A solution in pure GNU make:

default: all

foo = please reverse me

reverse = $(if $(1),$(call
reverse,$(wordlist 2,$(words
$(1)),$(1)))) $(firstword $(1))

all : @echo $(call reverse,$(foo))

Gives:

$ make

me reverse please

坏尐絯 2024-07-12 02:56:39

对 GNU make 解决方案的改进:

反向 = $(如果 $(单词列表 2,2,$(1)),$(调用反向,$(单词列表 2,$(单词 $(1)),$(1))) $(第一个单词 $ (1)),$(1))

  • 更好的停止条件,原始使用空字符串浪费函数调用
  • 不会向反转列表添加前导空格,与原始不同

An improvement to the GNU make solution:

reverse = $(if $(wordlist 2,2,$(1)),$(call reverse,$(wordlist 2,$(words $(1)),$(1))) $(firstword $(1)),$(1))

  • better stopping condition, original uses the empty string wasting a function call
  • doesn't add a leading space to the reversed list, unlike the original
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文