0°

2.2 规则

  1. 默认任务

    通过在命令行,进入有makefile文件的所在路径执行make,执行的任务是最顶上的一个任务。

    比如

    如果第一个规则是多个target,那么默认选择第一个。

    以下几种不能作为默认规则。

    • . (period)开头的,且不能是路径。
    • 正则匹配的方式不能作为默认。
  2. 规则

    	targets:prerequisites
    		recipes
    	targets:prerequisites;recipes
    	//可以通过\进行拼接recipes.
    	targets:prerequisites;recipes
    		recipes
    

    recipes就是一些普通的shell语句,但是同时也要注意和make的一些冲突,本质上是写在make里的shell

  3. 特殊符号$

    原本使用做变量替换的。

    • target中是$$
    • prerequisite
      • 普通的是$$
      • 二次扩张的是$$$$
    • recipe中,同prerequisite
  4. 如果一行太长,为了好看写在多行,如何拼接?

    通过\进行拼接

  5. 规则是干嘛的?

    target通过和prerequisite比对确认是否过期或者本身不存在就执行。

    target通过recipe知道该怎么更新。


  1. target

    1. 通过空格分隔的文件或文件夹名

      	a.txt b.txt:res.txt
      		/usr/bin/cp res.txt $@
      
    2. 特殊集合符号

      	*.txt : res.txt
      		/usr/bin/cp res.txt $@
      
    3. 对于.a类型的文件,即静态库

      	libpthread.a(a.o):a.o
      		ar -r libpthread.a a.o
      
  2. prerequisite

    1. 普通的依赖文件

      • 按照prerequisite的顺序进行比较最新事件
      • 在比较之前会先完成prerequisite作为target的规则。比如.exe依赖.obj.obj依赖.c,要确认.exe是否最新就需要判断.obj是否最新,.obj是否最新就要先确认.c。因此
        	a.exe: a.o
        		g++ a.o -o a.exe
        	a.o: a.c
        		cc -c a.c -o a.o
        
    2. 只关心是否存在,而不关心新旧。这些通过|分隔,添加在prerequisite末尾。

      这个和target的不关心状态类似。只关心你是否存在。常用于判断文件夹是否存在。如果不存在就创建。如下./obj文件夹

      	a.exe:./obj/a.o 
      		g++ ./obj/a.o -o a.exe
      	./obj/a.o:./src/a.c | ./obj
      		g++ ./src/a.c -o ./obj/a.o
      	./obj:
      		mkdir obj
      

      如果一个prerequisite同时出现在两种,使用前者,因为后者是前者权限的子集。即 {存在}∈{存在,最新}。

本文由【鬼上身跳不过门槛】发布于开源中国,原文链接:https://my.oschina.net/u/3695598/blog/3147106

全部评论: 0

    我有话说: