通过可执行脚本快速生成用于VCS编译的自定义Makefile

 

写这个脚本的目的: 不用每次用cp复制Makefile文件了, 不用每次打开Makefile修改对应的design, testbench文件地址了,不用每次修改Makefile中对应testbench的模块名了。全部使用一个命令自动完成。

首先让我们通过三步在Linux中新建一个全局可执行脚本(redhat系统,对应ubuntu在设置环境变量部分命令会有区别,可以通过Google查询相关命令)

  • 第一步:当然是要有一个已经写好的脚本jerry_makefile,这里以复制主目录下的Makefile文件到当前目录下为例。
#!/bin/sh
cp ~/Makefile .
  • 第二步:修改脚本为可执行文件 chmod u+x jerry_makefile
  • 第三步:将脚本所在文件夹地址加入.cshrc文件中 echo 'setenv PATH $PATH\:/home/jerry/scripts' >> ~/.cshrc

注意这里的/home/jerry/scripts需要改成你的脚本所在目录,可以在脚本目录下输入pwd查看当前目录,并对应填入进去。

接下来让我们使用sed, echo, ls等命令自动获取目录下testbench以及design的文件名,并将其传递到Makefile中。具体步骤如下:

  • Makefile里面有两个地方需要根据文件不同进行修改的,第一个部分是TOP对应的参数,第二个部分是DFILES对应的参数。
  • 首先让我们来解决TOP的问题,给TOP的参数是testbench的文件名,但是没有后面的.v后缀(注意testbench的文件名去掉.v后须与其Module名字一致)。我们可以很轻松的通过ls|grep *tb.v获取到testbench的文件名,那么接下来比较棘手的问题来了,我们怎么截取.v前面对应的一部分字符串呢?这里可以使用cut命令,echo "$tbName" | cut -d"." -f1 testbenchName, -d"."表示以.为截断点将字符串分为左右两段字符,而-f1表示直接获取第一段字符串。这样我们就成功的获取到了testbench的模块名。

    注意如果传递给cut的如果是文件,其会对文件进行操作,而不是对文件名进行操作,这里使用echo + 字符串的形式,确定给cut的是字符串而不是文件。

  • 接下来让我们解决DFILES对应的部分,给DFILES传递的参数分别为design的名字以及testbench的名字,这里我们可以通过ls|grep *tb.v直接获取到testbench的名字,但是对于.v的design则需要将design的名字里面加入特定的字节使其方便使用正则匹配获取。这里我将design文件名字后面统一加上_d这样通过ls|grep *d.v就可以直接获取到design的文件名了。
  • 最后我们需要将TOP对应的参数,以及DFILE对应的参数传递到Makefile文件中,这里我们可以使用sed命令对文档进行操作sed -i "1iTOP=$(TOP)"; sed -i "2iDFILE=$(DFILE)",其将TOP以及DFILE分别加到文档的一二行.
  • 到这里就完全完成了,最后在终端使用jerry_makefile命令就可以直接生成自定义的makefile文件了。

最后呈上参考脚本:

#!/bin/sh

cp ~/Makefile .
tbName=$(ls|grep *tb.v)
TOP=$(echo "$tbName" | cut -d". l -f1")

sed -i "1iTOP=$TOP" Makefile

DFILE1=$(ls|grep *d.v)
DFILE1=$(ls|grep *tb.v)

sed -i "2iDFILES=$DFILE1 $DFILE2" Makefile

本文原创,错误之处在所难免!若能评论指出将不盛感激!