当前位置:  技术问答>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...

本帖最后由 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
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 

|
# 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

满意不?写了好久呢

|
-D 就是定义一个宏,应该你的程序里面有用到

|
DSCULL_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)。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Makefile.in,Makefile.am,Makefile.bor应该怎么用?
  • makefile.am和makefile.in是什么文件,与makefile有什么联系吗?
  • 最近在学习linux C 看到了makefile部分,觉得makefile的语法很难理解,Makefile 的语法是不是shell语法?
  • 从网上载了个C++程序的源代码,包含38个.cpp和.h,还有makefile.in和makefile.am两个文件,但无configure和makefile.请问怎么编译?谢谢!
  • 有makefile.am,有 makefine.in 为什么就是没有Makefile?
  • makefile如何调用文件目录下的makefile
  • 请教根据Makefile.am自动生成Makefile的问题
  • 怎麼樣使Makefile.in生成Makefile?
  • 【急!】一个程序里有好多文件夹里都有Makefile,如何找到最管用的makefile
  • 【makefile使用】请问怎样在shell中获取makefile的最终目标?
  • unix下面make makefile文件,提示“makefile is up-to-date",怎么办呀?
  • Makefile使用遇到的问题!"Makefile:3:missing the separator.stop"在线等待.......
  • Makefile是如何输出执行的路径的,表示执行的是那个Makefile
  • 下的tar.gz源码里只有makefile.in和makefile.am
  • 一句 makefile 的解释 -- makefile 与 shel 结合
  • linux makefile error :Makefile:335: *** commands commence before first target。
  • [test@localhost ~]$ cat <makefile >catfile 跟cat > catfile <makefile是一样的吧?
  • 关于makfile,makefile.in, makefile.am. configure之间的关系
  • win32下编译Linux 下的项目(makefile.am和makefile.in)
  • 关于makefile的问题。一个makefile如何生成两个可执行文件。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3