zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

我们也说说Android.mk(5) - 计算怎么办?

Android计算 我们 怎么办 mk
2023-09-14 08:57:29 时间
前面我们把Makefile做为一门语言的主要特性大致做了一个描述。但是,我们在实际的Android.mk当中还是会发现有很多事情光用Makefile的字符串替换搞不定啊,这可如何是好? 其实,这就是我们在第一讲的最开始就讲shell函数的原因,因为这要靠shell脚本来解决了。
计算怎么办?

前面我们把Makefile做为一门语言的主要特性大致做了一个描述,它集合了目标式的模式和函数式的模式,还有大量的宏的思想,已经可以写出相当复杂的Makefile了。
但是,很不幸的是,虽然已经很复杂了,我们在实际的Android.mk当中还是会发现有很多事情光用Makefile的字符串替换搞不定啊,这可如何是好?

其实,这就是我们在第一讲的最开始就讲shell函数的原因,因为这要靠shell脚本来解决了。

我们看个实际的例子:core.mk中判断make的版本号大于等于3.81版的脚本:

# Check for broken versions of make.

# (Allow any version under Cygwin since we dont actually build the platform there.)

ifeq (,$(findstring CYGWIN,$(shell uname -sm)))

ifneq (1,$(strip $(shell expr $(MAKE_VERSION) \ = 3.81)))

$(warning ********************************************************************************)

$(warning * You are using version $(MAKE_VERSION) of make.)

$(warning * Android can only be built by versions 3.81 and higher.)

$(warning * see https://source.android.com/source/download.html)

$(warning ********************************************************************************)

$(error stopping)

endif

endif
计算表达式的值 - expr语句

expr语句可以用来计算变量计算结果的值。

乘法:\* 求余数: %

特别注意一下乘法,要在*之前加一个\

取消变量的定义 - unset语句

在实际写Makefile的过程中,有时候需要修改环境变量。shell中提供了unset语句

不多说,直接上例子:

java_version_str := $(shell unset _JAVA_OPTIONS java -version 2 1)

javac_version_str := $(shell unset _JAVA_OPTIONS javac -version 2 1)
shell也搞不定怎么办?

shell总算是可以做些简单的计算了,但是对于规模到一定程度的需求,还是搞不定,怎么办?
在Android.mk系统中,您可以看到python,ruby纷纷被引进来了,需要用的话,别客气。完成工作是主要的,方法不重要。


我们也说说Android.mk(3) - 宏 传统上我们一直称这种东西为makefile中的变量,其实本质上就是一个宏,只是做的是字符串替换。我们何如就把它叫做宏呢。
lusing 刘子瑛,阿里系统框架专家。工作十余年,一直对新编程语言、新开发方法、数学与算法相关和并发等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术。