Chinaunix首页 | 论坛 | 博客
  • 博客访问: 706542
  • 博文数量: 214
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:02
文章分类

全部博文(214)

文章存档

2008年(43)

2007年(171)

我的朋友

分类:

2007-10-02 18:54:29

宏:

         赋值号

         赋值号:

                   = 将后面的字符串赋给宏

                   = 后面跟字符串常量,将常量的内容赋给宏     ??貌似不对

                   +=  宏原值加空格,加字符串,构成新宏值

         宏引用:$() ${}。宏只有一个字符,可用$宏。如$A,等同$(A)

         注意:makefile中,宏的引用必须在宏的定义之后。

         注意:宏可以嵌套。如:INDEX=1  $(DEADFILE$(INDEX)),等同$(HEADFILE1)

         注意:宏可以在make命令参数定义、makefile中定义、引自环境宏,当make命令参数定义的宏含空格是,应用“宏=值”括起来。

         注意:宏处理顺序:内定义宏——shell环境宏——makefile中定义的宏——make命令参数宏。由于后面的宏处理会覆盖前面的宏,所以优先级为:make命令参数宏——makefile宏——shell环境宏——内定义宏。所有我们可以在不改变makefile的情况下,在命令行给宏赋新值而使用新宏值。

 

内定义宏:

         普通宏,代表特殊的值:

         DIRSETSTR 路径和文件间分割符一般为‘/

         MAKEDIR  make的绝对路径

         NULL 空字符传,多用于条件表达式中比较

         OS 运行的操作系统名称

         PWD 运行make是活动工作目录绝对路径

         SHELL 运行的shell

         属性宏,用于整个makefile中目标文件属性,作用域是整个makefile文件:

         IGNORE=yes  把所有目标文件属性设置成·IGNOREyes可以用任何非空字符串代替。

         SILENT

         PRECIOUS

 

动态宏:

         S@ S%:目标文件名称。当目标是libmember)形式时,$@表示库名lib$%表示成员名member

         $> :适用与目标文件是libmember)的情形,$>代表lib$>不适用与目标是普通文件。

         $* :目标文件去掉后缀的名称。

         $^ :本规则中的依赖文件。

         $& :本规则中目标在所有规则中的所有依赖文件。  

         $< :当前规则的依赖文件列表中比目标新的依赖文件。

         $?:当前目标的所有依赖文件中比目标新的依赖文件。

         用于依赖文件列表的动态宏:

         $$@ :目标文件名。如果目标是库,表示库名。

         $$% :目标文件名。如果目标是库,表示成员名。

         $$> :去掉后缀的目标文件名。

         $$* :仅当目标文件是库的成员时使用,表示库名。

     (如果需要用到符号'$',需要$$形式)

 

修改宏:

         适用与代表文件名(或文件列表)、或者至少有着文件名形式的宏:

FILE=/home/friky/hello.o /home/h.c mf.h

         $(FILEd) 展开路径  /home/friky /home .

         $(FILEb) 展开无扩展名的文件名  hello h mf

         $(FILEf)  展开文件名  hello.o h.c mf.h

         $(FILEdb)         /home/friky/hello ……

         替换宏中字符串:

         $(宏:s/原字符串/替换字符串)      替换

         $(宏:原扩展名=新扩展名)                   仅适用与表示文件列表的宏

         $(宏:^”前缀”)

         $(宏:+”后缀”)                    如:FILE^”/usr/” +”.o”

         注:前缀、后缀的修改,make默认为宏表示文件名列表,如果宏中有空格,make会任务有多个文件名,对每个文件名都进行前缀、后缀操作。如果前缀、后缀中也有空格,就会以空格为分割,从前缀、后缀中逐个提取字符串,分别与各个文件名组合。

         如:FILE=h d  $(FILE^”1 2”)1h 1d 2h 2d

 

Make预定义的宏:

         ARAr      库管理命理                           ARFLAGS-ruv

         ASas 汇编程序                                   ASFLAGS

         CCcc  c编译器                                   CFLAGS-O

         C++CCC  c++编译器                            C++FLAGS-O

         CXXg++  c++编译器                CXXFLAGS

         CPP$(CC) –E  带标注输出的预处理程序 

         CPPFLAGS

         LDld  链接器                             LDFLAGS

         RMrm –f

         MAKEmake                                           MAKEFLAGSNULL 

         LIBSUFFIXE.a  库扩展名          A.a

MAKEMAKEFLAGS这两个宏用于makefile中嵌套make命令行,来完成程序不同模块间makefile的互相调用。即使make命令中用了-nMAKE宏也要执行。

 

内部规则:

         内部规则根据目标文件和依赖文件的扩展名定义,在正式执行make前就已经定义好了,如果makefile没有显式的定义关于某个目标文件的规则,make就会根据该目标文件的扩展名找相应的内部规则,——删掉目标文件后缀,加上预定义的依赖文件后缀,得到完整依赖文件,结合内部规则的命令行生成完整的规则。

         .h     头文件                .o      目标文件            .c       c源文件

         .C      c++源文件 .s       汇编源文件                 .f       FORTRAN源文件

         .sh     shell文件  .y       Yacc-C源语法              .l       Lex源语法

         内部规则可以是单后缀的或双后缀的。单后缀只给出目标文件后缀,无依赖文件。双后缀,第一个后缀为依赖文件扩展名,第二个后缀为目标文件后缀。如:

         .c:     

                   $(CC) $(CFLAGS) –O $@ $<

         .c .o:

                   $(CC) $(CFLAGS) –c $<

         注意:可能一个后缀名出现在多条内部规则中,如:.c.o/.f.o等。实际上,make.o寻找内部规则时,找到一个匹配规则,还要看在当前工作目录是否有与目标文件同名、且后缀为规则第一个后缀的文件,找到,应用该规则,否则,继续找内部规则。

         exanple1: main.o proc1.o proc2.o

                  gcc main.o proc1.o proc2.o -o example1

main.o: main.c mylib.h

                  gcc -c main.c

proc1.o: proc1.c mylib.h

                  gcc -c proc1.c

proc2.o: proc2.c

                  gcc -c proc2.c

         利用内部规则:可简写成:

         exanple1: main.o proc1.o proc2.o

                  gcc main.o proc1.o proc2.o -o example1

         main.o proc1.omylib.h        

    【定义依赖有两种风格:

风格1:按目标分组,如:main.omylib.h hello.h   proc1.omylib.h

风格2:按依赖文件分组,如上。

建议风格:单目标,多依赖的按目标分组】

 

修改内部规则:

1.        修改内部规则中用到的宏

2.        重写整个内部规则,最好放在makefile最前面,make处理makefile时,运行到该语句,就会用新的定义覆盖原有内部规则,在后面再用到这个规则,就会使用新的规则。

定义新的后缀和内部规则:

         定义后缀:NEW ROMAN:后缀名 后缀名

         如:SUFFIXES.n

         若定义个.o.n内部规则,但当前工作文件夹只有hello.c文件,执行make hello.n,不能正常工作,因为make一次只能检查一个内部规则。make hello.o hello.nOK了,需要一个中间过程生成hello.o.o.n规则使用。

        

         #(用%的模式规则??

         # gcc -M参数,会输出一个规则,以目标文件作为目标,以.c文件和其包含的头文件作为依赖文件。-M 加“”<> 包含的头文件,-MM只加“”包含的的头文件。

阅读(1802) | 评论(1) | 转发(0) |
0

上一篇:Makefile(一)

下一篇:Makefile(三)

给主人留下些什么吧!~~

chinaunix网友2010-01-20 11:21:14

你好,我也想学习关于makefile方面的东西,请问您有什么关于这方面的学习资料吗?我在网上找了好久,只有找打一个陈皓写的那个资料,看了后有些东西还是不太会,看了您的博客,感觉不错,您能不能推荐一些学习资料?由于我不能经常用电脑上网,如果您能麻烦一下发到我的电子邮箱623047074@qq.com,那真的不胜感激!!!!如果不方便,依然感谢!!!!!