打印

makefile的问题 好像都忽略了

[复制链接]
1764|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lsw9934003|  楼主 | 2009-5-30 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
armecos| | 2009-5-30 23:40 | 只看该作者

从《增值包》开始吧,

***************************************
* 第十二讲 多目录下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,建立不同模式下的编译目录,存放临时文件和最终文件。生成子目录下的目标文件和库文件。
    
    
脚本代码(见范例源码)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

34

帖子

0

粉丝