2012-04-17 122 views
1

我試圖寫一個小規模的應用程序,我用C在Linux下寫了一個makefile多個子目錄。目前我所有的源文件.c都位於頂級目錄中,並且所有頭文件都在 包含目錄中。這是我用於此的makefile。包括一個make文件

IDIR =include 
CC=gcc 
CFLAGS=-I$(IDIR) 


ODIR=obj 

_OBJ = main.o kernel.o user_app.o myargs.o ofp_msgs.o pkt_ip.o pkt_ether.o pkt_tcp.o pkt_udp.o pkt_icmp.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 

#DEPS = ofp_msgs.h 




$(ODIR)/%.o: %.c 
    $(CC) -c -o [email protected] $< $(CFLAGS)    
all: jam 

jam: $(OBJ) 
    gcc -o [email protected] $^ $(CFLAGS) -lpthread 

.PHONY: clean 

clean: 
    rm -f $(ODIR)/*.o *~ jam 

它工作正常,但我想的是,比如我做一個子目錄叫"Packet"和我所有的數據包解析文件,即"pkt_ip.c, pkt_tcp.c etc"都應該在該目錄中爲他們的頭文件還應該在頂層目錄它"toplevel/include"。我做了一些搜索,最常用的方法是使用遞歸make。然後我看到很多網頁抱怨遞歸製作。任何人都可以請幫助我,因爲如何做到這一點的權利? 謝謝

+0

是對「那些頁面」投訴相關_your_項目?如果沒有,那麼使用遞歸makefile即可,因爲獲得基本構建工作非常容易。 – HonkyTonk 2012-04-17 11:14:19

回答

2

有幾種方法可以做到這一點,但您當然可以使用VPATH:=Packet來告訴make在'Packet'目錄中查找源文件。看到make manual

2

我建議您檢查出Recursive Make Considered Harmful描述的方法。 我已經用它的幾個項目(小到中等大小),並發現它更容易使用,更容易環繞那些頭,比遞歸方法。

SRC := main.c 
MODULES := Packet lib etc 
-include $(patsubst %, %/module.mk, $(MODULES)) 

OBJ := $(patsubst %.c, %.o, $(filter %.c,$(SRC))) 
# (...) 

分組/ module.mk:

SRC += Packet/pkt_ip.c Packet/pkt_tcp.c 
LIBS += -lsome_library 

這些模塊生成文件

基本上,在根目錄中,它包括來自每個子目錄的(局部的)生成文件具有生成文件當然也可以定義他們自己的模塊目標或特殊的構建要求。

與遞歸時許,「製造」只會被調用一次,這對於大多數使用情況將導致更快的建立。 但是,對於大多數規模較小的項目,建造時間和複雜性都不會成爲主要問題,因此請使用最自然的方式。