################################################################################
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 时猜到的。