我是从android7 直接跳到android11的,所以有很多配置文件不太熟悉,比如说Android.mk bp 替换了android.mk,这让我很不适应,之前mk文件中定义宏很简单
ifeq ($(strip $(TARGET_BOARD_PRODUCT_NAME)),XX) LOCAL_CFLAGS += -DXXXXXXXXX endif
但是bp文件中没有ifeq语句,所以参考了下hardware文件夹下其他模块的定义方法,例如librga、weaver等,是利用go语言实现了不同情况下宏的定义,直接上关键代码
1、在对应项目上新建Android.go文件
package XXXXX
import (
"android/soong/android"
"android/soong/cc"
"fmt"
"strings"
)
func init() {
// for DEBUG
fmt.Println("init start")
android.RegisterModuleType("AAAAA", DefaultsFactory)
}
func DefaultsFactory() (android.Module) {
module := cc.DefaultsFactory()
android.AddLoadHook(module, Defaults)
return module
}
func Defaults(ctx android.LoadHookContext) {
type props struct {
Cflags []string
}
p := &props{}
p.Cflags = globalDefaults(ctx)
ctx.AppendProperties(p)
}
func globalDefaults(ctx android.BaseContext) ([]string) {
var cppflags []string
fmt.Println("ZZZZZ:",
ctx.AConfig().Getenv("ZZZZZ"))
if strings.EqualFold(ctx.AConfig().Getenv("ZZZZZ"),"XX") {
cppflags = append(cppflags,
"-DXXXXX=1")
}else{
cppflags = append(cppflags,
"-DXXXXX=0")
}
return cppflags
}
通过ZZZZZ宏来控制XXXXX的值,注意android.RegisterModuleType("AAAAA", DefaultsFactory)
AAAAA的值在android.bp里面会引入,
2、android.bp项目中引入Android.go文件
//add by lllll
bootstrap_go_package {
name: "soong-init",
pkgPath: "android/soong/init",
deps: [
"blueprint",
"blueprint-pathtools",
"soong",
"soong-android",
"soong-cc",
"soong-genrule",
],
srcs: [
"Android.go",
],
pluginFor: ["soong_build"],
}
AAAAA{
name: "BBBBB"
}
AAAAA和Android.gp里面定义的AAAAA保持一致,AAAAA中的name属性和cc_defaults中的defaults属性名字一致,如果cc_defaults没有defaults属性那就添加下,格式如下
defaults: [ "BBBBB" ],
3、代码中用法
定义过的宏在c或cpp里面的用法很简单,就是个简单的if语句
if(XXXXX){//XXXXX代表Android.go里面定义的宏
}else{
}
以上两步骤后就添加完成,不过我编译了下发现XXXXX定义的值总是0,应该是ZZZZZ宏的值没有取到,我参考了下其他代码发现在build/make/envsetup.sh 有很多这样的定义
unset TARGET_RK_GRALLOC_VERSION export TARGET_RK_GRALLOC_VERSION=$(get_build_var TARGET_RK_GRALLOC_VERSION)
unset TARGET_BOARD_PLATFORM_EBOOK export TARGET_BOARD_PLATFORM_EBOOK=$(get_build_var BUILD_WITH_RK_EBOOK)
那也就明白了 需要把ZZZZZ的值设置到环境变量里面,才能获取到ZZZZZ的值,可以依葫芦画瓢
unset ZZZZZ export ZZZZZ=$(get_build_var ZZZZZ)
重新编译后OK,可以不同项目不同控制。
相关文章
发表评论