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,根源在于两点:
- Make变量与Shell变量混淆:
TEST中的${type_num}是Make层面的变量,Make解析Makefile时就会展开它;而你在shell命令里设置的是Shell变量,两者不属于同一作用域。 - 命令行的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
相关产品推荐
相关产品推荐

