• uboot-makefile总览


    VERSION = 1

    PATCHLEVEL = 3
    SUBLEVEL = 4
    EXTRAVERSION =
    U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

    uboot的版本号定义

    VERSION_FILE = $(obj)include/version_autogenerated.h

    这个obj定义在后面,文件是编译的时候自动生成的。

    生成的内容大致为#define U_BOOT_VERSION "U-Boot 1.3.4"

    HOSTARCH := $(shell uname -m |
    sed -e s/i.86/i386/
    -e s/sun4u/sparc64/
    -e s/arm.*/arm/
    -e s/sa110/arm/
    -e s/powerpc/ppc/
    -e s/ppc64/ppc/
    -e s/macppc/ppc/)

    HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' |
    sed -e 's/(cygwin).*/cygwin/')

    export HOSTARCH HOSTOS

    $(shell xxx)这个变量指用shell去执行xxx命令。|是管道,把前面的输出作为后面的输入。uname -m会得到当前计算机的cpu的版本号信息,如i686,i786之类的。sed -e s/i.86/i386/用正则表达式替换,如果存在i+任意字符+86就替换成i386,后面的同理。HOSTARCH就是编译环境(主机)的计算机的架构。

    HOSTOS就是主机的操作系统,得出来的是小写。

    # Allow for silent builds
    ifeq (,$(findstring s,$(MAKEFLAGS)))
    XECHO = echo
    else
    XECHO = :
    endif

    这段时静默编译,编译不输出

    ifdef O
    ifeq ("$(origin O)", "command line")
    BUILD_DIR := $(O)
    endif
    endif

    ifneq ($(BUILD_DIR),)
    saved-output := $(BUILD_DIR)

    # Attempt to create a output directory.
    $(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

    # Verify if it was successful.
    BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
    $(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
    endif # ifneq ($(BUILD_DIR),)

    OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
    SRCTREE := $(CURDIR)
    TOPDIR := $(SRCTREE)
    LNDIR := $(OBJTREE)
    export TOPDIR SRCTREE OBJTREE

    MKCONFIG := $(SRCTREE)/mkconfig
    export MKCONFIG

    ifneq ($(OBJTREE),$(SRCTREE))
    REMOTE_BUILD := 1
    export REMOTE_BUILD
    endif

    # $(obj) and (src) are defined in config.mk but here in main Makefile
    # we also need them before config.mk is included which is the case for
    # some targets like unconfig, clean, clobber, distclean, etc.
    ifneq ($(OBJTREE),$(SRCTREE))
    obj := $(OBJTREE)/
    src := $(SRCTREE)/
    else
    obj :=
    src :=
    endif
    export obj src

    # Make sure CDPATH settings don't interfere
    unexport CDPATH

    定义输出目录 make O=输出目录

    OBJTREE编译出的.O文件存放目录

    SRCTREE源代码存放的目录

    MKCONFIG 源码根目录下的config,是个脚本,后面会用到

    ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
    #到处make config时间段的config文件的变量作为环境变量
    # load ARCH, BOARD, and CPU configuration
    include $(obj)include/config.mk
    export ARCH CPU BOARD VENDOR SOC
    #CROSS_COMPILE定义交叉工具链的前缀
    ifndef CROSS_COMPILE
    ifeq ($(HOSTARCH),$(ARCH))
    CROSS_COMPILE =
    else
    ifeq ($(ARCH),ppc)
    CROSS_COMPILE = ppc_8xx-
    endif
    ifeq ($(ARCH),arm)
    #CROSS_COMPILE = arm-linux-
    #CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
    #CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
    CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
    endif
    ifeq ($(ARCH),i386)
    CROSS_COMPILE = i386-linux-
    endif
    ifeq ($(ARCH),mips)
    CROSS_COMPILE = mips_4KC-
    endif
    ifeq ($(ARCH),nios)
    CROSS_COMPILE = nios-elf-
    endif
    ifeq ($(ARCH),nios2)
    CROSS_COMPILE = nios2-elf-
    endif
    ifeq ($(ARCH),m68k)
    CROSS_COMPILE = m68k-elf-
    endif
    ifeq ($(ARCH),microblaze)
    CROSS_COMPILE = mb-
    endif
    ifeq ($(ARCH),blackfin)
    CROSS_COMPILE = bfin-uclinux-
    endif
    ifeq ($(ARCH),avr32)
    CROSS_COMPILE = avr32-linux-
    endif
    ifeq ($(ARCH),sh)
    CROSS_COMPILE = sh4-linux-
    endif
    ifeq ($(ARCH),sparc)
    CROSS_COMPILE = sparc-elf-
    endif # sparc
    endif # HOSTARCH,ARCH
    endif # CROSS_COMPILE

    export CROSS_COMPILE

    定义交叉工具链的前缀

    # load other configuration
    include $(TOPDIR)/config.mk

    这个文件定义了很多变量,各个开发板的可移植就靠这个

     它定义了很多cpu架构的专有config  定义了交叉工具链  以及autoconfig的CONFIG_xxxxx的配置过程中生成的宏,指导uboot编译过程。原材料是include/configs/xxx.h  里面都是宏定义,方便移植。移植的很多工作都是对这个进行配置,board/sansung/x210下还生成了一个config.mk,定义了TEXT_BASE=0xc3e00000,指定链接地址(还取决于uboot中做的虚拟地址映射)。

    OBJS = cpu/$(CPU)/start.o
    ifeq ($(CPU),i386)
    OBJS += cpu/$(CPU)/start16.o
    OBJS += cpu/$(CPU)/reset.o
    endif
    ifeq ($(CPU),ppc4xx)
    OBJS += cpu/$(CPU)/resetvec.o
    endif
    ifeq ($(CPU),mpc85xx)
    OBJS += cpu/$(CPU)/resetvec.o
    endif

    OBJS := $(addprefix $(obj),$(OBJS))

    LIBS = lib_generic/libgeneric.a
    LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo
    "board/$(VENDOR)/common/lib$(VENDOR).a"; fi)
    LIBS += cpu/$(CPU)/lib$(CPU).a
    ifdef SOC
    LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
    endif
    ifeq ($(CPU),ixp)
    LIBS += cpu/ixp/npe/libnpe.a
    endif
    LIBS += lib_$(ARCH)/lib$(ARCH).a
    LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a
    fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
    LIBS += net/libnet.a
    LIBS += disk/libdisk.a
    LIBS += drivers/bios_emulator/libatibiosemu.a
    LIBS += drivers/block/libblock.a
    LIBS += drivers/dma/libdma.a
    LIBS += drivers/hwmon/libhwmon.a
    LIBS += drivers/i2c/libi2c.a
    LIBS += drivers/input/libinput.a
    LIBS += drivers/misc/libmisc.a
    LIBS += drivers/mmc/libmmc.a
    LIBS += drivers/mtd/libmtd.a
    LIBS += drivers/mtd/nand/libnand.a
    LIBS += drivers/mtd/nand_legacy/libnand_legacy.a
    LIBS += drivers/mtd/onenand/libonenand.a
    LIBS += drivers/mtd/ubi/libubi.a
    LIBS += drivers/mtd/spi/libspi_flash.a
    LIBS += drivers/net/libnet.a
    LIBS += drivers/net/sk98lin/libsk98lin.a
    LIBS += drivers/pci/libpci.a
    LIBS += drivers/pcmcia/libpcmcia.a
    LIBS += drivers/spi/libspi.a
    ifeq ($(CPU),mpc83xx)
    LIBS += drivers/qe/qe.a
    endif
    ifeq ($(CPU),mpc85xx)
    LIBS += drivers/qe/qe.a
    endif
    LIBS += drivers/rtc/librtc.a
    LIBS += drivers/serial/libserial.a
    LIBS += drivers/usb/libusb.a
    LIBS += drivers/video/libvideo.a
    LIBS += common/libcommon.a
    LIBS += libfdt/libfdt.a
    LIBS += api/libapi.a
    LIBS += post/libpost.a

    LIBS := $(addprefix $(obj),$(LIBS))
    .PHONY : $(LIBS) $(VERSION_FILE)

    LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a
    LIBBOARD := $(addprefix $(obj),$(LIBBOARD))

    OBJS定义了所有要编译的文件的集合        LIBS定义了库

    ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.dis
    ifeq ($(ARCH),blackfin)
    ALL += $(obj)u-boot.ldr
    endif

    all: $(ALL)

    make的目标就是all  下面的代码还有小目标,就不详写。

    包含了生成的可执行文件

  • 相关阅读:
    命令创建.net core3.0 web应用详解(超详细教程)
    安装Visual Studio Code并汉化
    Visual Studio2019及.NET CORE3.0的安装教程
    序列化对象设置字段首字母小写(驼峰命名法)
    解决锁定图层后不能淡显的问题
    C#中的委托和事件
    C#常用方法——委托和事件详解
    C#常用方法——List<T>泛型列表解析
    C#常用方法——strng.Format()和$用法详解
    C#常用方法——通过WebServices接口读取json字符并解析示例
  • 原文地址:https://www.cnblogs.com/Garin/p/8597744.html
Copyright © 2020-2023  润新知