从路径中删除../

我有目标文件进来,可能看起来像这样的路径:

 '../../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文件的列表。 我没有任何东西取代'../'。


尝试abspath。

COBJS := $(foreach file,${CFILES},$(abspath ${file}))

解决您的问题的简单方法如下。 考虑一个简单的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]
链接地址: http://www.djcxy.com/p/10545.html

上一篇: remove ../ from path

下一篇: How to output sorted hash in ruby template