私は 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 でワイルドカードを使用する必要があります。どんな助けでも大歓迎です。