+ -
当前位置:首页 → 问答吧 → Makefile求解

Makefile求解

时间:2011-06-21

来源:互联网

C/C++ code
# Comment/uncomment the following line to disable/enable debugging
#DEBUG = y


# Add your debugging flag (or not) to CFLAGS
ifeq ($(DEBUG),y)
  DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
else
  DEBFLAGS = -O2
endif

EXTRA_CFLAGS += $(DEBFLAGS)
EXTRA_CFLAGS += -I$(LDDINC)

ifneq ($(KERNELRELEASE),)
# call from kernel build system

scull-objs := main.o pipe.o access.o

obj-m    := scull.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules

endif



clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

depend .depend dep:
    $(CC) $(EXTRA_CFLAGS) -M *.c > .depend


ifeq (.depend,$(wildcard .depend))
include .depend
endif


ldd3 scull例子对应的Makefile,求详解
尤其是DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines中DSCULL_DEBUG是怎么回事

作者: proghua   发布时间: 2011-06-21

-DSCULL_DEBUG 
只是定义一个宏吧,SCULL_DEBUG

作者: justkk   发布时间: 2011-06-21

# Comment/uncomment the following line to disable/enable debugging
#DEBUG = y
# Add your debugging flag (or not) to CFLAGS
这三句话只有第二句话有用,如果说第二行没有被屏掉,那不就定义了这个变量,那么就进入下面语句:
ifeq ($(DEBUG),y)
  DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
else
  DEBFLAGS = -O2 02是编译时的优化参数级别。
endif
这个有点像条件预编译,如果debug被定义了=y,那么就定义debflags这个变量。这儿“=”表示递归等号,如果后面还有变量还得替换,如后面dscull_debug这个也是个变量也要看他定义的啥子

EXTRA_CFLAGS += $(DEBFLAGS)
EXTRA_CFLAGS += -I$(LDDINC)
和c中的+=功能类似,这里extra_cflags没有定义,开始为空,执行者两句后,=$(DEBFLAGS)-I$(LDDINC)这里的-I就是表示gcc里面的-i,代表include后面这个变量,后面这个变量代表什么,后面解释

ifneq ($(KERNELRELEASE),)这儿逗号后面是不是少了点啥子?也是判断这个变量有没有被定义
# call from kernel build system
下面 “:=”和前面的“=”对应,不同的是在定义变量的时候不是递归的了,:=的是什么就是代表什么。
scull-objs := main.o pipe.o access.o---定义变量,后面用$符号应用了这个变量就代表三个.o文件。

obj-m := scull.o---scull.c或者.s文件要作为模块来编译,编译成.o文件后并连接进内核。
else(如果前面变量别定义=什么了)

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
uname –r这个shell命令来擦内核的版本号,把这个路径给了这个变量。
PWD := $(shell pwd)
定义了pwd这个变量,表示,在中断用shell命令pwd的结果给这个变量,意识就是把当前文件的路径给PWD这个变量。
modules:
  $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
这里lddinc这个变量出来了,就是代表当前路径下include/modules这个文件加。这个命令,把路径下的文件编译成了一个模块。
endif



clean:
  rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
这句话你来删除所有的.o和.ko和.c和依赖,临时文件。主要在于更新makefile的时间戳,使用命令make clean来完成。
depend .depend dep:
$(CC) $(EXTRA_CFLAGS) -M *.c > .depend
用gcc(变量CC,makefile里面默认的,你该知道)把所有的依赖源文件编译成目标文件 depend .depend dep
ifeq (.depend,$(wildcard .depend))
include .depend 如果没有.depend就把他包含进去
endif

满意不?写了好久呢

作者: yuhaicheng2011   发布时间: 2011-06-21

DSCULL_DEBUG
表示在程序中定义了这个宏:SCULL_DEBUG

作者: thefirstz   发布时间: 2011-06-21