当前位置: 首页 > article >正文

【make】makefile变量全解

目录

  • makefile简介
  • 变量全解
    • 变量基础
    • 变量高级使用
      • 1. 将变量里的值进行替换后输出
      • 2. 使用变量的嵌套使用
      • 3. `$` 可以组合使用
    • override 指示符
    • 目标指定变量
    • 模式变量
  • 总结
  • 参考链接

在这里插入图片描述

makefile简介

  makefile 是一种类似shell的脚本文件,需要make工具进行解释 makefile 内的语句,然后执行内部语句。Makefile的作用是去管理工程项目,比如一个项目有很多c文件,需要利用Makefile去统一进行编译或者其他操作。[1]

变量全解

  变量是makefile中非常重要的组成部分,下面是变量的使用全解。

变量基础

使用 $() 来获取变量,太简单了,略。

变量高级使用

1. 将变量里的值进行替换后输出

src = a.c b.c d.c e.so
# 下面的例子是将src 的末尾含 .c 的替换为 .o
obj = $(src:.c=.o)

all:
    @echo $(obj)
#输出
a.o b.o d.o e.so

2. 使用变量的嵌套使用

$ 符号可以嵌套获取值

av = bv
bv = cv
cv = embed
all:
    @echo $($($(av)))

#输出
embed

3. $ 可以组合使用

first = Donald
last = Trump
Donald_Trump = "I'M BACK!"

all:
    @echo $($(first)_$(last))                        

#输出       
I'M BACK!


#甚至 $ 符号可以作为左值
Donald_$(last) = "I'M BACK!"


#甚至 $ 符号 可以代表函数内的值
src= a b d c z y w o
res = $(sort $(src))
all:
    @echo $(res)
#输出
a b c d o w y z

override 指示符

这个指示符的作用是给make 命令添加的参数进行修改

#执行命令  make a=10 b="time.c show.c" fun="@echo 20" all
override a=100

override b+= fun.c
#override 还可以重新定义命令包
override define fun
    @echo 200
endef

all:
    @echo $(a)
    @echo $(b)
    $(fun)

#输出
100
time.c show.c fun.c        
200


#如果写成下面的样子,那么不仅会输出命令,还会执行命令,上面的写法只会执行命令,而不会输出命令
override define fun
    echo 200
endef
#输出
100
time.c show.c fun.c
echo 200
200

目标指定变量

这个变量可以理解成,因为某个目标而改变的依赖所具有的变量。相当于局部变量,这个局部变量只用于这些依赖。

CFLAG=-g

play: CFLAG=-c
play: main.o a.o b.o
    gcc $^ -o $@

main.o:main.c
    gcc $(CFLAG) $^ -o $@

a.o:a.c
    gcc $(CFLAG) $^ -o $@

b.o:b.c
    gcc $(CFLAG) $^ -o $@

.PHONY:clean
clean:
    -rm *.o play             
#执行 make play
#输出
gcc -c main.c -o main.o
gcc -c a.c -o a.o
gcc -c b.c -o b.o
gcc main.o a.o b.o -o play            
#执行 make b.o
#输出
gcc -MM b.c -o b.o

上面案例可以看出,全局的 CFLAG 并没有作用在局部。

模式变量

这个模式变量和上面的类似,只不过目标变成了模式,也就是说这一模式的目标都使用这个局部变量代替全局变量。

CFLAG=-MM
%.i: CFLAG=-E
b.i:b.c 
    gcc $(CFLAG) $^ -o $@
%.s: CFLAG=-S
b.s:b.i
    gcc $(CFLAG) $^ -o $@
%.o: CFLAG=-c
b.o:b.s
    gcc $(CFLAG) $^ -o $@

a.d:a.c
    gcc $(CFLAG) $^ -o $@  
#执行 make b.o
#输出
gcc -E b.c -o b.i
gcc -S b.i -o b.s
gcc -c b.s -o b.o   
#执行 make a.d
#输出
gcc -MM a.c -o a.d

上面案例中的模式必须使用到 % ,用法和上面的类似。

总结

暂时只有以上使用总结,其他使用可参考帮助文档。

参考链接

gnu make 帮助手册
百度百科— make
在这里插入图片描述


http://www.kler.cn/a/525164.html

相关文章:

  • Flutter使用Flavor实现切换环境和多渠道打包
  • 98.1 AI量化开发:长文本AI金融智能体(Qwen-Long)对金融研报大批量处理与智能分析的实战应用
  • 【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(一)
  • 从替代到覆盖:暴雨信创服务器打开市场新局面
  • decison tree 决策树
  • 算法12(力扣739)-每日温度
  • DeepSeek-R1 本地部署模型流程
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》032-组件的Teleport功能
  • 练习(复习)
  • Nginx 安装配置指南
  • ESP32-S3模组上跑通esp32-camera(37)
  • 什么是波士顿矩阵,怎么制作?AI工具一键生成战略分析图!
  • Java基础知识-第13章-Java多线程编程基础
  • 【BQ3568HM开发板】智能家居中控屏界面设计:打造便捷的家居控制体验
  • 阿里云 - RocketMQ入门
  • 蓝桥杯嵌入式uart,iic,adc_scan模版
  • js基础(黑马程序员)
  • 【Redis】List 类型的介绍和常用命令
  • AI时代:行动者胜,被动者汰
  • Hive:日志,hql运行方式,Array,行列转换
  • UE学习日志#14 GAS--ASC源码简要分析10 GC相关
  • 设计模式的艺术-策略模式
  • concurrent.futures.Future对象详解:利用线程池与进程池实现异步操作
  • 蓝桥杯python语言基础(5)——函数
  • python-leetcode-从前序与中序遍历序列构造二叉树
  • 新年学习计算机名校课程