[ Android 编译 ] Android.bp 根据条件添加宏定义
尊重原创,转载请注明出处!
创作不易,如有帮助请点赞支持~
参考:
Android.bp文件详解
Android.bp入门指南之浅析Android.bp语法
Android.bp正确姿势添加宏控制编译指南
Android.bp 添加宏开关
之前对 Android.bp 一直了解不多,也就是停留在大概能看懂,可以简单改改的阶段。最近遇到了一个问题,需要根据编译参数去添加宏定义,一下子就傻眼了。
如果不需要添加控制逻辑,只是单纯地添加宏定义,直接在 Android.bp 对应模块的 cflags / cppflags
中添加 "-DXXX"
即可。
但是如果需要添加控制逻辑,由于 bp 文件跟 mk 文件不同,它是纯粹的配置,没有分支等流程控制,所以只能通过编写 Go 语言实现。
之前没接触过 go 语言,但是编程语言都是相通的,百度一下相关的文章,根据自己的实际情况进行修改,磕磕绊绊地也算是完成了这个需求,这里记录一下实现的整个流程。
编写 go 脚本文件
首先添加 bionic/linker/linker_controller.go
文件,编写控制逻辑:
package linker_controller
import (
"android/soong/android"
"android/soong/cc"
// 如果需要打印调试日志,这个需要导包。如果不需要打印则无需导包,否则编译会报错导入未使用的包
"fmt"
)
func init() {
// 在 go 的入口函数中,将linkerDefaultsFactory注册到"linker_controller"的moduleType中
android.RegisterModuleType("linker_controller", linkerDefaultsFactory)
}
func linkerDefaultsFactory() (android.Module) {
module := cc.DefaultsFactory()
// 添加装载时的hook函数
android.AddLoadHook(module, linkerDefaultsDefaults)
return module
}
func linkerDefaultsDefaults(ctx android.LoadHookContext) {
type props struct {
Cflags []string
}
p := &props{}
// 获取需要定义的宏,添加到cflags中
p.Cflags = cflagsDefaults(ctx)
ctx.AppendProperties(p)
}
// 这里加入控制逻辑,当符合条件时添加相应的-DXXX参数
func cflagsDefaults(ctx android.BaseContext) ([]string) {
var cppflags []string
// 打印调试日志
fmt.Println("DEBUG === BUILD_TYPE:", ctx.AConfig().Getenv("BUILD_TYPE"))
// 当环境变量BUILD_TYPE为custom时,添加CUSTOM_LINKER的宏定义
if ctx.AConfig().Getenv("BUILD_TYPE") == "custom" {
cppflags = append(cppflags, "-DCUSTOM_LINKER")
}
return cppflags
}
Android.bp 引入 go 脚本文件
添加了 go 脚本文件后,还需要把它配置到 Android.bp 中,才能生效,需要对 bionic/linker/Android.bp
做一点改动:
// 引入go脚本,添加编译go脚本所需的依赖
bootstrap_go_package {
// 模块名为soong-[go文件名]
name: "soong-linker_controller",
// go文件包名路径
pkgPath: "android/soong/linker_controller",
deps: [
"blueprint",
"blueprint-pathtools",
"soong",
"soong-android",
"soong-cc",
"soong-genrule",
],
// go脚本文件
srcs: [
"linker_controller.go",
],
pluginFor: ["soong_build"],
}
// 自定义模块类型,即在go脚本中注册的moduleType
linker_controller {
// 模块名称
name: "linker_controller_defaults",
}
cc_binary {
// 在defaults中添加引用上面添加的module
defaults: ["linux_bionic_supported", "linker_defaults", "linker_controller_defaults"],
srcs: [ ":linker_sources" ],
...
}
在代码中添加对宏的判断
#ifdef CUSTOM_LINKER
// do something
DL_WARN("DEBUG === CUSTOM_LINKER has defined!");
#endif
结尾
本篇博客只是简单地添加了通过环境变量来控制宏的逻辑。显然,可以通过 go 脚本控制 Android.bp 的逻辑还有很多,想要掌握并不是一时半会儿的事,以后有机会使用到更多的控制逻辑的时候,再做进一步的学习和记录吧。