gpt4 book ai didi

string - Makefile字符串函数可以嵌套吗?

转载 作者:行者123 更新时间:2023-12-02 06:29:44 28 4
gpt4 key购买 nike

我正在尝试使用 string functions 在 Makefile 中进行一些字符串操作。提出报价。我想对我的字符串进行两次转换,我有一个列出类似于以下内容的源文件的变量:

C_SRCS += \
./src/foo.c \
./src/bar.c \
...

我想获取这个字符串并将其转换为一个包含所有目标文件的新变量。对象将存储在不同的目录中,并且显然将具有 .o 扩展名,而不是 .c。实际上,他们应该改变:

./src/<file>.c

./artifacts/src/<file>.o

我可以用两条规则来做到这一点,例如:

OBJS1 := $(C_SRCS:%.c=%.o)
OBJS = $(subst ./,./artifacts/,$(OBJS1))

这会很好地工作,但我希望结合这两个规则并删除中间变量。我尝试过:

OBJS = $($(subst ./,./artifacts/,$(C_SRCS)):%.c=%.o)

OBJS 为空,我想如果我使用两个完全相同的函数类型也许会更好,所以我尝试了:

OBJS = $(subst %.c,%.o,$(subst ./,./artifacts/,$(C_SRCS)))

并且仅执行嵌套规则,并且 OBJS 设置为 ./artifacts/src/foo.c ./artifacts/src/bar.c ...

我开始阅读一些 Make 文档,但找不到任何有关嵌套字符串函数的信息。是否可以在 Makefile 中嵌套字符串函数?如果是这样,我在这里做错了什么?

最佳答案

是的,您可以嵌套字符串函数。

您不能使用简写 :X=Y不过函数结果的符号。

所以当你组合 OBJS1 := $(C_SRCS:%.c=%.o) 时和OBJS = $(subst ./,./artifacts/,$(OBJS1))你没有正确地做到这一点(或者明显的方式),你做了其他的事情。你写了OBJS = $($(subst ./,./artifacts/,$(C_SRCS)):%.c=%.o)当明显(且正确)的嵌套为 OBJS = $(subst ./,./artifacts/,$(C_SRCS:%.c=%.o)) 时。 (也许这是一个打字错误,我不确定)。

:X=Y简写是 patsubst 的简写(自动 % 前缀简写)不是 subst这就是为什么你的行 OBJS = $(subst %.c,%.o,$(subst ./,./artifacts/,$(C_SRCS)))不起作用(否则考虑 $(C_SRCS:.c=.o) 会在更多地方发生,而不仅仅是值的末尾)。

请参阅下面的工作版本。

C_SRCS += \
./src/foo.c \
./src/bar.c

pv = $(warning $1: $($1))
$(call pv,C_SRCS)

$(warning RAW: $(subst ./,./artifacts/,$(C_SRCS:%.c=%.o)))

OBJS = $(patsubst %.c,%.o,$(subst ./,./artifacts/,$(C_SRCS)))
$(call pv,OBJS)

关于string - Makefile字符串函数可以嵌套吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27255128/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com