linux 模块 Makefile 分析

################################################################################
article: module Makefile Analysize
author: hjjdebug
date: Thu Nov 14 11:44:14 EST 2013
################################################################################
#
# Makefile for the linux RomFS filesystem routines.
#
$(warning KERNELRELEASE = $(KERNELRELEASE))
$(warning CONFIG_ROMFS_FS = $(CONFIG_ROMFS_FS))
ifneq ($(KERNELRELEASE),)
obj-$(CONFIG_ROMFS_FS) += romfs.o

romfs-y := storage.o super.o mem.o

ifneq ($(CONFIG_MMU),y)
romfs-$(CONFIG_ROMFS_ON_MTD) += mmap-nommu.o
endif
else
    PWD := $(shell pwd)
    KVER ?= $(shell uname -r)
    KDIR :=/lib/modules/$(KVER)/build
all:
    $(MAKE) -C $(KDIR) M=$(PWD)
clean:
    -rm -rf *~ *.o *.ko module* Module* *.mod.* .*.cmd .tmp_versions/
endif

################################################################################


执行过程:


********************************************************************************
[root@hjj ~/software/romfs64]# make
Makefile:4: KERNELRELEASE =
Makefile:5: CONFIG_ROMFS_FS =
make -C /lib/modules/3.10.17/build M=/root/software/romfs64
make[1]: Entering directory `/usr/src/linux-3.10.17'
/root/software/romfs64/Makefile:4: KERNELRELEASE = 3.10.17
/root/software/romfs64/Makefile:5: CONFIG_ROMFS_FS = m
  LD      /root/software/romfs64/built-in.o
  CC [M]  /root/software/romfs64/storage.o
  CC [M]  /root/software/romfs64/super.o
  CC [M]  /root/software/romfs64/mem.o
  LD [M]  /root/software/romfs64/romfs.o
  Building modules, stage 2.
/root/software/romfs64/Makefile:4: KERNELRELEASE = 3.10.17
/root/software/romfs64/Makefile:5: CONFIG_ROMFS_FS = m
  MODPOST 1 modules
  CC      /root/software/romfs64/romfs.mod.o
  LD [M]  /root/software/romfs64/romfs.ko
make[1]: Leaving directory `/usr/src/linux-3.10.17'
[root@hjj ~/software/romfs64]#
********************************************************************************

说明:
1. 两次读取 Makefile.
  第一次,
  KERNELRELEASE 没有定义, CONFIG_ROMFS_FS 也没有定义。
  make 定义了宏M=$(PWD). 指示处理完后回到本目录执行,(注意,M 是大写, 否则达不到预期效果)
       并进入kernel 目录执行特定的操作,source 指定的文件,读取相关变量。然后第二次source 了该makefile
  第二次:
  make 此时,KERNELRELEASE, CONFIG_ROMFS_FS 等变量已经定义,它执行上部分操作, 读走了obj-m, romfs-y 等
  其他:
  source 完两次makefile, 回到本目录继续执行,根据目标,内建规则,进行后续的编译,链接操作。

2. 根据以上描述。你可以去掉 KERNELRELEASE 宏, CONFIG_ROMFS_FS 宏等。当你明白他们的意图时。
3. module 的编译过程,可以用make V=1 看到输出,我是从编译busybox 时猜到的。




你可能感兴趣的:(linux 模块 Makefile 分析)