ポータブルMakefileを書く

ポータブルMakefileを書く

私自身のnetfilterモジュールを開発するのは今回が初めてです。インターネット文書によると、最も単純なモジュールには次のCコードが含まれています。

//'Hello World' kernel module, logs call to init_module
// and cleanup_module to /var/log/messages

// In Ubuntu 8.04 we use make and appropriate Makefile to compile kernel module

#define __KERNEL__
#define MODULE

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

int init_module(void)
{
 printk(KERN_INFO "init_module() called\n");
 return 0;
}

void cleanup_module(void)
{
 printk(KERN_INFO "cleanup_module() called\n");
}

同じページでは、makefile に対して以下を提案します。

obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

コマンドラインから make を実行すると、「No "default" target」というメッセージが表示されます。

しかし、makefileを次のように変更した場合:

obj-m := hello.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

ここで「make」だけを実行すると正常に動作し、Cコンパイラが実際に実行され、モジュールの挿入と削除が期待どおりに動作します。

気になりました。私が示した最後のmakefileは、すべてのUNIXオペレーティングシステム(バージョン2.24以降)と互換性がありますか?現在私はSlackware 12 32ビットを使用しており、CentOS 6 64ビットでもコードをテストする予定です。生成できる汎用makefileがある場合は、それを実行してから、システムごとに別々のmakefileを作成することをお勧めします。

誰でも私にアドバイスを与えることができますか?

答え1

AFAIK、よさそうですね。私が使用するデフォルト値は小さいその他。それから来るLinuxデバイスドライバのドキュメント

# To build modules outside of the kernel tree, we run "make"
# in the kernel source tree; the Makefile these then includes this
# Makefile once again.
# This conditional selects whether we are being included from the
# kernel Makefile or not.
ifeq ($(KERNELRELEASE),)

    # Assume the source tree is where the running kernel was built
    # You should set KERNELDIR in the environment if it's elsewhere
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    # The current directory is passed to sub-makes as argument
    PWD := $(shell pwd)

modules:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
  rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers

.PHONY: modules modules_install clean

else
    # called from kernel build system: just declare what our modules are
    obj-m := hello.o
endif

関連情報