2012-03-16 78 views
7

删除../我有对象文件来与路径可能看起来像这样的: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)) 
+0

出了什么问题'COBJS:= $(SUBST ../..,建设,$(CFILES))'? – Beta 2012-03-16 05:04:39

+0

某些文件并不总是向后两个相对路径。 – Halsafar 2012-03-17 05:21:37

回答

2

由于发布在我原来的问题,我忘了最终回答。

这可能和许多其他制作的字符串替换解决方案如下:

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]