makefile中采用echo进行调试

news/2025/3/6 12:52:01/

在 Makefile 中使用 echo 输出变量是调试变量值的常用方法。以下是具体用法及注意事项:


一、基础用法:在规则中输出变量
makefile
定义变量
VAR = Hello World

在规则中使用 echo 输出变量
print_var:
@echo “调试 VAR的值是: $(VAR)”

  • 执行命令:
    bash
    make print_var
    输出: 调试 VAR的值是: Hello World
  • 关键点:
    • @ 符号:禁止 Make 打印命令本身(如 echo ...),仅显示结果。
    • $(VAR):必须使用 $()${} 包裹变量名,否则会被识别为 Shell 变量(通常为空)。

二、调试变量展开时机
Makefile 变量有两种展开方式,可能影响输出结果:

  1. 立即展开变量(:=
    变量在定义时立即展开:
    makefile
    IMMEDIATE_VAR := $(shell date)
    print_immediate:
    @echo “立即展开变量: $(IMMEDIATE_VAR)”
  • 输出:变量值在定义时已固定(如 Tue Jun 1 12:00:00 UTC 2024)。
  1. 延迟展开变量(=
    变量在使用时展开:
    makefile
    LAZY_VAR = $(shell date)
    print_lazy:
    @echo “延迟展开变量: $(LAZY_VAR)”
  • 输出:变量值每次调用时更新(如 Tue Jun 1 12:05:00 UTC 2024)。

三、高级调试技巧

  1. 使用 $(info) 函数
    在 Makefile 解析阶段 直接输出变量(无需执行目标):
    makefile
    DEBUG_VAR = This is a debug message
    $(info INFO DEBUG_VAR的值是: $(DEBUG_VAR))
  • 运行效果:执行任意目标时都会先输出此信息。
  1. 多行变量输出
    处理含换行符的变量时,用 printf 替代 echo
    makefile
    MULTILINE_VAR = Line1\nLine2
    print_multiline:
    @printf “多行变量:\n$(MULTILINE_VAR)\n”

  2. 调试命令行覆盖变量
    在命令行中覆盖变量并输出:
    makefile
    print_cmd_var:
    @echo “命令行传入的变量: $(OVERRIDE_VAR)”

  • 执行命令:
    bash
    make print_cmd_var OVERRIDE_VAR=“Custom Value”
    输出: 命令行传入的变量: Custom Value

四、常见错误及解决

  1. 变量名未正确包裹
    错误示例:
    makefile
    错误!$VAR 会被识别为 Shell 变量(通常为空)
    print_error:
    @echo “变量值: $VAR”
    修正方法:
    makefile
    print_fixed:
    @echo “变量值: $(VAR)”

  2. 变量含特殊字符
    若变量值含空格或特殊符号,需加引号:
    makefile
    SPECIAL_VAR = “Value with spaces”
    print_special:
    @echo “特殊变量: $(SPECIAL_VAR)”


五、完整示例
makefile
定义变量
IMMEDIATE_VAR := $(shell date)
LAZY_VAR = $(shell date)

解析阶段直接输出
$(info INFO Makefile 开始解析…)

调试目标
print_vars:
@echo “— 调试输出 —”
@echo “立即展开变量: $(IMMEDIATE_VAR)”
@echo “延迟展开变量: $(LAZY_VAR)”
@printf “多行示例:\nLine1\nLine2\n”

默认目标
all: print_vars

输出:
bash
INFO Makefile 开始解析…
make all
— 调试输出 —
立即展开变量: Tue Jun 1 12:00:00 UTC 2024
延迟展开变量: Tue Jun 1 12:05:00 UTC 2024
多行示例:
Line1
Line2


通过合理使用 echo$(info) 和变量展开规则,可以高效定位 Makefile 中的变量问题。


http://www.ppmy.cn/news/1577068.html

相关文章

spring boot项目Linux环境jar包启动shell脚本

spring boot jar启动shell脚本示例 使用场景shell脚本文件示例可能遇见的问题1. 无权限使用chomd命令为文件添加权限 2. Shell脚本的行尾格式不兼容通过 Vim 修改文件格式 使用场景 在linux环境,启动小型spring boot项目时,我们总需要一些操作步骤才能将…

软考架构师笔记-进程管理

1.4 进程管理 进程状态:运行、等待、就绪。阻塞不能直接到运行状态,需要到就绪状态排队。五态图等。进程管理:前驱图临界资源:共享的资源,如打印机等临界区:访问临界资源的那段代码称为临界区信号量&#…

代码托管平台对比分析:Gitee与GitLab

文章目录 代码托管平台对比分析:Gitee与GitLab平台概述GiteeGitLab 功能对比代码托管与版本控制CI/CD 集成项目管理用户体验自托管与云托管安全性价格与成本 功能对比表格优势与劣势Gitee 优势Gitee 劣势GitLab 优势GitLab 劣势 实际使用场景Gitee 适用场景GitLab 适…

AI-Ollama本地大语言模型运行框架与Ollama javascript接入

1.Ollama Ollama 是一个开源的大型语言模型(LLM)平台,旨在让用户能够轻松地在本地运行、管理和与大型语言模型进行交互。 Ollama 提供了一个简单的方式来加载和使用各种预训练的语言模型,支持文本生成、翻译、代码编写、问答等多种…

SpringMvc与Struts2

一、Spring MVC 1.1 概述 Spring MVC 是 Spring 框架的一部分,是一个基于 MVC 设计模式的轻量级 Web 框架。它提供了灵活的配置和强大的扩展能力,适合构建复杂的 Web 应用程序。 1.2 特点 轻量级:与 Spring 框架无缝集成,依赖…

valgrind 检测多线程 bug,检测 并发 bug concurrent bug parallel bug

valgrind --toolhelgrind ./your_program 如果检测的对象是大型程序,可以设定仅在某些函数中开启 valgrind 的检测: Valgrind 提供了一些客户请求(client requests),可以在代码中插入特定的宏来控制 Valgrind 的行为。…

Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(一)

本文介绍 GPU 围栏同步对象,该对象可用于 GPU 硬件计划阶段 2 中真正的 GPU 到 GPU 同步。 从 Windows 11 版本 24H2 (WDDM 3.2) 开始支持此功能。 图形驱动程序开发人员应熟悉 WDDM 2.0 和 GPU 硬件计划阶段 1。 WDDM 2.x 的受监视围栏同步对象 WDDM 2.x 的受监视…

2025最新Transformer模型及深度学习前沿技术应用

第一章、注意力(Attention)机制 1、注意力机制的背景和动机(为什么需要注意力机制?注意力机制的起源和发展里程碑)。 2、注意力机制的基本原理(什么是注意力机制?注意力机制的数学表达与基本公…