分享

脚本语言介绍——make(1)

 mzsm 2022-06-22 发布于湖北

本公众号【读芯树:duxinshu_PD】主要介绍数字集成电路物理设计相关知识,才疏学浅,如有错误,欢迎指正交流学习。

是集成电路物理设计的第七个系列【脚本语言】的第十四篇文章,本篇文章主要介绍make相关内容

01

makefile

  • makefile文件由一系列规则(rules)构成,每条规则的语法

<target> : <prerequisites> #目标:前置条件[tab] <commands>                 #tab缩进 + 需要执行的cmd
  • 目标target

#目标可以是一个文件名,也可以是某个操作字(phony target),.PHONY: cleanclean:   rm filenamemake 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:=oneelse flag:=twoendif
ifdef variable flow1:else flow2endif
list:=1 2 3for 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 allfloorplan:${FLAG_PATH}/floorplanplace:${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的建立,不执行相关commandmake -n target     #只是将command打印,不执行相关command

05


参考文献

https://www.gnu.org/software/make/manual/make.htmlhttps://stackoverflow.com/questions/448910/what-is-the-difference-between-the-gnu-makefile-variable-assignments-a

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多