Makefile求解
时间:2011-06-21
来源:互联网
C/C++ code
ldd3 scull例子对应的Makefile,求详解
尤其是DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines中DSCULL_DEBUG是怎么回事
# 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
只是定义一个宏吧,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
满意不?写了好久呢
#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
表示在程序中定义了这个宏:SCULL_DEBUG
作者: thefirstz 发布时间: 2011-06-21
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28