我们也说说Android.mk(5) - 计算怎么办?
2023-09-14 08:57:29 时间
前面我们把Makefile做为一门语言的主要特性大致做了一个描述。但是,我们在实际的Android.mk当中还是会发现有很多事情光用Makefile的字符串替换搞不定啊,这可如何是好?
其实,这就是我们在第一讲的最开始就讲shell函数的原因,因为这要靠shell脚本来解决了。
计算怎么办?
我们也说说Android.mk(3) - 宏 传统上我们一直称这种东西为makefile中的变量,其实本质上就是一个宏,只是做的是字符串替换。我们何如就把它叫做宏呢。
lusing 刘子瑛,阿里系统框架专家。工作十余年,一直对新编程语言、新开发方法、数学与算法相关和并发等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术。
计算怎么办?
前面我们把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 刘子瑛,阿里系统框架专家。工作十余年,一直对新编程语言、新开发方法、数学与算法相关和并发等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术。
相关文章
- [Android Memory] android 警告:Exported activity does not require permission
- [Android Pro] android 混淆文件project.properties和proguard-project.txt
- C#:基于WMI查询USB设备信息 及 Android设备厂商VID列表
- Android问题-Delphi XE5 安卓手机要求
- Android开发之旅:android架构
- Android 开发之旅:短信的收发及在android模拟器之间实践(一)
- Android API之android.provider.ContactsContract.RawContacts
- Android API之android.provider.ContactsContract
- Android API之android.provider.ContactsContract.Contacts
- 80、Android Support v4、v7、v13的区别以及应用场景
- 《android开发艺术探索》读书笔记(十五)--Android性能优化
- Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制
- android studio打可执行jar包
- [Android]ListView性能优化之视图缓存
- android studio 如何导入 RecyclerView
- Android 10.0 存在中文字符,中文文件名,中文系统属性,编译报错的解决方案
- Android官方命令深入分析之Device Monitor
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )
- 【错误记录】Android Studio 编译时 lint 检查报错 ( WARNING: DSL element ‘android.dataBinding.enabled‘ is obsolet )
- 【Android Gradle 插件】build.gradle 中的 android 配置 ( 配置项 | compileSdkVersion 配置 | buildToolsVersion 配置 )
- 【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
- Android的Bitmap和BitmapDrawable类解析-android学习之旅(六十)
- Android 官方推荐 : DialogFragment 创建对话框
- Android/Linux编译开关使用
- Android培训班(87)ARM内核生成过程
- Android 8.0编译过程
- 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题
- Android - 控件android:ems属性
- 使用Android Studio build tensorflow/examples/android——直接用android studio即可
- 实验四 Android项目CriminalIntent应用开发一
- Android Things专题 1.前世今生
- Android蓝牙adb调试命令(二十二)