Loading

MakeFile编写深入进阶

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

Makefile里有什么?

  Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

  1. 显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。

  2. 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。

  3. 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。

  4. 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。

  5.  注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“\#”。

  最后,还值得一提的是,在Makefile中的命令,必须要以[Tab]键开始。

 

技能点:

-命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事

.PHONY:   伪目标,需要make后跟指令名称才能执行

 

变量   = (替换)     TAR= test   OBJ=circle.o cube.o main.o

+= (追加)         TAR += test

:=(恒等于)      CC := gcc

使用变量时   $(变量名)   替换

$(TAR) : $(OBJ)

  $(CC)  $(OBJ)  -o $(TAR)

 

隐含规则       %.c  %.o  任意的.c或者.o     *.c  *.o  所有的.c   .o  

%.o : % .c

  $ (CC)  -o  %.c  -o  %.o

 

通配符  $^ 所有的目标文件    $@所有的依赖文件   $< 所有的依赖文件的第一个文件

$(TAR):$(OBJ)

  $(CC)  $^  -o   $@

%.o : %.c

  $(CC)  -c  $^  -o  $@

 

$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用

make 常用选项

   make [-f file] [option] [target]

  Make 默认在当前目录中寻找GNUmakefile,makefile,Makefile 的文件作为make的输入

  -f 可以指定当前文件外的Makefile文件

  -v 显示当前GNU make的版本号

  -n 只输出命令,但是不执行,一般用来测试

  -s 只执行命令,但是不显示具体命令,可以使用@抑制命令输出

  -w 显示执行前执行后的路径

  -C dir 指定makefile所在的目录

 

“ call”函数是唯一一个可以创建定制化参数函数的引用函数。使用这个函数可以实现对用户自己定义函数引用。我们可以将一个变量定义为一个复杂的表达式,用“ call”函数根据不同的参数对它进行展开来获得不同的结果。

  函数语法:$(call variable,param,param,...)
  函数功能:在执行时,将它的参数“ param”依次赋值给临时变量“ $(1)”、“ $(2)” call 函数对参数的数目没有限制,也可以没有参数值,没有参数值的“ call”没有任何实际存在的意义。执行时变量“ variable”被展开为在函数上下文有效的临时变量,变量定义中的“ $(1)”作为第一个参数,并将函数参数值中的第一个参数赋值给它;变量中的“ $(2)”一样被赋值为函数的第二个参数值;依此类推(变量$(0)代表变量“ variable”本身)。之后对变量“ variable” 表达式的计算值。
  返回值:参数值“ param”依次替换“ $(1)”、“ $(2)”…… 之后变量“ variable”定义的表达式的计算值。
  函数说明: 1. 函数中“ variable”是一个变量名,而不是变量引用。因此,通常“ call”函数中的“ variable”中不包含“ $”(当然,除非此变量名是一个计算的变量名)。 2. 当变量“ variable”是一个 make 内嵌的函数名时(如“ if”、“ foreach”、“ strip”等),对“ param”参数的使用需要注意,因为不合适或者不正确的参数将会导致函数的返回值难以预料。 3. 函数中多个“ param”之间使用逗号分割。 4. 变量“ variable”在定义时不能定义为直接展开式!只能定义为递归展开式。
  函数示例:

reverse = $(2)$(1)
foo = $(call reverse,a,b)
all:
    @echo "foo=$(foo)"

 

posted @ 2022-09-28 09:40  KairusZhang  阅读(56)  评论(0编辑  收藏  举报