Makefile求解

proghua 2011-06-21 07:32:25
# 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是怎么回事
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
louyong0571 2011-06-22
  • 打赏
  • 举报
回复
-D 就是定义一个宏,应该你的程序里面有用到
开始领悟 2011-06-22
  • 打赏
  • 举报
回复
建议楼主看一下ide生成的makefile,会了解更多
yuhaicheng2011 2011-06-22
  • 打赏
  • 举报
回复
查了哈原来的笔记,-D是gcc语法里面定义的(用man gcc可以看到),就是定义一个宏,-U就是取消这个宏的定义。这里定义的这个宏的意思在于下面编了个小例子:

exam.c
#include <stdio.h>

#if defined(__MAIN_ONE__)
int main(int argc)
{
printf("int main(int argc)\n");
return 0;
}
#elif defined(__MAIN_TWO__)
int main(int argc, char **argv)
{
printf("int main(int argc, char **argv)\n");
return 0;
}
#endif

makefile如下:
#DEBUG =y

# ifeq($(DEBUG), y)
CFLAGS = -O -O2 -O3 -w -D__MAIN_ONE__ -o
# else
# CFLAGS = -O -O2 -O3 -w -o
# endif
all:
gcc -g $(CFLAGS) exam exam.c
在makefile中定义了__MAIN_ONE__这个宏,会在make的时候在exam.c里面更加定义宏的情况执行相应的操作:如这里是打出 int main(int argc)。
昵称很不好取 2011-06-21
  • 打赏
  • 举报
回复
DSCULL_DEBUG
表示在程序中定义了这个宏:SCULL_DEBUG
yuhaicheng2011 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

满意不?写了好久呢
justkk 2011-06-21
  • 打赏
  • 举报
回复
-DSCULL_DEBUG
只是定义一个宏吧,SCULL_DEBUG

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧