1.前言
本文主要就Hi3556v200的U-boot+Liteos方案的编译流程做简要介绍,主要通过make过程的打印来逐步理清编译的过程,本文主要结合编译的打印信息介绍liteos的编译流程
U-boot版本:u-boot-2016.11
2. 编译流程
# osdrv/Makefile
##########################################################################################
##task [2] make liteos
##########################################################################################
liteos:prepare
echo "------- task [2] build liteos -------"
ifneq ($(OSDRV_DIR)/platform/liteos/liteos, $(wildcard $(OSDRV_DIR)/platform/liteos/liteos))
pushd $(OSDRV_DIR)/platform/liteos;tar -xzf liteos.tgz -C .;popd
endif
if [ $(CHIP) == "hi3559v200" ];then\
./osdrv_mem_cfg.sh liteos $(CHIP);\
fi;
if [ $(CHIP) == "hi3556v200" ];then\
./osdrv_mem_cfg.sh liteos $(CHIP);\
fi;
pushd $(OSDRV_DIR)/platform/liteos/liteos;cp tools/build/config/$(CHIP)_defconfig .config;make savemenuconfig;make clean;make -j;popd
pushd $(OSDRV_DIR)/platform/liteos/liteos/sample/sample_osdrv;make;cp sample.bin $(OSDRV_DIR)/pub/liteos/sample.bin;popd
2.1 osdrv_mem_cfg.sh
首先通过osdrv_mem_cfg.sh脚本进行配置,此部分已经介绍
2.2 编译config
根据芯片类型将$(CHIP)_defconfig拷贝生成.config文件
2.3 编译lib
进入osdrv/platform/liteos/liteos目录, Makefile定义如下:
all: $(OUT) $(BUILD) $(LITEOS_LIBS_TARGET)
$(OUT): $(LITEOS_MENUCONFIG_H)
$(HIDE)mkdir -p $(OUT)/lib
$(HIDE)$(CC) -E $(LITEOSTOPDIR)/platform/bsp/board/$(LITEOS_PLATFORM)/board.ld.S -o $(LITEOSTOPDIR)/platform/bsp/board/$(LITEOS_PLATFORM)/board.ld -P
$(BUILD):
$(HIDE)mkdir -p $(BUILD)
$(LITEOS_LIBS_TARGET): $(__LIBS)
$(HIDE)for dir in $(LIB_SUBDIRS); \
do $(MAKE) -C $$dir all || exit 1; \
done
$(HIDE)echo "=============== make lib done ==============="
$(__LIBS): $(OUT) $(CXX_INCLUDE)
__LIBS = libs
通过编译$(LITEOS_LIBS_TARGET)目标,遍历每个目录下的Makefile,然后进行编译,最终将各个目录下编译出.a的静态库
关于lib编译更加详细的文档请参考:鸿蒙开发系统教程之Liteos-a编译系统分析
2.4 编译sample.bin
进入osdrv/platform/liteos/liteos/sample/sample_osdrv
SAMPLE_OUT = .
SRCS := $(wildcard *.c)
OBJS := $(patsubst %.c,$(SAMPLE_OUT)/%.o,$(SRCS))
all: $(OBJS)
$(LD) $(LITEOS_LDFLAGS) --gc-sections -Map=$(SAMPLE_OUT)/sample.map -o $(SAMPLE_OUT)/sample $(OBJS) $(LITEOS_LIBDEPS) $(LITEOS_TABLES_LDFLAGS)
$(OBJCOPY) -O binary $(SAMPLE_OUT)/sample $(SAMPLE_OUT)/sample.bin
$(OBJDUMP) -d $(SAMPLE_OUT)/sample >$(SAMPLE_OUT)/sample.asm
其中LITEOS_LIBDEP 定义如下:
#platform/liteos/liteos/config.mk
LITEOS_LIBDEP := $(LITEOS_BASELIB)
而platform/liteos/liteos/build/mk/los_config.mk文件
主要对LITEOS_BASELIB变量进行赋值,如LITEOS_BASELIB += -lgpio,这样就看到很多的库链接参数
最终打印如下:
arm-himix400-linux-ld -nostartfiles -static --gc-sections -L../../tools/scripts/ld -L../../platform/bsp/board/hi3556v200 -L../../out/hi3556v200/lib -L../../out/hi3556v200/lib/obj -L../../tools/build -L/opt/hisi-linux/x86-arm/arm-himix400-linux/lib/gcc/arm-himix400-linux/7.3.0/a7_softfp_neon-vfpv4 -L/opt/hisi-linux/x86-arm/arm-himix400-linux/arm-himix400-linux/lib/a7_softfp_neon-vfpv4 -T../../liteos.ld --gc-sections -Map=./sample.map -o ./sample ./sample.o --start-group -lgcc -lgcc_eh -lcortex-a7 -lbsp -lbase -lcpup -ldynload -lrunstop -ltickless -lcsysdeps -lc -lsec -lm -lsupc++ -lcppsupport -lstdc++ -lz -lposix -llinux -lvfs -lmulti_partition -lbch -lfat -lfsck -lbcache -lramfs -lyaffs2 -lnfs -lproc -ljffs2 -lromfs -llwip -ldriverbase -lgpio -li2c -lmem -lmmc -lmtd_common -lnand_flash -lspinor_flash -lrandom -lrtc -lspi -luart -luart -lusb_base -lusb_device -lvideo -ldisk -lshell --end-group -utask_shellcmd -ucpup_shellcmd -uhelp_shellcmd -ufree_shellcmd -usem_shellcmd -umutex_shellcmd -uqueue_shellcmd -usysteminfo_shellcmd -uswtmr_shellcmd -uhwi_shellcmd -ufindsym_shellcmd -uzbar_scan_shellcmd -udmesg_shellcmd -udate_shellcmd -ureadExcInfo_shellcmd -uwatch_shellcmd -udeadlock_shellcmd -uarp_shellcmd -utelnet_shellcmd -ucd_shellcmd -uformat_shellcmd -upartition_shellcmd -uwriteproc_shellcmd -upartinfo_shellcmd -uumount_shellcmd -umount_shellcmd -uvirstatfs_shellcmd -ulsfd_shellcmd -ufatfsck_shellcmd -uiperf_shellcmd -ulwip_dump_shellcmd -ureset_shellcmd -ustartap_shellcmd -uhimd_shellcmd -uhiddrs_shellcmd -unand_bad_shellcmd -ui2c_read_shellcmd -ussp_read_shellcmd -uuart_config_shellcmd -uusb_debug_shellcmd -uramfs_fsmap -unfs_fsmap -ufat_fsmap -uyaffs_fsmap -uromfs_fsmap -ug_fsmap -ui2c_init -ugpio_init -uregulator_init -umtd_init_list -uhispi_init -uhifmc100_init -uhisfc350_init -unand_hifmc100_init -uhifmc100_parallel_init -usd_mci_init -uhi_mci_init -upl011_init -uhinfc620_init -uhisnfc100_init -uregulator_machine_init -uhisimeidia_regulator_init -ucpufreq_init -uhisilicon_cpufreq_init -ucpufreq_machine_init -udevfreq_init -umedia_devfreq_init -udevfreq_machine_init -uhieth_machine_init -uhigmac_machine_init -ujffs_fsmap -uprocfs_fsmap -ug_fsmap_wow -ui2c_init -ugpio_init -uregulator_init -umtd_init_list -uhispi_init -uhifmc100_init -uhisfc350_init -unand_hifmc100_init -uhifmc100_parallel_init -usd_mci_init -uhi_mci_init -upl011_init -uhinfc620_init -uhisnfc100_init -uregulator_machine_init -uhisimeidia_regulator_init -ucpufreq_init -uhisilicon_cpufreq_init -ucpufreq_machine_init -udevfreq_init -umedia_devfreq_init -udevfreq_machine_init -uhieth_machine_init -uhigmac_machine_init -ug_fsmap_scatter -ui2c_init -ugpio_init -uregulator_init -umtd_init_list -uhispi_init -uhifmc100_init -uhisfc350_init -unand_hifmc100_init -uhifmc100_parallel_init -usd_mci_init -uhi_mci_init -upl011_init -uhinfc620_init -uhisnfc100_init -uregulator_machine_init -uhisimeidia_regulator_init -ucpufreq_init -uhisilicon_cpufreq_init -ucpufreq_machine_init -udevfreq_init -umedia_devfreq_init -udevfreq_machine_init -uhieth_machine_init -uhigmac_machine_init
可以看到链接sample.o与Liteos lib库,可以看到是静态链接
arm-himix400-linux-objcopy -O binary ./sample ./sample.bin
arm-himix400-linux-objdump -d ./sample >./sample.asm
生成binary文件和汇编文件