2017-02-14 72 views
1

這裏是我的makefile,因爲它目前存在如何爲.cpp和.h文件從變量生成依賴關係?

SRC=src 
HDS=header 
DRV=drivers 
FILES=arraystack arraylist pointerstack pointerlist 
FLAGS=-w -I $(HDS) 

.PHONY: timing all $(FILES) 
.DEFAULT_GOAL:=all 

$(FILES): % :$(DRV)/%_driver.cpp $(HDS)/%.h $(SRC)/%.cpp 
    g++ $(FLAGS) $^ -o [email protected] && ./[email protected] && rm [email protected] 

timing: 
    g++ $(FLAGS) $^ -i [email protected] && ./[email protected] && rm [email protected] 

all: $(FILES) timing 

目標時間需要靠arraystack.cpp,arraystack.h,arraylist.cpp,arraylist.h,pointerstack.cpp,pointerstack.h,pointerlist.cpp ,和pointerlist.h。此外,這些文件位於不同的目錄中 - .h文件位於標題/中,.cpp文件位於src /中。有沒有一種方法可以讓make根據某種模式匹配自動生成這些需求,這些需求來自於我的變量中具有根文件名的現有列表?這似乎是一個更優雅的解決方案,而不是一個8 .h和.cpp文件列表應該可用。

+0

當你的依賴性問題很好說,你是什麼:你可以在一個配方,而不是使用shell內置&&分行指定多個動作試圖用這個Makefile實現並不是很清楚:你爲什麼試圖執行('... && ./[email protected] && ...')你的食譜產品? 請參閱我的回答下面與依賴圖相關的問題,並編輯您的問題/相應地創建一個新的問題,如果您有其他需求 –

回答

2

使用一些text manipulation functions,你可以先構建的基於您的目錄中的頭文件和源文件列表和FILES列表:

HDS_FILES = $(addsuffix .h,$(addprefix $(HDS)/,$(FILES))) 
SRC_FILES = $(addsuffix .cpp,$(addprefix $(SRC)/,$(FILES))) 
DRV_FILES = $(addsuffix _driver.cpp,$(addprefix $(DRV)/,$(FILES))) 

然後,添加目標沒有食譜註明出處,司機之間的依賴關係頭文件:

$(SRC)/%.cpp: $(HDS)/%.h 
$(SRC)/%_driver.cpp: $(HDS)/%.h 

添加平移目標進行編譯源和驅動程序文件到目標文件:

%.o: $(SRC)/%.cpp 
    g++ -c $(FLAGS) $^ -o [email protected] 

%_driver.o: $(DRV)/%_driver.cpp 
    g++ -c $(FLAGS) $^ -o [email protected] 

構建所有目標文件的列表,併爲您的timing可執行文件創建最終的規則:

OBJS = $(addsuffix .o,$(FILES)) $(addsuffix _driver.o,$(FILES)) 

timing: $(OBJS) 
    g++ $(FLAGS) $^ -o [email protected] 

提示1:調整你的Makefile時,使用$(info ...)功能檢查你的變量的內容,而不影響你的依賴關係圖,它有助於發現文本轉換內容中的錯誤。

$(info HDS_FILES = $(HDS_FILES)) 
$(info SRC_FILES = $(SRC_FILES)) 
$(info DRV_FILES = $(DRV_FILES)) 
$(info OBJS = $(OBJS)) 

提示2

<some target>: 
    g++ $(FLAGS) $^ -o [email protected] && ./[email protected] && rm [email protected] 

# Is (almost) equivalent to and clearer than 
<some target>: 
    g++ $(FLAGS) $^ -o [email protected] 
    ./[email protected] 
    rm [email protected] 
+0

這似乎正是我需要的,雖然稍微過度設計以供我使用。我可以通過我自己的方式解決它 '計時:$(文件:%= $(SRC)/%。cpp)$(文件:%= $(HDS)/%。h)$(DRV)/ timing.cpp' 並感謝關於多線的提示,出於某種原因,我在印象下只允許單線。不知道我從那裏得到了什麼。 –