Android编译传递宏定义到lk和kernel的c文件

方式1:通过不同project配置文件传递

一般在Android的主目录,device目录下,不同board工程目录里,有“BoardConfig.mk”文件,一般会有两个宏:

LK_PROJECT := yangtutu
KERNEL_DEFCONFIG := yangtutu_defconfig

第一个“LK_PROJECT”的值,代表的是,编译lk的时候,使用lk主目录下,project目录中的“yangtutu.mk”配置文件来编译,在这个文件中,定义的“DEFINES += CONFIG_YANGTUTU”,可以把宏“CONFIG_YANGTUTU”传递给lk下面的c文件;

第二个“KERNEL_DEFCONFIG”的值,代表的是,编译kernel的时候,使用kernel主目录下,arch目录中,configs中的对应“yangtutu_defconfig”和“yangtutu_debug_defconfig”配置文件来编译,在这个配置文件中定义的“CONFIG_YANGTUTU=y”,可以把这个宏传递给kernel下的Makefile文件,在对应c文件的Makefile文件中添加“ccflags-$(CONFIG_YANGTUTU) += -DCONFIG_YANGTUTU”,就可以把宏“CONFIG_YANGTUTU”传递给kernel下的c文件。

例如,现在需要传递新的宏“CONFIG_YANGTUTU_NEW”到c文件,步骤如下:
1.在“BoardConfig.mk”文件的“LK_PROJECT”和“KERNEL_DEFCONFIG”宏之前,定义一个宏“YANGTUTU_NEW := yes”,或者在Android源码目录执行“make”的时候,带上这个参数,如:make -j10 YANGTUTU_NEW=yes ;
2.在“BoardConfig.mk”文件中“LK_PROJECT”和“KERNEL_DEFCONFIG”宏最后赋值的地方做判断,并新增project “yangtutu_new”,如下:

ifeq (yes, $(YANGTUTU_NEW))
LK_PROJECT := yangtutu_new
KERNEL_DEFCONFIG := yangtutu_new_defconfig
else
LK_PROJECT := yangtutu
KERNEL_DEFCONFIG := yangtutu_defconfig
endif

3.在lk的project目录下,新增“yangtutu_new.mk”配置文件(可以从“yangtutu.mk”直接拷贝),并在文件中添加:DEFINES += CONFIG_YANGTUTU_NEW,这下就可以在lk的c文件中使用宏“CONFIG_YANGTUTU_NEW”了;
4.在kernel的configs目录下,新增“yangtutu_new_defconfig”和“yangtutu_new_debug_defconfig”配置文件,并在文件中添加:CONFIG_YANGTUTU_NEW=y,然后在合适的“Kconfig”文件里添加:config YANGTUTU_NEW,在合适的“Makefile”文件里添加:ccflags-$(CONFIG_YANGTUTU_NEW) += -DCONFIG_YANGTUTU_NEW,就可以在对应的c文件中使用宏“CONFIG_YANGTUTU_NEW”了;

上面的方式需要新建一个project,比较适用于两个不用的project,有同一个宏,但是有不一样的值,需要区分开的时候。下面是一种不用区分project的方式,直接传递。

方式2:同一个project下,通过makefile传递

对于lk,Android编译的时候,会先调用lk主目录下的“Android.mk”文件,这个文件可以用到当前Android编译环境中的所用宏,这个文件中有如下代码:

LOCAL_PATH := $(call my-dir)

LK_DIR := $(LOCAL_PATH)
LK_MAKE_OPTION := $(if $(SHOW_COMMANDS),NOECHO=) $(if $(LK_CROSS_COMPILE),TOOLCHAIN_PREFIX=$(LK_CROSS_COMPILE)) BOOTLOADER_OUT=$(TARGET_LK_OUT) ROOTDIR=$(LK_ROOT_DIR) CONFIG_YANGTUTU=$(YANGTUTU)

$(MAKE) -C $(LK_DIR) $(LK_MAKE_OPTION) $(LK_PROJECT)

可以看到最终编译是执行“$(MAKE)”,这个会执行lk目录下的“makefile”文件;“MAKE”后面带的“LK_MAKE_OPTION”的值,会做为参数传给“makefile”文件,然后在“makefile”文件中,用“LK_MAKE_OPTION”传递的“CONFIG_YANGTUTU”做判断:

ifeq ($(CONFIG_YANGTUTU),yes)
  CFLAGS += -DCONFIG_YANGTUTU
endif

通过“CFLAGS += -DCONFIG_YANGTUTU”,可以把宏“CONFIG_YANGTUTU”传给lk的c文件;

对于kernel,也是类似的流程,在kernel根目录下,有“Android.mk”文件,同样是执行“$(MAKE)”,不过传递的是“KERNEL_MAKE_OPTION”的值,这个“KERNEL_MAKE_OPTION”在kernel根目录下的“kenv.mk”文件中:

KERNEL_MAKE_OPTION := O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) ROOTDIR=$(KERNEL_ROOT_DIR) $(if $(strip $(SHOW_COMMANDS)),V=1) CONFIG_YANGTUTU=$(YANGTUTU)

然后也是执行kernel根目录下的“Makefile”,不过需要使用“KBUILD_CFLAGS += -DCONFIG_YANGTUTU”,如下:

ifeq ($(CONFIG_YANGTUTU),yes)
  KBUILD_CFLAGS += -DCONFIG_YANGTUTU
endif

把宏“CONFIG_YANGTUTU”传给kernel的c文件。

例如,现在需要传递新的宏“CONFIG_YANGTUTU_NEW”到c文件,步骤如下:
1.在“BoardConfig.mk”文件或者其他在Android编译环境下的mk文件中,添加一个宏“YANGTUTU_NEW := yes”,或者在Android源码目录执行“make”的时候,带上这个参数,如:make -j10 YANGTUTU_NEW=yes ;
2.修改lk根目录下的“Android.mk”文件中的“LK_MAKE_OPTION”,在最后增加“CONFIG_YANGTUTU_NEW=$(YANGTUTU_NEW)”,如下:

LK_MAKE_OPTION := $(if $(SHOW_COMMANDS),NOECHO=) $(if $(LK_CROSS_COMPILE),TOOLCHAIN_PREFIX=$(LK_CROSS_COMPILE)) BOOTLOADER_OUT=$(TARGET_LK_OUT) ROOTDIR=$(LK_ROOT_DIR) CONFIG_YANGTUTU=$(YANGTUTU) CONFIG_YANGTUTU_NEW=$(YANGTUTU_NEW)

3.修改lk根目录下的“makefile”文件,在合适的位置增加如下内容:

ifeq ($(CONFIG_YANGTUTU_NEW),yes)
  CFLAGS += -DCONFIG_YANGTUTU_NEW
endif

4.修改kernel根目录下的“kenv.mk”文件中的“KERNEL_MAKE_OPTION”,在最后增加“CONFIG_YANGTUTU_NEW=$(YANGTUTU_NEW)”,如下:

KERNEL_MAKE_OPTION := O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) ROOTDIR=$(KERNEL_ROOT_DIR) $(if $(strip $(SHOW_COMMANDS)),V=1) CONFIG_YANGTUTU=$(YANGTUTU) CONFIG_YANGTUTU_NEW=$(YANGTUTU_NEW)

5.修改kernel目录下的“Makefile”文件,在合适的地方增加如下内容:

ifeq ($(CONFIG_YANGTUTU_NEW),yes)
  KBUILD_CFLAGS += -DCONFIG_YANGTUTU_NEW
endif

这种方式,可以在不用区分project的情况下,让lk和kernel的源码都能使用到这个宏!

preloader用宏来区分无法兼容的DDR的编译

两种办法:
1.像上面一样,通过“Android.mk”文件的“PRELOADER_MAKE_OPTION”传宏进去,然后在“custom_MemoryDevice.h”头文件用宏控制不同的DDR编译;
2.在 preloader/tools/emigen/emigen.mk 文件中,使用“Android.mk”传进来的宏,对“CUSTOM_MEMORY_HDR”变量做区分,如下:

ifeq ($(CONFIG_DDR_NEW),yes)
CUSTOM_MEMORY_HDR := $(MTK_PATH_CUSTOM)/inc/custom_MemoryDevice_new.h
else
CUSTOM_MEMORY_HDR := $(MTK_PATH_CUSTOM)/inc/custom_MemoryDevice.h
endif

使用不同的h文件,控制不同的DDR编译。
这种方式下,如果要在“emigen.mk”中直接使用“Android.mk”传进来的宏,需要在preloader根目录下的“Makefile”文件中增加:export CONFIG_DDR_NEW ,将宏导出!

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值