发信人: gdtyy (gdtyy), 信区: Embedded
标 题: 第十二讲 多目录下makefile的通用写法
发信站: 水木社区 (Mon Jun 25 23:36:58 2007), 站内
***************************************
* 第十二讲 多目录下makefile的通用写法 *
***************************************
2007/03/14 asdjf@163.com www.armecos.com
很多网友在使用《ecos增值包》时遇到了障碍,在将自己的程序项目移植到ecos平台上
时,不知道如何写makefile。因为原来的复杂项目是多目录的,不同目录实现不同的功能,
这样条理清晰,但《ecos增值包》给出的makefile是非常简单的编译脚本,远远不能满足实
际需要。现在奉献出自己的一个多目录下makefile的通用模板,以感谢网友们的鼓励。
makefile的本质是描述文件间依赖关系的脚本,但它与普通程序不同,不是按照时序运
行,而且每个人写出来的版本都不一样,似乎没有固定的模式,手工书写makefile对大部分
人来说都不轻松。为此有人设计了autoconf/automake之类的自动生成工具,大大减轻了负
担,用户只要顺次执行./configure、make、make install就可以实现发布程序的编译安装
。不过这种方法更适合于桌面系统,在嵌入式系统中,交叉编译环境在编译时是确定的,可
以不用进行自动配置探测,这就使得我们手工编写makefile通用模板成为了可能。
了解makefile的书写非常重要,不仅仅只针对ecos平台,其他如:Linux驱动编程、
U-BOOT移植、应用程序开发等,即使不需要修改makefile,最好也能看懂它。一般来说,
makefile是程序开发的难点。这里学习的编写方法,也可以用于以后其他系统的开发。
虽然makefile的书写没有一定之规,但还是能抽象总结出一些共性的东西。例如:变量
定义(宏定义、路径、编译选项)、规则描述、依赖关系、子目录位置等。我把他们分写在5
个文件里,每个文件侧重于一个方面,使得条理清晰,易于扩展修改。虽然不很全面,也不
一定非要按照这种写法书写,但确实很好用。如下:
--------------
| default.mk |
--------------
这个文件里主要描述变量定义。
MODE --- 编译模式定义。debug/release。通过此开关决定优化级数、打印语句的输出
(还可细分级别,精确控制输出)。debug时输出尽量多的调试信息,优化级别低;release时
关闭调试信息,优化级别高,运行速度快。
RELEASEFOR --- 平台优化。正常/车载/室外/实验室等。针对不同应用环境,配置编译
经过特殊优化的代码。
VER --- 版本控制。指示编译不同版本的软件。
PKG_INSTALL_DIR --- ecos库路径
交叉编译工具 --- 增加合适的前缀。as汇编器、ld链接器、c编译器、c++编译器、ar
库工具、nm符号信息、objcopy格式转换、objdump反汇编、strip剥离器等
CFLAG --- c编译标志。编译选项,宏定义,-I/-L项。
EXTRACFLAGS --- 更多c编译选项。
CXXFLAGS --- c++编译标志
EXTRACXXFLAGS --- 更多c++编译标志
LDFLAGS --- 链接标志
LIBS --- 库标志。
------------
| rules.mk |
------------
此文件主要定义宏和编译规则。
定义汇编编译、c编译、c++编译、链接、制作库、制作bin文件等命令
从.S、.c、.cxx生成.o、.out、.bin的规则和依赖关系。
---------------
| Makefile.in |
---------------
此文件描述个子目录路径。
各子目录和根目录build或clean目标文件
------------
| Makefile |
------------
引用default.mk和rules.mk,建立不同模式下的编译目录,存放临时文件和最终文件。
------------------
| 子目录Makefile |
------------------
引用default.mk和rules.mk,建立不同模式下的编译目录,存放临时文件和最终文件。
生成子目录下的目标文件和库文件。
脚本代码(见范例源码)
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.149.56.*]