2016-01-26 84 views
2

肯定這個問題已經問了很多次了,但我找不到正確的答案,所以我問。如何在子文件夾中使用通用make文件?

我有以下項目結構:

/root 
| obj 
| Makefile 
| src/ 
| | dir1/ 
| | | 1.cpp 
| | dir2/ 
| | | 2.cpp 
| | | dir3/ 
| | | | 3.cpp 
| | | | 4.cpp 
| | main.cpp 

我能有一個通用的makefile文件,將編譯所有的cpp文件中的任何子文件夾src文件夾中的任何深度,將產生的目標文件進入obj目錄?

該項目正在使用Eclipse CDT開發的,我想現在能夠提供的源代碼,而無需用戶安裝Eclipse構建它

+1

哇,使2016年正在使用! :-) –

+0

@AmiTavory我只是尋找最簡單的解決方案,正在製造或另一個 –

+1

是不是真正爲此設計的問題。您可能需要編寫一個腳本來動態構建Makefile。或者切換到另一個構建系統,如scons。 – StoryTeller

回答

3

爲了實現「無限」遞歸,您可以使用通配符與延長圖案:

CPPFILES := $(wildcard src/**/*.cpp) 

然後你就可以將其轉化爲的.o文件列表:

OBJFILES := $(patsubst src/%.cpp,obj/%.o,$(CPPFILES)) 

現在我們有建設目標:

.PHONY: all 
all: $(OBJFILES) 

編譯規則:

obj/%.o: src/%.cpp 
    mkdir -p "$(@D)" 
    $(CC) -c $< -o [email protected] 

如果有延長圖案通配符不工作,那麼你可以使用:

CPPFILES := $(shell find src -name '*.cpp') 
+0

OP不清楚他們是需要'obj'中的鏡像目錄還是隻需要一個'obj'目錄,所以這可能不是所要求的,而是很好地完成的(並且可以很容易地修復單個'obj'目錄) 。 –

+0

如果碰巧有兩個文件名相同,只是在不同的目錄中,那麼在這種情況下,單個obj目錄會中斷。 – Petesh

+0

另請參閱我的答案[這裏](http://stackoverflow.com/a/26852977/258523)的make-internal遞歸通配符函數(以及我發現它的源代碼鏈接)。 –

2

好,我是不會回答這個(這個回答是不是make本身),但是:

  1. 的OP說,他不是針對具體make,只是簡單的解決方案。

  2. 還沒有make特定答案呢。

所以,這裏是如何做到這一點的cmakeSCons請注意我的目的不是貶低make,主張以下兩種中的任何一種(儘管如此,我必須說 - 我的感覺是當今兩個主流的C++構建系統)等。

CMake的

在CMake的basic tutorial,你會使用這樣的:(進一步信息請參見this question

file(GLOB_RECURSE variable [RELATIVE path] 
[FOLLOW_SYMLINKS] [globbing expressions]...) 

使用SCons

在使用SCons basic tutorial,你會使用這樣的:

def getSubdirs(abs_path_dir): 
    lst = [ name for name in os.listdir(abs_path_dir) if os.path.isdir(os.path.join(abs_path_dir, name)) and name[0] != '.' ]  
    lst.sort() 
    return lst 

(見this question進一步的信息。)

+0

可能值得一提的是,正如在鏈接的SO問題中提到的,CMake緩存找到的文件,因此如果添加,刪除或重命名文件,則需要刪除並重新生成cmake文件。我沒有使用Scons,所以我不知道它是否具有相同的行爲。 – user2079303

+0

謝謝,@ user2079303 - 這是一個很好的觀點! –

相關問題