2011-08-29 28 views
1

我有一種情況,我需要從庫中編譯一些源文件到我自己的程序中。源文件所在的目錄不可由我寫入。相反,我有一個本地「build」目錄,所有的工作都完成了。整蠱「製造」的目標要求

問題我正在翻譯路徑。源文件被命名爲xxxx.cppyyyy.cpp,它們分別位於/path/to/source/xxxx/xxxx.cpp/path/to/source/yyyy/yyyy.cpp之間。

使用$(patsubst ...)我可以愉快地將這些路徑轉換爲build/xxxx/xxxx.cpp等,但我無法得到它去掉第一個xxxx關閉。

我可以製作一個目標是將匹配像這樣做:

build/%.o: /path/to/source/%/%.cpp 
     $(CXX) ... 

...但我不能讓那個在所有的工作。我猜它不喜歡目標後半部分的雙重通配符。

「源」的名字是隻用「XXXX」和「YYYY」單一變量:

SYS_LIBS = xxxx yyyy 

如何得到這樣的事情有什麼建議工作?

噢,我需要它是一個「通用」解決方案 - 這將成爲許多使用該庫文件的項目中的一個包含makefile,因此每個文件手工製作目標不是一個選項。我無法預測圖書館會有什麼文件。

回答

0

一個簡單的方法是使用vpath讓make找到文件本身。你剛纔定義

vpath %.cpp /path/to/source 
vpath %.cpp /path/to/source2 
vpath %.cpp /path/to/source3 

build/%.o : %.cpp 
    $(CXX) 

您可以定義多個路徑來源,途徑,但要小心,如果你有一個以上的文件夾相同的文件(在path_to_source1和path_to_source2 egacpp)

+0

那麼如果你想'vpath%.cpp/path/to/source/*'例如? – Majenko

+0

你可以有多個vpath,因爲我改變了它。 AFAIK,但不能使用通配符。通常情況下,你沒有那麼多的文件夾來保存源代碼,所以它不是一個真正的問題(如果是這樣,你可以用生成的東西解決它,但通常太痛苦了) – Bruce

+0

我無法預測路徑的最後部分是什麼 - 正如我在我的問題中提到的那樣。這完全取決於最終用戶在其系統上安裝的庫。 – Majenko

0

個人正如布魯斯所說,我會用vpath。如果有/path/to/source/下有許多目錄,你可以使用

SRCS = $(wildcard /path/to/source/*) 
vpath %.cpp $(SRCS) 

(這工作只要目錄去從那裏下來只有一個級別,如果有喜歡的東西/path/to/source/foo/bar/zzzz/zzzz.cpp,那麼你就必須依傍的東西。像find

如果你真的想這樣做路徑轉換,這將做到這一點:

X := $(patsubst %.cpp,build/%.o,$(notdir $(X))) 

或(我不知道爲什麼你會想這樣做,這樣一來,但你可以):

X := $(shell echo $(X) | sed 's|.*/\(.*\)\.cpp|build/\1\.o|')