本公众号【读芯树:duxinshu_PD】主要介绍数字集成电路物理设计相关知识,才疏学浅,如有错误,欢迎指正交流学习。 这是集成电路物理设计的第七个系列【脚本语言】的第十四篇文章,本篇文章主要介绍make相关内容: makefile <target> : <prerequisites> #目标:前置条件 [tab] <commands> #tab缩进 + 需要执行的cmd
#目标可以是一个文件名,也可以是某个操作字(phony target), .PHONY: clean clean: rm filename make clean
#只有前置文件都存在,或者前置文件修改时间比目标文件晚,则需要重新构建目标 result.file: source.file cp source.file result.file #可以设置多个前置文件,当所有的前置文件存在,则构建目标 result.file: source1.file source2.file source3.file cat source1.file source2.file source3.file > result.file
#命令表示如何更新文件,由shell命令组成,运行结果通常是生成目标文件 #命令前必须有一个tab键存在,(.RECIPERPREFIX = >)将tab键换为“>” #每行命令间没有继承关系,单独执行,可以通过在一行通过“;”分割多个命令来执行,也可以在每行结尾使用反斜杠“\”连接多行命令
makefile语法
flag='this is string' putflag: @echo 'flag is $(flag)' #调用shell变量,需要使用$ @echo $$(HOME) #变量a与变量b相关 a=${b}_postfix #四种不同的赋值运算 Var=value #在执行时扩展,允许递归扩展 Var:=value #在定义时扩展 Var?=value #只有在该变量为空时设置值 Var+=value #将值追加到变量末端



$@ #表示当前target, 如make init中'$@'表示 'init' $< #表示第一个前置条件,如target: pre1 pre2中'$<'表示“pre1” $? #表示目标更新前的所有前置条件中最新的时间戳的条件,如target: pre1 pre2中'$?'表示“pre2” (pre2时间戳更新) $^ #表示所有的前置条件,如target: pre1 pre2中'$?'表示“pre1 pre2” $* #表示匹配符%匹配的部分 $(@D)/$(@F) #分别表示$@的目录名和文件名 $(<D)/$(<F) #分别表示$<的目录名和文件名
ifeq ($(Var), value) flag:=one else flag:=two endif
ifdef variable flow1: else flow2 endif
list:=1 2 3 for i in $(list); do \ echo $i; \ done
#shell函数 files:=$(shell echo ${path}/file.txt) #subst函数 $(subst l,L, hello world!) #将hello world!替换为heLLo worLd! #patsubst函数 $patsubst %.zg, %.gz, design1.zg design2.zg #将文件design1.zg design2.zg替换为design1.gz design2.gz
03 —
make file例子
FLAG_PATH:=${PWD}/.flag .PHONY: floorplan place cts route dataout restart all floorplan:${FLAG_PATH}/floorplan place:${FLAG_PATH}/place cts:${FLAG_PATH}/cts route:${FLAG_PATH}/route dataout:${FLAG_PATH}/dataout all:floorplan place cts route dataout
${FLAGE_PATH}/floorplan: @echo 'step is floorplan' ${floorplan_cmd} touch $@ @stty echo
${FLAGE_PATH}/place:${FLAGE_PATH}/floorplan @echo 'step is place' ${place_cmd} touch $@ @stty echo
${FLAGE_PATH}/cts:${FLAGE_PATH}/place @echo 'step is cts' ${cts_cmd} touch $@ @stty echo
${FLAGE_PATH}/route:${FLAGE_PATH}/cts @echo 'step is route' ${route_cmd} touch $@ @stty echo ${FLAGE_PATH}/dataout:${FLAGE_PATH}/route @echo 'step is dataout' ${dataout_cmd} touch $@ @stty echo
${FLAGE_PATH}/:${FLAGE_PATH}/ @echo 'step is ' ${floorplan_cmd} touch $@ @stty echo restart: @rm -rf ${FLAG_PATH}/* ${FLAG_PATH}/all:${FLAG_PATH}/floorplan ${FLAG_PATH}/$place {FLAG_PATH}/cts ${FLAG_PATH}/route ${FLAG_PATH}/dataout @echo 'step is auto apr flow' touch $@ @stty echo
其他
make -t target #只是进行flag的建立,不执行相关command make -n target #只是将command打印,不执行相关command
参考文献 https://www.gnu.org/software/make/manual/make.html https://stackoverflow.com/questions/448910/what-is-the-difference-between-the-gnu-makefile-variable-assignments-a
|