第十二讲 多目录下makefile的通用写法zz

来源:互联网 发布:新手如何做淘宝客服 编辑:程序博客网 时间:2024/04/30 01:27

发信人: 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.*]
 

原创粉丝点击