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