本公众号【读芯树:duxinshu_PD】主要介绍数字集成电路物理设计相关知识,才疏学浅,如有错误,欢迎指正交流学习。
这是集成电路物理设计的第七个系列【脚本语言】的第十四篇文章,本篇文章主要介绍make相关内容:
01
—
makefile
makefile文件由一系列规则(rules)构成,每条规则的语法
<target> : <prerequisites> #目标:前置条件
[tab] <commands> #tab缩进 + 需要执行的cmd
目标target
#目标可以是一个文件名,也可以是某个操作字(phony target),
.PHONY: clean
clean:
rm filename
make clean
前置条件prerequisites
#只有前置文件都存在,或者前置文件修改时间比目标文件晚,则需要重新构建目标
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
命令commands
#命令表示如何更新文件,由shell命令组成,运行结果通常是生成目标文件
#命令前必须有一个tab键存在,(.RECIPERPREFIX = >)将tab键换为“>”
#每行命令间没有继承关系,单独执行,可以通过在一行通过“;”分割多个命令来执行,也可以在每行结尾使用反斜杠“\”连接多行命令
02
—
makefile语法
“#”表示注释行
echo回声:make一般会打印每行命令再执行,如果命令前加入“@”符号,则不会打印命令。
makefile可以使用通配符,通配符与bash一致。
变量赋值
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 #将值追加到变量末端
Automatic Variables
$@ #表示当前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
04
—
其他
make -t target #只是进行flag的建立,不执行相关command
make -n target #只是将command打印,不执行相关command
05
—
参考文献
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
联系客服