Makefile中的目标

部署运行你感兴趣的模型镜像

Makefile中的目标

一般目标

  • 目标就是我们需要的最终文件,也是make的最终输出  
  • Makefile的运行机制是:先将目标当成文件,查看文件是否存在,如果存在且是最新,那么直接结束,如果文件不存在,那么根据依赖和命令生成目标。

 

伪目标

  • 伪目标也是目标
  • 伪目标是一种特殊的目标,有其特殊性
  • 伪目标的特殊性:伪目标不会当成文件来判断,只是一个标签
  • 伪目标同样可以有依赖,这样make伪目标时就是先make依赖,然后运行规则
  • 作用:伪目标每次都会更新
  • 格式:.PHONY : xxx
  • 例子:
.PHONY : clean
#只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”

  

多目标

  • Makefile 的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖 于一个文件,并且其生成的命令大体类似
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 

  

相同目标

  • 多条规则目标相同,称为相同目标
  • Makefile的处理规则:如果多条规则中只有一条规则有命令,那么直接合并成一条规则,目标不变,依赖叠加;如果有多条规则有命令,那么后面的规则会覆盖前面的规则,且会爆告警
  • Makefile中的自动头文件依赖就是利用目标相同时,规则合并的技术实现
target1: dep1
target1: dep2
    cmd2

#合并后

target1: dep1 dep2
    cmd2
target1: dep1
    cmd1
target1: dep2
    cmd2

#合并后

target1: dep2
    cmd2

  

转载于:https://www.cnblogs.com/chusiyong/p/11384712.html

您可能感兴趣的与本文相关的镜像

Linly-Talker

Linly-Talker

AI应用

Linly-Talker是一款创新的数字人对话系统,它融合了最新的人工智能技术,包括大型语言模型(LLM)、自动语音识别(ASR)、文本到语音转换(TTS)和语音克隆技术

Makefile 中,目标变量(Target-Specific Variables)是一种特殊的变量作用域机制,允许为特定的目标定义局部变量,这些变量仅在与该目标相关的规则中生效。这种方式增强了 Makefile 的灵活性,使得变量可以针对不同的目标进行定制化定义,避免全局变量带来的冲突或干扰。 目标变量的语法格式如下: ```makefile target ... : variable-assignment ``` 其中,`target` 是某个具体的目标名称,`variable-assignment` 可以是递归展开变量(`=`)、简单展开变量(`:=`)或追加变量(`+=`)等形式。目标变量的作用域不仅包括该目标的先决条件(prerequisites),还包括该目标下的所有命令(recipes)。 例如,考虑如下 Makefile 片段: ```makefile all: CFLAGS += -Wall all: foo bar foo: CFLAGS = -Wextra foo: foo.c $(CC) $(CFLAGS) -o foo foo.c bar: bar.c $(CC) $(CFLAGS) -o bar bar.c ``` 在上述示例中,`all` 目标继承了全局的 `CFLAGS` 并添加了 `-Wall` 选项。而 `foo` 目标在其作用域内将 `CFLAGS` 重新定义为 `-Wextra`,这意味着 `foo` 的编译命令会使用 `-Wextra`,而 `bar` 仍使用全局的 `CFLAGS`(包括 `-Wall`)。 目标变量的一个典型应用场景是为特定目标指定不同的编译选项或依赖路径。这种机制在构建复杂项目时非常有用,尤其是在需要为不同平台或配置生成不同构建产物的情况下。 目标变量的另一个特点是它们可以与模式匹配结合使用。例如: ```makefile %.o: CFLAGS := -O2 ``` 这表示所有以 `.o` 为后缀的目标都会使用优化级别为 `-O2` 的编译选项。 需要注意的是,目标变量的作用域不会传递到子 make 调用中。如果在递归调用 make 时希望传递这些变量,需要显式地通过命令行参数或环境变量进行传递。 此外,目标变量的优先级高于全局变量,但低于命令行中传递的变量[^2]。这意味着命令行参数可以覆盖 Makefile 中定义的任何变量,包括目标变量。 ### 相关问题 1. 如何在 Makefile 中使用条件判断来控制变量的作用域? 2. Makefile 中的自动变量(如 `$@`, `$<`)如何与目标变量配合使用? 3. 如何在 Makefile 中实现变量的延迟展开和立即展开? 4. Makefile 中的目标变量是否会影响依赖关系的解析? 5. 如何调试 Makefile 中的目标变量以确保它们按预期生效?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值