尝试编写一个可移植的 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 时,我收到了“没有“默认”目标”消息。

但是,当我将 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

相关内容