2012-04-17 8 views
1

私はLinux上でCで書いた小規模なアプリケーション用のmakefileを書こうとしています。現在のところ、すべてのソースファイル.cは最上位ディレクトリにあり、すべてのヘッダファイルは のインクルードディレクトリにあります。これは私がこれに使ったメイクファイルです。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を使うことでした。それで、再帰的なmakeに不満を抱かせるページがたくさんあることが分かります。誰もこの権利を行う方法としてこれで私を助けてもらえますか? ありがとう

+0

_your_プロジェクトに関連する「これらのページ」に関する苦情はありますか?そうでなければ、基本的なビルドを動作させるのはかなり簡単なので、再帰的なmakefileを使って行ってください。 – HonkyTonk

答えて

2

これを行うにはいくつかの方法がありますが、確実にVPATH:=Packetを使用して、 'Packet'ディレクトリ内のソースファイルを探すようにmakeに指示してください。 make manual

2

Recursive Make Considered Harmfulに記載されている方法をチェックすることをおすすめします。 私はそれをいくつかのプロジェクト(小規模から中規模)で使用しており、再帰的アプローチよりも使いやすく、ラップするのが簡単です。

基本的に、あなたはサブディレクトリの各々からの(部分)メイクファイルを含むルートディレクトリのMakefile有する:

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 

これらモジュールのmakefileをもちろん、独自のモジュールターゲットや特別なビルド要件を定義することもできます。

再帰的なmakeとは異なり、 "make"は一度しか呼び出されません。ほとんどの場合、より速いビルドにつながります。 しかし、ほとんどの小規模なプロジェクトでは、ビルド時間も複雑さも重要な問題ではないので、最も自然に感じるものを使用してください。

関連する問題