Compiling Modules

先日パクッて作った Makefile が以下

obj-m	:= hello.o

KDIR	:= /lib/modules/$(shell uname -r)/build
PWD	:= $(shell pwd)

default:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

これは kernel source tree の中に作ってないので余計な記述 (下 3 行) が必要になるのだろうな、と。でも、カーネル自分で作った実績があれば基本上記な Makefile で試験できるモジュールが作れる、というのは凄い。
もう少し補足というか確認してみるに、-C オプションは make なプロセスのカレントディレクトリを変える、という意味で良いのかな??
てーコトは大元の Makefile で make が走るのか。見てみると以下の記述に hit

# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD take precedence
ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif
ifdef M
  ifeq ("$(origin M)", "command line")
    KBUILD_EXTMOD := $(M)
  endif
endif

む。上記の SUBDIRS 云々はダウト、というか古い (Old syntax) らしい。試してみました。ってか、ifeq のソレは何か?

$ ls
Makefile  Makefile~  Module.symvers  hello.c  hello.ko  hello.mod.c  hello.mod.o  hello.o
$ LANG=C make clean
make: *** No rule to make target `clean'.  Stop.
$ LANG=C rm Module.symvers *.ko *.o *~ *.mod.c
rm: cannot remove `*~': No such file or directory
$ LANG=C ls
Makefile  hello.c
$ LANG=C make
make -C /lib/modules/2.6.20/build M=/home/rms/kernel/kernel_exercise/1.kernel_module modules
make[1]: Entering directory `/home/rms/kernel/linux-2.6.20'
  CC [M]  /home/rms/kernel/kernel_exercise/1.kernel_module/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/rms/kernel/kernel_exercise/1.kernel_module/hello.mod.o
  LD [M]  /home/rms/kernel/kernel_exercise/1.kernel_module/hello.ko
make[1]: Leaving directory `/home/rms/kernel/linux-2.6.20'
$

で、この M あるいは SUBDIRS は KBUILD_EXTMOD に代入される模様。しかし大元の Makefile 大変ッス。

明日は

職場にLinux カーネル解析入門を持っていく予定。しかし持ってって何すんだ、とゆー話があるな (わら