makefile笔记(1)

来源:互联网 发布:如何注销淘宝达人账号 编辑:程序博客网 时间:2024/06/11 05:54
  •  一些简写用到的隐晦规则

     makefile通过目标文件和依赖文件的关系可以自己推导出整个工程的依赖关系,也可以通过目标文件和其依赖文件之间的命令,比如,有一个text.o ,那么 text.c 就会被认为是 text.o 的依赖文件,并且 cc -c text.c 也会被推导出来,所以在写makefile时可以简化的写为:

objects = main.o kbd.o command.o display.o \   insert.o search.o files.o utils.o   edit : $(objects)   cc -o edit $(objects)   main.o : defs.h   kbd.o : defs.h command.h   command.o : defs.h command.h   display.o : defs.h buffer.h   insert.o : defs.h buffer.h   search.o : defs.h buffer.h   files.o : defs.h buffer.h command.h   utils.o : defs.h   .PHONY : clean   clean :   rm edit $(objects) 

  
  上面有很多的头文件被重复用到,显然这是可以简化的:
  

……#变量定义 最终目标文件$(objects) : defs.hdbd.o command.o files.o : command.hdisplay.o insert.o search.o files.o : buffer.h……#清理

  这属于make的隐晦规则。 可以节省时间,但表达上遍没有全部写出来那么清晰,各有利弊。
  良好的习惯是编译后清除目标文件。有利于重编译和文件清洁。一般风格可以写为:
  clean :
  rm edit $(objects)
  比较好的做法是:
  .PHONY : clean
  clean :
  -rm edit $(objects)

.PHONY 表示clean是一个伪目标,rm前面的减号表示:可能某些文件会出问题,但是不用管,继续做完后面的事。

  •  引用其他makefile
     使用include关键字可以把别的makefile包含进来,和c语言的#include差不多,被包含的文件会原模原样的放在当前文件的包含位置。include (filename) 参数和shell中的路径差不多,include前面可以有空格,但是不能有Tab键。include中也可以用通配符和变量。
     make开始时,会找include中包含的其他makefile,并将其安放在当前的地方,就像C/C++中的include一样,如果指定了路径便会在指定的路径下寻找,若没指定的话,有两种地方去找:
     1、若make 带有 -I 或 –include-dir 参数,便会在这个参数下指定的目录去找。
     2、若有(prefix)/includde(一般是:/usr/local/bin 或 /usr/include ),make会去这个路径找,当有文件没找到的话,make会产生一跳warning,但不会马上出先error,会继续载入其他文件,如果完成了makefile的读取,还是没找到便会产生error。如果想让make不理没找到的文件,可以在include前加一个减号 “-”。
     Makefile也有环境变量(MAKEFILE),如果定义了这个环境变量,make会把这个变量中的值做一个类似于include的动作,和include不同的是从这个环境变量中引入的makefile的“目标”不会起作用,它定义的文件发现错误也不会理。
     这个环境变量不是很有必要,不建议定义。
原创粉丝点击