makefile_define补充

本文深入解析Makefile中define指令的使用技巧与注意事项,探讨变量定义与指令执行的区别,特别是`cmd`与$(shellcmd)的不同行为,通过实例展示define如何在Makefile中正确应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对makefile里的define补充说明

makefile里可能会用到define来打包一些可能会重用的指令,但是因为makefile里实际上会重用代码的情况并不多…所以,define是一个没怎么设计的挺难用的东西;有一点需要注意的是在define-endef范围内的变量定义和指令的执行,在该范围内,变量定义是无效的,在define段执行时回座位字符串展开;指令的执行则是需要注意一下`cmd`和$(shell cmd)的区别,区别是`cmd`在执行到当前指令的时候不展开,而$(shell cmd)在执行到当前指令的时候是展开为指令结果的;

define output
	A=pwd#作为字符串输出
	A=`pwd`#作为字符串输出
	A=$(shell pwd)#只有这个A的值是pwd展开之后的值,但是!
	echo $(A)#这句的输出是空的,上一句A=$(shell pwd)并不是存在一个被赋值的变量A,
	#而是define在执行的时候A=是一个字符串,然后$(shell pwd)在echo语句中也被直接展开为了字符串的形式;
	echo pwd#输出是echo pwd pwd,也就是pwd不展开为shell指令
	echo `pwd`#输出是echo `pwd` a/b/c,也就是先输出指令字符串,随后切到shell执行pwd
	echo $(shell pwd)#输出是echo a/b/c a/b/c,在这句指令显示的阶段$(shell pwd)就已经展开为对应的字符串了
	
endef
all:
	$(call output) 
### 编写适用于数字IC项目的Makefile 对于数字IC设计项目而言,构建自动化工具链至关重要。通过合理编写的`Makefile`可以简化诸如仿真、综合以及形式验证等一系列流程的操作。 #### Makefile基础结构 一个典型的用于支持SystemVerilog或其他硬件描述语言源码管理的`Makefile`应该具备清晰的任务定义机制: ```makefile # 定义变量来存储各种路径和参数 TOP_MODULE = top_module_name # 设计顶层模块名称 SIM_DIR = ./sim # 仿真工作目录 SRC_DIRS = src # 源文件所在目录列表 INC_DIRS = include # 头文件包含路径 FLAGS += -Wall # 编译选项标志位集合 # 设置目标规则 all: clean compile run # 默认执行顺序:清理旧数据 -> 编译 -> 运行测试 clean: rm -rf $(SIM_DIR)/*.log $(SIM_DIR)/csrc $(SIM_DIR)/lib \ $(SIM_DIR)/transcript $(SIM_DIR)/waves.shm compile: vlogan +define+DEBUG -work work {$(foreach dir,$(SRC_DIRS),$(dir)/*)}\ || (echo "Compilation failed!" && exit 1) run: vsim -do "vsim -novopt -t ps work.$(TOP_MODULE); do wave.do; run -all" \ -l transcript.log || (echo "Simulation failed!" && exit 1) ``` 此段脚本展示了基本框架[^5],其中包含了清除先前生成的结果(`clean`)、重新编译所有必要的HDL文件(`compile`)并启动一次完整的模拟会话(`run`)三个主要阶段。 #### 集成UVM验证环境 当涉及到基于Universal Verification Methodology(UVM)的方法论时,则需进一步扩展上述模板以适应更复杂的测试平台需求。考虑到实际应用中的复杂度增加,在这里引入了更多关于如何组织代码库的信息作为补充说明[^3]。 ```makefile # UVM特定设置 TB_TOP = tb_top # 测试平台顶层实体名 TESTS = test_list.txt # 存储待测项清单文本文件的位置 UVM_HOME = /path/to/uvm # UVM库安装位置 # 更新后的编译命令考虑到了额外依赖关系 compile_uvm: vlogan +incdir+${UVM_HOME}/src ${FLAGS} +define+UVM_NO_DPI \ -y ${UVM_HOME}/src -work uvm_work ${UVM_HOME}/src/uvm_pkg.sv \ $(shell cat ${TESTS}) || (echo "Failed to compile with UVM support." && exit 1) ``` 这段增强版配置不仅涵盖了标准组件还包括了对UVM的支持,允许用户轻松切换不同的测试案例而无需手动调整每次调用的具体细节[^4]。 #### GVIM集成开发体验优化建议 为了提高工作效率,还可以利用编辑器插件来自动生成某些类型的条目或是自动补全关键字等功能。例如,在`.vimrc`中加入如下几行可显著改善针对SystemVerilog语法高亮显示效果及缩进风格等方面的表现: ```bash colorscheme desert syntax on set filetype=systemverilog au BufRead,BufNewFile *.sv set ft=systemverilog set tabstop=4 shiftwidth=4 softtabstop=0 noexpandtab ``` 这些改动使得GVIM成为了一个更适合处理大型FPGA/ASIC工程项目的专业级IDE替代品之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值