IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android编译传递宏定义到lk和kernel的c文件 -> 正文阅读

[移动开发]Android编译传递宏定义到lk和kernel的c文件

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 ,将宏导出!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:03:47  更:2021-07-17 12:04:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 15:06:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码