通用makefile是如何炼成的(II)
来源:互联网 发布:鼠标测试软件 编辑:程序博客网 时间:2024/06/05 15:02
上一次我们完成了圈地运动,顺利拍下一块叫做build的地块。今天,我们就要在上面立个牌坊
一般情况下,我们总会在makefile中加入一些产品信息。比如产品名称,版本号,以及产品的特性开关(宏),等等
直接在main.mk中添加相应的内容
# main.mk#RM:=rm -f## 定义产品信息PRODUCT_VENDOR:=common-mkPRODUCTCXX:=g++_VERSION:=1.0## 定义产品功能的开关OPTIONS:=-DENABLE_TALKING=1 -DPRODUCT_INFO=\"$(PRODUCT_VENDOR)-$(PRODUCT_VERSION)\"CXXFLAGS:=-Wall $(OPTIONS)...
为了有所显示,我们在修改一下hello.cpp, 将产品信息打印出来
/* * hello.cpp */#include "hello.h"#include <stdio.h>void sayhello() {printf("Hello World!\n");printf("product info: %s\n", PRODUCT_INFO);#if ENABLE_TALKING==1printf("product feature:%s\n", "Talking is enabled");#elseprintf("product feature:%s\n", "Talking is disabled");#endif}
现在编译之后,输出的内容就不是简单的hello world了,而是
Hello World!
product info: common-mk-1.0
product feature:Talking is enabled
牌坊是简单的立上了,不过不够漂亮。因为至少还存在下面一个不足:
1. 修改产品信息是必须直接修改main.mk. 而main.mk是很重要的,万一哪个傻敷敷的一不小心把其他内容也修改了,怎么办呢?
2. 如果有多个产品,那么每次编译A产品时必须将makefile改成A的产品信息,编译B产品时又要改成B的产品信息,不停地改,累都累死了
一言概之,就是要将产品信息从主makefile中解耦合出来。办法也是很简单的,继续圈地。将产品信息集中到products目录下,main.mk中直接include product.mk就可以将所需要的产品信息导入进来了。
# main.mk#RM:=rm -f## 定义产品信息include build/products/product.mkCXX:=g++CXXFLAGS:=-Wall $(OPTIONS)
# vendor.mk## 定义产品信息PRODUCT_VENDOR:=common-mkPRODUCT_VERSION:=1.0
# features.mk## 定义产品功能的开关OPTIONS:=-DENABLE_TALKING=1 -DPRODUCT_INFO=\"$(PRODUCT_VENDOR)-$(PRODUCT_VERSION)\"
很不错了,无论如何修改产品信息,反正都不用直接修改main.mk了。(products修改的一小步,是通用型makefile的一大步啊,后面很多东西都是基于这个思想来的)
今天的工作基本可以收工了,在最后在留个鱼钩,build-specs.mk。只要愿意,可以通过定义变量PRODUCT_SPECS, 将该变量中指定的makefile加载进来,从而提供一种额外定制化产品信息的能力。
你可能会觉得奇怪,有必要吗?直接修改features.mk, vendor.mk不就好了吗。嗯,是的,就目前工程,不是必须的,但以后面对未来的多模块编译,就会用得着了。这一个修改,稍微有点未雨绸缪了(不要怪我思想太超前了)
# main.mkRM:=rm -f## 定义产品信息。这里BUILD_SPECS设置为空,表示我们不做额外定制化PRODUCT_SPECS :=build/spec.mkinclude build/products/product.mk
# product.mk## vendor,version等产品信息定义在vendor.mkinclude build/products/vendor.mk## 各种特性开关定义在features.mkinclude build/products/features.mk## 加载额外定制的产品配置mkinclude build/products/product-specs.mk
# product-specs.mk## 逐个加载PRODUCT_SPECS指定的mk文。提供一种可定制化产品信息的方法$(foreach specfile, $(PRODUCT_SPECS), $(eval -include $(specfile)))
至此,我们成功地实现了在makefile中添加产品信息,以及如何将产品信息与主makefile解耦
今天的工作到此为止。
- 通用makefile是如何炼成的(II)
- 通用makefile是如何炼成的(III)
- 通用makefile是如何炼成的(IV)
- 通用makefile是如何炼成的(V)
- 通用makefile是如何炼成的(VI)
- 通用makefile是如何炼成的(VII)
- 通用makefile是如何炼成的(VIII)
- 通用makefile是如何炼成的(I)
- 通用makefile是如何炼成的(XI)--最后的完结篇,envsetup.sh
- 通用makefile是如何炼成的(Ⅸ)整体框架
- 通用makefile是如何炼成的(X)—— 导入单元测试
- vmlinux是如何炼成的--kernel makefile
- vmlinux是如何炼成的--kernel makefile
- makefile 必知必会以及Makefile是怎样炼成的
- 一个简单RPC框架是如何炼成的(II)——制定RPC消息
- 好口才是如何炼成的!
- DBA是如何炼成的
- 一个APK是如何炼成的
- 黑马程序员——String
- 生成so文件
- Map接口下的集合
- 《Effective C++》学习笔记条款17 以独立语句将newed对象置入智能指针
- List接口下的集合
- 通用makefile是如何炼成的(II)
- android修改显示语言简单实现
- vim 乱码问题
- 继承HibernateDaoSupport时遇到的问题
- 关于汇编跳转指令的说明
- Understanding fast float/integer conversions
- Android四种存储方式 sharedpreference,file,SQlite,contentprovider实现增删改查
- 图的操作 code
- 枚举计算机上存在的时区