我是从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,可以不同项目不同控制。

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: