笔者常年在linux环境编程,经常在项目中与makefile打交道,最近总结了几个makefile的小的知识点,分享给大家。
通过阅读本文,你将了解到以下知识:
1.makefilke中的.phony的作用 2.makefile中的各种赋值运算符号(= 、:= 、+= 、?=)的区别 makefilke中的.phony的作用 先给大家一个简单的makefile,如下:
# this is a makefile for learning makefile knowledge !!!# knowledge point:# 1. what's the usage of .phony ?# 2. what's the diffirences between =, :=, ?=, and += ?test_variable = 123test_variable ?= 456test_variable += 789all: some_targets# simulate to create the lastest target file. @touch target_final_file && echo create target_final_file ... @echo make all targets done !!! @echo # @echo test_variable=$(test_variable) @echo test_variable := abcsome_targets: # simulate to create some target files. @touch target_file1 && echo create target_file1 ... @touch target_file2 && echo create target_file2 ... @touch target_file3 && echo create target_file3 ... @echo # @echo test_variable=$(test_variable) @echo clean: @echo clean builded project. @rm -rf target_file1 target_file2 target_file3 target_final_file#.phony: clean some_targets 这个makefile很简单,makefile的同级路径,输入make命令,则生成4个目标文件target_file1 target_file2 target_file3 target_final_file;执行make clean则删除这4个生成的目标文件。执行效果如下图所示:
看样子没有任何问题,那么如果在makefile同级目录有一个叫clean的文件呢?我们试下会发生什么?
从演示的效果看,make clean就报错了,为啥会 “up to date 呢?还是不是因为“clean”这个文件的存在。
原来makefile中的target默认是个“文件”,如果不使用.phony指定一个target是非文件的话,当有一个与该target同名的文件存在时,执行这个target的编译命令就会报错,如上面的例子,这个target就是clean。
由此可见,.phony的作用就是申明一个target是“伪target”,不用为生成任何文件,自然不用检查与其同名的文件。
我们测试下,加上.phony申明后的结果:
与我们预想的一样,make clean顺利执行,生成的target文件删除成功。
makefile中的各种赋值运算符号的区别 在makefile的规则写法中,变量的赋值运算,有以下几种方式:
test_variable = 123
test_variable ?= 456
test_variable += 789
test_variable := abc
我们先给出结论:
= 是延缓赋值,语句执行时,才会运算赋值,比如 variable = `ls -al` ,只有当使用到variable变量的时候,才会去执行 ls -al命令求得variable的值。
?= 是判断赋值,即当变量在此之前没有被赋值才会去执行赋值,这个可以防止变量被多次赋值,或变量被覆盖的情况。
+= 是叠加赋值,即变量在执行+=运算后,会保留之前的值,同时会新增新加入的内容,这个常用于对字符串的处理,可以等同于字符串的追加操作。
:= 是立即赋值,即变量会被立即执行,比如 variable := `ls -al` 在第一个出现这个语句的地方,就会被执行ls -la,之后都不会再执行了,而是直接使用variable的值;它与 = 的最大区别,就是一个是【立即】,一个是【延缓】;适用于不同的应用场景。
以上就是集中赋值运算的对比和区别,下面分析下开头给出的makefile实践下。
这个是因为test_variable变量最后是用:=赋值的,所有它是最后生效的。其他几种赋值的效果,留给读者去验证下吧。
如有疑问,欢迎在评论席指出。@_@
延伸阅读:
【linux + makefile】简单实用的makefile模板来了
【linux + makefile】makefile的高阶用法:解决c文件包含的头文件修改了,但c文件不重新编译的问题
【linux + makefile】十分钟教你学会makefile的force
孙正义放言:收购ARM只是开始,软银的目标是控制90%以上的芯片市场
三星超强3G手机 Vodafone版W709到货
盘点AGV机器人的多种导航方式
iOS 13.2测试版新功能引发外界对隐私泄露的担忧
AMD或寻求三星代工7nm GPU芯片 台积电7nm产能吃紧
【RT-Thread学习笔记】Makefile核心基础知识
鸿利光电LED产业基地启动
建立野外WSN基站让网络资源进行充分利用
TD-LTE性能狂增:理论下载速率可达到173Mbps
贝尔机器人编程怎么样 贝尔机器人编程中心获2020年度科技创新教育品牌
苹果正在开发一款功能强大的AR/VR头显
OpenHarmony智慧教育方案赋能项目成功入选《2023年度智慧教育优秀案例》
真我Buds Air2怎么样:内部结构简单,一体化拆解不易
2009中国上海国际跨国采购大会
MWC2018决战人工智能 联发科/苹果/三星各放奇招
【软件更新】Simplicity Studio 5.6和GSDK 4.2新版本优化蓝牙和Wi-SUN开发
物联网解决方案架构师怎样才是合格的
巴西探险队无人机拍到亚马逊边远部落
基于一个完全去中心化的非盈利性区块链智能资产项目泰坦计划介绍
E拆解:Note10+ 5G的$462.36成本都分配在哪?