make的简单使用

make的目标和依赖

makefile的结构

targets : prerequisites
    command                     //注意前面必须是‘\t’制表符,而不是空格

makefile中的元素含义

目标(targets)

通常是需要生成的目标文件名

make所需执行的命令名称

依赖(prerequisities)

当前目标所依赖的其他目标或文件或文件

commad

完成目标所需要执行的命令
all : test                  //all为make的目标,test为依赖
	@echo "make all"
	
test :
	@echo "make test"

赋值符号:

简单赋值(:=):只对当前语句有效,赋值改变的值不会传递

递归赋值(=):一个地方值改变,所有与这个变量相关的值都会变

条件赋值(?=):变量未定义,赋值有效,变量没有定义,赋值无效。

追加赋值(+=):在原变量后面加上一个新的值,用空格隔开

注意:makefile变量的值都属于文本数据,makefile里面用$(变量)来表示变量的值

代码实例:

ex1

# x := foo       //定义变量x的值为foo,make里面的变量只有字符串类型
# y := $(x)b     //$(x)表示变量的值
# x := new       //运行之后的 y = foob ; x = new 

# ex2
# x = foo
# y = $(x)b
# x = new        //运行之后的 y = newb ; x = new

# ex3
# x := foo
# y := $(x)b
# x ?= new        //?=因为前面已经赋值,所以无效
//运行之后的 y = foob ; x = foo        

# ex4
# x := foo
# y := $(x)b
# x += new
//运行之后的 y = foob ; x = foo new

常用的预定义变量:

自动变量:

$@ : 当前规则中触发命令执行的目标
$^ : 当前规则中的所有依赖
$< : 当前规则中的第一条依赖

特殊变量:

$() : 括号里面大写基本上都是make自带的一些特殊变量,详细的可查make官网帮助文档

代码实例:

.PHONY : all first second third

all : first second third   
    @echo "\$$@ => $@"   #打印all
    @echo "$$^ => $^"    #打印first second third
    @echo "$$< => $<"    #打印first
    
firtst:
second:
third:



.PHONY : all out first second third test

all out :
    @echo "$(MAKE)"                #打印当前make解释器的文件名
    @echo "$(MAKECMDGOALS)"        #打印命令行中指定的目标名(make的命令行参数)
    @echo "$(MAKEFILE_LIST)"       #make所需要处理的makefile文件列表,当前make文件总是处于列表最后,文件名之间以空格分隔
    
    
first :
    @echo "first"
    
second :
    @echo "second"
    
third :
    @echo "third"
    
test :
    @$(MAKE) first
    @$(MAKE) second
    @$(MAKE) third

.PHONY : test1 test2

TDelphi := Delphi Tang
D.T.Software := D.T.
    
test1 :
    @echo "$(MAKE_VERSION)"   #当前make解释器的版本
    @echo "$(CURDIR)"         #当前make解释器的工作目录
    @echo "$(.VARIABLES)"     #所有已定义的变量(预定义变量和自定义变量)
    
test2 :
    @echo "$(RM)"

环境变量(全局变量):

makefile里面可以直接使用环境变量作为全局变量,当定义了同名变量时,环境变量将会被覆盖。可以在运行make时指定"-e"选项,优先使用环境变量。也可使用export在makefile里面定义临时环境变量

环境变量在所有makefile文件里使用,但会影响移植性。

JAVA_HOME := java home
export var := D.T.Software
new := TDelphi

test :
    @echo "JAVA_HOME => $(JAVA_HOME)"    #使用make -e运行是为环境变量
    @echo "make another file ..."
    @$(MAKE) -f makefile.2               #makefile.2的new没有输出,因为new不是全局表量
    @$(MAKE) -f makefile.2 new:=$(new)   #new输出TDelphi,运用的是命令行定义的技巧


#makefile.2

test:
    @echo "JAVA_HOME => $(JAVA_HOME)"
    @echo "var => $(var)"
    @echo "new => $(new)"

目标变量/模式变量:

只作用于指定目标和连带规则里

var := D.T.Software
new := TDelphi

test : var := test-var        //定义目标变量,在这个目标和连带的规则里都为目标变量
%e : override new := test-new

test : another               #
    @echo "test :"
    @echo "var => $(var)"
    @echo "new => $(new)"
    
another :
    @echo "another :"
    @echo "var => $(var)"
    @echo "new => $(new)"
    
rule :                           # %e : override new := test-new 起作用,%e模式是最后一个字母为e的变量
    @echo "rule :"
    @echo "var => $(var)"
    @echo "new => $(new)"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值