Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
gcc -c $<
==================================================================================================
它的使用方法有三种:
1、vpath <pattern> <directories>
为符合模式<pattern>的文件指定搜索目录<directories>。
2、vpath <pattern>
清除符合模式<pattern>的文件的搜索目录。
3、vpath
清除所有已被设置好了的文件搜索目录。
vapth使用方法中的<pattern>需要包含“%”字符。“%”的意思是匹配零或若干字符,例如,“%.h”表示所有以“.h”结尾的文件。<pattern>指定了要搜索的文件集,而<directories>则指定了<pattern>的文件集的搜索的目录。例如:
vpath %.h ../headers
该语句表示,要求make在“../headers”目录下搜索所有以“.h”结尾的文件。(如果某文件在当前目录没有找到的话)
========================================================================================
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
上述规则等价于:
bigoutput : text.g
generate text.g -big > bigoutput
littleoutput : text.g
generate text.g -little > littleoutput
========================================================================================
origin
函数的作用是告诉你变量是哪里来的,其出生状况如何,他并不改变变量。
函数语法:
$(origin <variable>)
<variable> 为变量的名字,而不是引用,所以一般没有"$"字符在前。
origin 函数通过返回值来告诉你 <variable> 的出生情况。下面用实例说明:
- 当从来未定义过该变量时,origin 函数返回 "undefined" 。
如下面的 Makefile 代码:
all:
@echo $(origin V)
运行输出:
$ make
undefined
- 如果该变量为环境变量,那么返回 "enviroment" 。
如下面的 Makefile 代码:
all:
@echo $(origin USER)
运行输出:
$ make
environment
其中 USER 这个变量为系统定义的当前用户,使用 env 命令可以看到。
- 如果变量是个默认定义,那么返回 "default"。
如下面的 Makefile 代码:
all:
@echo $(origin CC)
运行输出:
$ make
default
- 如果一个变量被定义在 Makefile 文件中,那么返回 "file" 。
如下面的 Makefile 代码:
V := 1
all:
@echo $(origin V)
运行输出:
$ make
file
- 如果变量来自命令行,那么返回 "command line" 。
如下面的 Makefile 代码:
all:
@echo $(origin MyVar)