下面是一个网卡驱动的makefile,有很多地方不懂,拿出来和大家一起分析一下:
CURRENT= $(shell uname -r)
TARGET= asix
OBJS= asix.o
MDIR= drivers/net/usb
KDIR= /lib/modules/$(CURRENT)/build
SUBLEVEL= $(shell uname -r | cut -d '.' -f 3 | cut -d '.' -f 1 | cut -d '-' -f 1 | cut -d '_' -f 1)
ifneq (,$(filter $(SUBLEVEL),14 15 16 17 18 19 20 21))
MDIR = drivers/usb/net
endif
EXTRA_CFLAGS = -DEXPORT_SYMTAB #export-objs
PWD = $(shell pwd)
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR)
obj-m := $(TARGET).o
default:
make -C $(KDIR) SUBDIRS=$(PWD) modules
$(TARGET).o: $(OBJS)
$(LD) $(LD_RFLAG) -r -o $@ $(OBJS)
install:
su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
.PHONY: modules clean
-include $(KDIR)/Rules.make
第一个问题就是default下面到那句话,—C应该是改变它的目录到KDIR下面,然后在建立模块目标前回到模块源码目录,不知到这样理解对不对?
第二个问题:
$(TARGET).o: $(OBJS)
$(LD) $(LD_RFLAG) -r -o $@ $(OBJS)
这句话应该怎么理解?asix.o依赖于asix.o?
第三个:
install:
su -c "cp -v $(TARGET).ko $(DEST) && /sbin/depmod -a"
这个su -c是什么意思?
|
第一个问题,—C是改变它的目录到KDIR下面,执行完该目录下的modules目标后返回当前目录
第二个问题等楼下大虾。。。。
第三个问题,su -c是切换到root用户,并执行引号内的命令
|
$(TARGET).o: $(OBJS)
$(LD) $(LD_RFLAG) -r -o $@ $(OBJS)
第一行意思是, $(OBJS) 执行gcc编译, 目标符号是$(TARGET)
第二行: ld 是link命令, ld_rflag la的flag
$@ 代表是当前的符号. 也就是这里的 $(TARGET)
最后成型的命令是 ld ld_flag -r -o asix.o asix.o
一般使用情况是: OBJS 多个.o文件ld成一个 TARGET ..为了方便使用.
跟静态库ar 有点类似