(假定已存在hello.c文件),则将其编译成hello.ko的makefile可以有以下两种书写方式:
方式1、
-
obj-m := hello.o
-
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
-
PWD := $(shell pwd)
-
all:
-
make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
-
clean:
-
rm *.o *.ko *.mod.c
方式2、
-
ifneq ($(KERNELRELEASE),)
-
obj-m := hello.o
-
else
-
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
-
PWD := $(shell pwd)
-
default:
-
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
-
endif
上述makefile文件网上随处可见,此处仅记录几点:
1、shell命令的运行
如: $(shell uname -r) 会得到完整内核版本号。
2、make会进入KERNEL_DIR目录执行Makefile,然后返回PWD目录执行自己Makefile。
3、方式2中,先进入else,变量赋值然后执行default,当执行-C选项跳转进入内核树目录,重新读取makefile,此时$(KERNELRELEASE)已定义,于是声明内核模块名字。
问题:
如何使用类似echo的命令,来进行中间变量的跟踪?
类似$(shell uname -r)的格式可以随处使用,表示一个值,但echo $(shell uname -r)只能放在target内才能打印出来。
阅读(1075) | 评论(0) | 转发(0) |