1

私は Makefile とカーネル モジュールにかなり精通していますが、最近、ワイルドカードの使用に関して、意味をなさない Makefile で問題が発生しました。これを実証するために、hello world カーネル モジュールをゼロからコンパイルしています。ディレクトリ構造は次のようになります。

hello_mod/
   | 
   --- hello.c
   |
   --- Makefile

実際のメイクファイルは次のとおりです。

CFILES := $(wildcard hello.c*)
#CFILES := hello.c
OBJS := $(CFILES:.c=.o)

KSRC := /lib/modules/$(shell uname -r)/build

obj-m += hello_world.o
hello_world-y := $(OBJS)

all:    
        @echo $(CFILES)
        $(MAKE) -C $(KSRC) M=$$PWD modules

clean:
        $(MAKE) -C $(KSRC) M=$$PWD clean

.PHONY: clean

問題は、コメント化された $(CFILES) とコメント化されていない $(CFILES) がまったく同じであっても、最初の $(CFILES) を使用するとビルドが次のエラーで失敗することです。

*** No rule to make target `/home/test/hello_mod/hello_world.c', needed by
/home/test/hello_mod/hello_world.o'.  Stop.

コメント付きの $(CFILES) を使用すると、完全に機能します。

誰かがこれをテストしたい場合は、 hello.c である hello world ソースのソースを含めます。

#include <linux/kernel.h>
#include <linux/module.h>

static int mod_init()
{
        printk("Hello\n");
        return 0;
}

static void mod_exit()
{
        printk("Bye world\n");    
}

module_init(mod_init);
module_exit(mod_exit);

なぜそれがそのように振る舞っているのか誰にも分かりますか?そして、makefile でワイルドカードを使用する必要があります。どんな助けでも大歓迎です。

4

2 に答える 2

2

ここでは 2 つのメイクが行われます。1 つ目は、KSRC 変数と再帰的な make 呼び出しだけに依存しています。2 番目の make は、、、、および変数のみを必要CFILESとしOBJS、ターゲットを使用しません。したがって、デバッグは、CFILES が使用されていない最初の Make に対して正しく設定されていることを示しており、2 番目の Make では使用されていないことを示しています。obj-mhello_world-yall:

別のディレクトリからワイルドカード展開を行っており、適切なファイルを選択していません。CFILES でこれを試してください:

CFILES := $(notdir $(wildcard $M/hello.c*))
于 2013-08-05T15:50:32.780 に答える
0
 SRCDIRS := subdir1 subdir2
 CFILES := $(strip $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c)))

おそらくあるはずです(foreach ドキュメントの例を参照)

 SRCDIRS := subdir1 subdir2
 CFILES := $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))

(する必要はありません$(strip)、....またはおそらく

 CFILES := $(wildcard  {subdir1,subdir2}/*.c)

そのような問題をデバッグするには、おそらくremakeを として使用します。remake -x

于 2013-08-04T11:06:59.703 に答える