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]