我的目标文件包含可能如下所示的路径:
'../../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))
答案 0 :(得分:2)
正如我原来的问题所述,我忘了最终回答。
此解决方案以及可能的许多其他Make字符串替换如下:
COBJS := $(subst ../,,$(CFILES))
'subst'需要3个参数。 $ toMatch,$ replaceWith,$ string。
在这种情况下,$(CFILES)是要编译的所有.c文件的列表。我什么都不用'../'替换。
答案 1 :(得分:1)
尝试abspath。
COBJS := $(foreach file,${CFILES},$(abspath ${file}))
答案 2 :(得分:0)
您的问题的简单解决方案如下。考虑一个简单的Makefile
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]