You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU Make 4.1语法问题求助:条件语句报错及文档查询

GNU Make 4.1 问题解决指南

一、GNU Make 4.1 官方文档获取方式

  • 终端直接执行 info make 命令,即可查看对应版本的完整官方文档,这是最便捷的本地查看方式
  • 可前往GNU官方版本归档区,下载对应版本的HTML或PDF格式离线文档

二、设置type_num变量报错的解决办法

报错 /bin/sh: 1: type_num: not found,根源在于两点:

  1. Make变量与Shell变量混淆:TEST 中的 ${type_num} 是Make层面的变量,Make解析Makefile时就会展开它;而你在shell命令里设置的是Shell变量,两者不属于同一作用域。
  2. 命令行的Shell进程隔离:Makefile中每行命令默认是独立的Shell进程执行,第一行if语句里设置的type_num,到下一行执行vsim时,该变量已随前一个Shell进程结束而失效。

两种可行解决方案:

方案一:用Make条件语句设置变量(推荐)

直接在Make层面根据type的值设置type_num,确保TEST中的变量在解析阶段就能正确展开:

type = "rnd"        # 默认执行rnd测试,可切换为snr测试

ifeq ($(type), "snr")
type_num = 1
else
type_num = 0
endif

TEST = \
    -g TEST_TYPE=${type_num} \
    -L demoduli \
    -L ${DEF_LIB} \
    -sv_seed ${CONFIG_SV_SEED} \
    ${DEF_LIB}.tb_qi_qu_qa \
    +UVM_VERBOSITY=UVM_NONE \
    +UVM_TESTNAME=tb_qi_qu_qa_${type}_test \
    -do "waves/wave.do" \
    -do "run -all" \
    -do "quit"

base_run_sim:
    vsim -64 -c -voptargs="+acc" \
    ${TEST}

方案二:将命令合并到同一Shell进程

若要在Shell层面设置变量,需把if语句和vsim命令放在同一个Shell进程中执行,用分号或反斜杠连接,同时转义TEST中的变量让Shell解析:

type = "rnd"        # 默认执行rnd测试,可切换为snr测试

TEST = \
    -g TEST_TYPE=$$type_num \  # 用$$转义,让Shell处理该变量
    -L demoduli \
    -L ${DEF_LIB} \
    -sv_seed ${CONFIG_SV_SEED} \
    ${DEF_LIB}.tb_qi_qu_qa \
    +UVM_VERBOSITY=UVM_NONE \
    +UVM_TESTNAME=tb_qi_qu_qa_${type}_test \
    -do "waves/wave.do" \
    -do "run -all" \
    -do "quit"

base_run_sim:
    type_num=0; if [ ${type} = "snr" ]; then type_num=1; fi; \
    vsim -64 -c -voptargs="+acc" \
    ${TEST}

这里$$type_num会被Make转译为$type_num,由Shell解析;所有命令用反斜杠连接,确保在同一个Shell进程内执行,变量即可正常传递。

内容的提问来源于stack exchange,提问作者Vladimir Korshunov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:52:45