当前位置: 技术问答>linux和unix
Makefile求解
来源: 互联网 发布时间:2016-12-09
本文导语: 本帖最后由 proghua 于 2011-06-21 19:36:35 编辑 # 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 e...
# 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是怎么回事
|
-DSCULL_DEBUG
只是定义一个宏吧,SCULL_DEBUG
只是定义一个宏吧,SCULL_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 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
满意不?写了好久呢
|
-D 就是定义一个宏,应该你的程序里面有用到
|
DSCULL_DEBUG
表示在程序中定义了这个宏:SCULL_DEBUG
表示在程序中定义了这个宏:SCULL_DEBUG
|
查了哈原来的笔记,-D是gcc语法里面定义的(用man gcc可以看到),就是定义一个宏,-U就是取消这个宏的定义。这里定义的这个宏的意思在于下面编了个小例子:
exam.c
#include
#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)。
exam.c
#include
#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)。