Makefile_Jerry(一)

来源:互联网 发布:win10家庭版优化教程 编辑:程序博客网 时间:2024/06/14 11:27

1、 abspath函数
用法:$(abspath names)
该函数主要用于将names中的各路径转换成绝对路径,并将转换后的结果返回.

2、filter函数
用法:$(filter pattern, text)
该函数用于从一个名字列表text中根据模式pattern得到满足需要的名字列表返回。

3、eval函数
用法:$(eval text)
eval函数的存在使得Makefile具有动态语言的特征。eval函数使得make将再一次解析text语句。

4、patsubst函数
用法:$(patsubst pattern, replacement, text)
该函数用于将名字列表text中符合pattern模式的名字替换为replacement,并将替换后的名字列表返回.

5、strip函数
用法:strip用于去除字符串首尾空格,并且将有多个空格(或者tab等)的相邻字符串之间缩减为一个空格。

STR =    a    b c      LOSTR = \$(strip $(STR)) 

结果是“a b c”,“strip”函数经常用在条件判断语句的表达式中,确保表达式比较的可靠和健壮!

6、addsuffix 函数
功能:加后缀函数,用于把后缀加到函数中的每个单词后面,返回加过后缀的文件名序列。
示例:$(addsuffix .c,test)返回值是“test.c”。

7、addprefix 函数
功能:加前缀函数,用于把前缀加到函数中的每个单词前面,返回加过前缀的文件名序列。
示例:$(addprefix home/,jerry)返回值是“home/jerry”。

8、VPATH
功能:指定搜索目录
示例:VPATH = src:../headers
上面示例定义指定的两个目录,“src”和“../headers”,make会按照这个顺序进行搜索。目录由“冒号”分隔。(当前目录永远是最高优先搜索的地方)

9、@echo和echo的区别
功能:都是在终端下打印相关信息,@echo可以不打印关于echo这一行的信息。
示例:Makefile中的@echo会打印以下内容,而echo只打印第二行。

echo a b c a b c 

10、.PHONY
用法:

all:    mkdir hellos.PHONY:all

功能:如果你的target名和文件名重复,make命令在执行时会不知道到底target指向什么,所以为了避免冲突,一般情况下makefile中的target都会用,PHONY来指明target就在makefile中。

11、=、:=、?=、+=的区别

  • = 是最基本的赋值,make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。(会覆盖);
  • := 是覆盖之前的值(变量的值取决于它在makefile中的位置);
  • ?=是如果没有被赋值过就赋予等号后面的值;
  • +=是添加等号后面的值。

12、ifeq,ifneq,ifdef和ifndef

  • 使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。

13、“$”使用

  • 可以用$来调用变量
  • 使用真实的“$”字符,那么你需要用“$$”来表示。

15、命令前的“-”,以include为例

  • 使用“include FILENAMES…”,make程序处理时,如果“FILENAMES”列表中的任何一个文件不能正常读取而且不存在一个创建此文件的规则时make程序将会提示错误并退出。
  • 使用“-include FILENAMES…”的情况是,当所包含的文件不存在或者不存在一个规则去创建它,make程序会继续执行,只有真正由于不能正确完成终极目标的重建时(某些必需的目标无法在当前已读取的makefile文件内容中找到正确的重建规则),才会提示致命错误并退出。

16、tab键的空位

  • 在Makefile中的命令,必须要以[Tab]键开始,所以target后面的命令必须是一个tab键的空位。

17、编译&链接

  • 一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,linux下是 .o
    文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object
    File合成执行文件,这个动作叫作链接(link)。

18、include filename

  • filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)
  • 在include前面可以有一些空字符,但是绝不能是[Tab]键开始。

19、find和grep

  • 查找文件(或文件夹)名字:find <路径名> -name “正则表达式” -print
  • 查找文件内容:grep “正则表达式” * -r,-r表示递归查找

20、Makefile文件名

  • 一般情况下,可以使用makefile和Makefile这两种文件名来写makefile;
  • 你还可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“–file”参数,如:make -f Make.Linux或make –file Make.AIX。

21、“du”和“df ”

  • du 统计文件大小

  • df 统计数据块使用情况

  • 参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。

  • 如果当前目录下文件和文件夹很多,使用不带参数du的命令,可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的,所以得指定深入目录的层数,参数:–max-depth=,这是个极为有用的参数!

22、mkdir -p

  • 如果要创建目录A并创建目录A的子目录B,没有用-p的情况下是mkdir 2次

  • 如果用-p 可以直接创建2个目录 mkdir -p 目录A/子目录B就可以。

23、cp 的参数
参数:

  • -a :相当于 -pdr 的意思(参数pdr分别为:保留权限,复制软链接本身,递归复制);

  • -p :连同档案的属性一起复制过去,而非使用预设属性;

  • -d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;

  • -f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;

  • -i :若目的档(destination)已经存在时,在覆盖时会先询问是否真的动作!

  • -l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;

  • -r :递归持续复制,用于目录的复制行为;

  • -s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;

  • -u :若 destination 比 source 旧才更新 destination。

24、$@、$^、 $< 、 $?、 $%、$+、$*

  • $@ 表示目标文件

  • $^ 表示所有的依赖文件

  • $< 表示第一个依赖文件

  • $? 表示比目标还要新的依赖文件列表

  • $% 仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是“foo.a(bar.o)”,那么,“$%”就是“bar.o”,“$@”就是“foo.a”。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。

  • $+ 这个变量很像“$^”,也是所有依赖目标的集合。只是它不去除重复的依赖目标。

  • $* 这个变量表示目标模式中“%”及其之前的部分。如果目标是“dir/a.foo.b”,并且目标的模式是“a.%.b”,那么,“$*”的值就是“dir/a.foo”。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么“$*”也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么“$*”就是除了后缀的那一部分。例如:如果目标是“foo.c”,因为“.c”是make所能识别的后缀名,所以,“$*”的值就是“foo”。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用“$*“,除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么“$ * ”就是空值。

25、make参数

  • “-n”或“–just-print”,只是显示命令,但不会执行命令,这个功能很有利于我们调试我们的Makefile,看看我们书写的命令是执行起来是什么样子的或是什么顺序的。

  • “-s”或“–slient”是全面禁止命令的显示。一个全局的办法是,给make加上“-i”或是“–ignore-errors”参数,那么,Makefile中所有命令都会忽略错误。而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。

  • “-k”或是“–keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。


本文无意侵权,只是学习中遇到这些记录下来,如有侵权请联系我,谢谢!^_^


原创粉丝点击