Makefile-从路径中删除../

Makefile-从路径中删除../,makefile,Makefile,我有一些对象文件的路径可能如下所示: '../../src/foo/bar.c' 我想把它们输出到 'build/src/foo/bar.o' 目前正在使用: COBJS := $(notdir $(CFILES)) COBJS := $(patsubst %,$(BUILD)%.o,$(COBJS)) 我能做到 'build/bar.o' 如果任意两个库/项目包含相同的类名,则会出现问题 所以问题是,如何从Make中的路径中删除多个“../”。我尝试了

我有一些对象文件的路径可能如下所示:

 '../../src/foo/bar.c'
我想把它们输出到

 'build/src/foo/bar.o'
目前正在使用:

 COBJS      :=  $(notdir $(CFILES))
 COBJS      :=  $(patsubst %,$(BUILD)%.o,$(COBJS))
我能做到

 'build/bar.o'
如果任意两个库/项目包含相同的类名,则会出现问题

所以问题是,如何从Make中的路径中删除多个“../”。我尝试了一些明显的、幼稚的方法,但没有结果

更新时,以下内容将完全匹配.././并将其替换为其余内容。这是完美的,只是它特定于../。只需使其匹配任意数量的..//

 COBJS      :=  $(CFILES:../../%=%)
更新

解决了,只差三分钟就可以发布我自己的答案了

 COBJS      :=  $(subst ../,,$(CFILES))
试试看


正如我最初的问题中所说,我最终忘记了回答

对于这一点以及可能的许多其他Make字符串替换,解决方案如下:

COBJS      :=  $(subst ../,,$(CFILES))
“subst”接受3个参数$toMatch,$replaceWith,$string


在本例中,$(CFILES)是要编译的所有.c文件的列表。我将“../”替换为零。

您的问题的简单解决方案如下所示。考虑一个简单的Mag文件

path_to_remove := batch1/test2
path_to_add := earth/planet

my_paths := \
batch1/test2/p/a3.c \
batch1/test2/p/a2.c \
batch1/test2/p/a1.c  \
batch1/test2/q/b3.c \
batch1/test2/q/b2.c \
batch1/test2/q/b1.c

$(info [Original] [$(my_paths)])
my_paths := $(my_paths:$(path_to_remove)/%=$(path_to_add)/%)
$(info [New Changed] [$(my_paths)])

all:
    @echo "Hi Universe"
当您运行make命令时

make
您将得到以下输出:

[Original] [batch1/test2/p/a3.c batch1/test2/p/a2.c batch1/test2/p/a1.c batch1/test2/q/b3.c batch1/test2/q/b2.c batch1/test2/q/b1.c]
[New Changed] [earth/planet/p/a3.c earth/planet/p/a2.c earth/planet/p/a1.c earth/planet/q/b3.c earth/planet/q/b2.c earth/planet/q/b1.c]

COBJS:=$(subst../,build,$(CFILES))
有什么问题吗?有些文件并不总是反向的两个相对路径。
[Original] [batch1/test2/p/a3.c batch1/test2/p/a2.c batch1/test2/p/a1.c batch1/test2/q/b3.c batch1/test2/q/b2.c batch1/test2/q/b1.c]
[New Changed] [earth/planet/p/a3.c earth/planet/p/a2.c earth/planet/p/a1.c earth/planet/q/b3.c earth/planet/q/b2.c earth/planet/q/b1.c]