Makefile - 删除路径中的../

11

我有一些对象文件,其路径可能看起来像这样:

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

“COBJS := $(subst ../.., build, $(CFILES))”有什么问题吗? - Beta
有些文件并不总是向后两个相对路径。 - Halsafar
3个回答

4

正如我在原始问题中发布的并最终忘记回答的那样。

解决此问题以及可能出现的许多其他字符串替换的方法如下:

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

'subst'需要3个参数:$toMatch,$replaceWith和$string。

在这种情况下,$(CFILES)是要编译的所有.c文件的列表。我用空字符串替换了'../'。


1
尝试使用abspath
COBJS := $(foreach file,${CFILES},$(abspath ${file}))

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接