2012-03-16 90 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]