Makefile - 从路径中删除../

时间:2012-03-16 04:51:37

标签: makefile

我的目标文件包含可能如下所示的路径:

 '../../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))

3 个答案:

答案 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]