make 工具如 GNU make、System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同。不同的make工具的makefile 的结构大部分相同,在很多编译过程中,makefile 自己完全是由其他软件生成的;如autoconf/automake 程序就用来开发编译程序。有时可能会要求我们直接编写 makefile( 其实是改写)。目前我工作平台是Linux,我的基本需求是能够读懂GUN Makefile,并且能够根据自己的设计的需求改写Makefile。什么是make? Linux 自带的文档解释的非常清楚:
The purpose of the make utility is to determine automatically which pieces of a large program need to be recompiled, and issue the commands to recompile them. In fact, make is not limited to programs. You can use it to describe any task where some files must be updated automatically from others whenever the others change.
1 Makefile 里有什么?
Makefile里主要包含了五个东西:显示规则、隐晦规则、变量定义、文件指示和注释。在Makefile中的命令,必须要以[Tab] 键开始。
2 make的工作方式
GUN的make 工作时执行步骤如下:
(1) 读入所有的Makefile;
(2) 读入被include 的其他Makefile;
(3) 初始化文件中的变量;
(4) 推导隐晦规则,并分析所有规则;
(5) 为所有的目标文件创建依赖关系链;
(6) 根据依赖关系,决定哪些目标要重新生成;
(7) 执行生成命令。
3 Makefile的规则
Makefile的规则包含两个部分,一个是依赖关系,一个是生成目标的方法。在Makefile中规则的顺序是很重要的,Makefile中只有一个最终目标,一般第一条规则中的目标将被确立为最终目标。
依赖性规则的格式
target: dependencies
instructions
4 通用生成目标
通用生成目标应该表示什么,以及它们该如何命名已经有了一组良好的约定。遵从这些会让自己的makefile 更容易理解和使用。
all
生成工程中所有可以执行者。它通常是第一个生成目标,因此它往往是开发者不带参数键入make就能执行的那一个。
test
运行程序的自动测试套件。
clean
删除make all 时产生的所有文件。
dist
dist是distribution的缩写,制作源文件档案,它可以作为在另一台机器上重新编译的单元。
install
在系统目录中安装项目工程的可执行文件和文档,以让普通用户访问。
uninstall
删除由make install 安装在系统目录中的所有文件。
问题:
1 在开发ASIC过程都可以用Makefile 和shell脚本自动化完成任务,二者有什么区别?
2 make 工具适合于EDA工具吗?比如VCS仿真和Vivado综合?
参考文献:
[1] 陈皓. 跟我一起写Makefile.
[2] 徐海兵. GUN make中文手册.
[3] 调试 make. http://www.ibm.com/developerworks/cn/linux/l-debugmake.html
[4] Eric. Raymond. UNIX编程艺术. 电子工业出版社. 2013,6.