2016-05-25 10 views
1
obj-m := $(MODNAME).o 
ccflags-y := $(CCFLAGS) 
src_files := $(wildcard $(foreach pat,*.c *.cpp *.s,src/$(pat) src/$(MODNAME)/$(pat))) 
$(MODNAME)-objs := $(addsuffix .o, $(basename $(src_files))) 

all: 

    make -C $(KDIR) M=$(shell pwd) modules 

clean: 

    make -C $(KDIR) M=$(shell pwd) clean 

私はこのカーネルモジュールをビルドするためのmakeファイルを持っています。しかし、私がそれを実行するたびに、ターゲットの.cを作るルールがないというエラーが表示されます。 .cはソースファイルではありません。 "if [-d src]"チェックを外すと、カーネル構築システムからの再帰呼び出しにsrcが存在しないというエラーが表示されます。私がsrcへの完全なパスを指定すると、それはそれが見つからないという同じ出力を与えます(これは本当に変です)。 src_filesをハードコードすると(コピーして間違って貼り付けなかった場合)動作します。誰が何が起こっているか考えていますか?ツリー外モジュールビルドの問題

答えて

3

あなたのmakefileには、現在のディレクトリがmakefileに含まれているものと見なされます。しかし、あなたのファイルがKbuildのコンテキストから実行されたとき、これはもはや真ではありません。現在のディレクトリはカーネルソースのディレクトリです。 src_files変数の内容が間違ってなり理由です

wildcardはカーネルソース内のsrc/下のファイルを見つけることができません。あなたのメイクファイルとディレクトリを参照するためにあなたが特別なsrc変数を使用することがあります。

src_files := $(wildcard $(foreach pat,*.c *.cpp *.s,$(src)/src/$(pat) $(src)/src/$(MODNAME)/$(pat))) 

を他の側からは、*-objs変数に列挙されたパスが相対でなければなりません(これはKbuildによって要件です)。ですから、これらの絶対パスからプレフィックスを除去する必要があります。

src_files_rel := $(src_files:$(src)/%=%) 

オブジェクトのリストを作成するために、あなたはこれらのパスを使用することがあります。

$(MODNAME)-objs := $(addsuffix .o, $(basename $(src_files_rel))) 
+0

これは、問題の多くを解決するために縫い目が、何らかの理由で、私は」依然として問題が発生しています。以下は私のMakefileと出力へのリンクです。ソースファイル内のハードコードが完全に構築される場合はもう一度注意してください。 https://drive.google.com/open?id=0B59DI9U-fFzfWjNIMTZGSkJLZjQ –

+0

ああ、 'src_files_rel'の代入で不正な置換参照の使い方だった:正しい構文' $(var:pattern = replacement) 'ではなく' = 'を使う'、 'をデリミタとして使用します。答えは今修正されました。 – Tsyvarev

+0

ありがとうございました! –