外部カーネルモジュール用の簡単なMakefileを書いています。
それを構築する:
obj-m += usbtherm.o
all:
make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) modules
ニースである外部モジュールのみをコンパイルします。
しかし、それをインストールする:
install:
make -C /lib/modules/$(Shell uname -r)/build M=$(PWD) modules_install
カーネルソースツリーにすべてのモジュールをインストールしますが、モジュールをdrivers/usb/misc
にインストールする方法がわかりません。
だから私はこのようにモジュールをインストールしています:
install:
cp $(Shell pwd)/usbtherm.ko /lib/modules/$(Shell uname -r)/kernel/drivers/usb/misc
depmod -a
これは外部モジュールのみをインストールします。
しかし、それは私にはあまりエレガントに見えません-私は何が欠けていますか?
Sudoをインストールしたとき
Sudo -E make install
外部モジュールだけをインストールし、depmodを再実行しました。
環境保護フラグなしで実行すると、カーネルの更新に使用したカーネルソースツリーに組み込まれているすべてのモジュールが再インストールされました。 Sudoを使用すると、カーネルツリーに変更を加えるまでに、PWDが正しく設定されていない可能性がありますが、これは、これに遭遇した他の誰かを助ける可能性があります。
_modules_install
_をもう1つ詳しく調べました。 Linux Makefileの場合:
_# Target to install modules
PHONY += modules_install
modules_install: _modinst_ _modinst_post
PHONY += _modinst_
_modinst_:
@rm -rf $(MODLIB)/kernel
@rm -f $(MODLIB)/source
@mkdir -p $(MODLIB)/kernel
@ln -s `cd $(srctree) && /bin/pwd` $(MODLIB)/source
@if [ ! $(objtree) -ef $(MODLIB)/build ]; then \
rm -f $(MODLIB)/build ; \
ln -s $(CURDIR) $(MODLIB)/build ; \
fi
@cp -f $(objtree)/modules.order $(MODLIB)/
@cp -f $(objtree)/modules.builtin $(MODLIB)/
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
_
私が理解しているのは、ソースツリーを期待し、既存のモジュールをアンインストールし、クリーンアップを実行してから、_scripts/Makefile.modinst
_を実行してモジュールをインストールすることです。これにより、外部モジュールがextra
にインストールされます。
_# Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra
_
実際、カーネルソースがなく、ヘッダーがインストールされているシステムで外部モジュールを構築する場合、モジュールは/usr/src/linux-headers-$(uname -r)
からシンボリックリンクされた/lib/modules/$(uname -r)/build
に組み込まれ、all
およびclean
ターゲットは成功し、_modules_install
_は失敗します。つまり、ヘッダーのみがインストールされている場合は_modules.order
_が存在しないためです。
ただし、*。koをコピーして_depmod -a
_を実行して外部モジュールをインストールすると、正常に機能します。