00、通識(shí)
版本號(hào)
VERSION = 2016 //主版本號(hào)
PATCHLEVEL = 03 //補(bǔ)丁版本號(hào)
SUBLEVEL = //次版本號(hào)
EXTRAVERSION = //附加版本信息
NAME = //名字有關(guān)的,一般不使用這兩個(gè)
MAKEFLAGS 變量
export VARIABLE //導(dǎo)出變量給子 make
unexport VARIABLE //不導(dǎo)出變量給子 make
MAKEFLAGS += -rR --include-dir=$(CURDIR)
MAKEFLAGS /SHELL 值始終自動(dòng)的傳遞給子make 除非使用“unexport”聲明
-rR : 表示禁止使用內(nèi)置的隱含規(guī)則和變量定義
--include-dir : 指明搜索路徑
$(CURDIR): 表示當(dāng)前目錄
編譯選項(xiàng)
V=1 來(lái)實(shí)現(xiàn)完整的命令輸出
O=out 指定輸出目錄
C = 1 使能代碼檢查
M=dir 單獨(dú)編譯某個(gè)模塊
HOSTARCH 主機(jī)架構(gòu)
HOSTOS 系統(tǒng)
ARCH 架構(gòu) //ARCH = arm
CROSS_COMPILE 交叉編譯工具 //arm-linux-gnueabihf- (只到 “ - ”)
CC = $(CROSS_COMPILE)gcc //CC 為編譯gcc的簡(jiǎn)短語(yǔ)法
常用變量
ARCH = arm
CPU = armv7
BOARD = mx6ullevk
VENDOR = freescale
SOC = mx6
CPUDIR = arch/arm/cpu/armv7
BOARDDIR = freescale/mx6ullevk
ARCH、CPU、BOARD、VENDOR、SOC、CPUDIR、BOARDDIR 等變量定義在 config.mk 文件:
config.mk:
ARCH := $(CONFIG_SYS_ARCH:'%'=%)
CPU := $(CONFIG_SYS_CPU:'%'=%) //'%'=% 取雙引號(hào)里面的值
.....
= 是最基本的賦值
:= 是覆蓋之前的值
?= 是如果沒(méi)有被賦值過(guò)就賦予等號(hào)后面的值
+= 是添加等號(hào)后面的值
01、清除過(guò)程
make distclean 或者 make mrproper
會(huì)調(diào)用頂層的Makefile的 distclean 規(guī)則。
02、配置工程,生成.config配置文件
make xxx_defconfig
會(huì)調(diào)用頂層的Makefile的 %config 規(guī)則。
%config 規(guī)則: %通配符,當(dāng)輸入“make xxx_defconfig”的時(shí)候就會(huì)匹配到%config 目標(biāo):
%config: scripts_basic outputmakefile FORCE
第一步:依賴(lài)部分
目標(biāo) %config 依賴(lài)于 scripts_basic、outputmakefile、FORCE
1、FORCE目標(biāo):
FORCE 在頂層 Makefile的 1610 行有如下定義:
PHONY += FORCE
FORCE:
FORCE 是沒(méi)有規(guī)則和依賴(lài)的,所以每次都會(huì)重新生成 FORCE。當(dāng) FORCE 作為其他目標(biāo)的依賴(lài)時(shí),由于 FORCE 總是被更新過(guò)的,因此依賴(lài)所在的規(guī)則總是會(huì)執(zhí)行的。即將FORCE當(dāng)做依賴(lài)時(shí),對(duì)應(yīng)的目標(biāo)規(guī)則總是會(huì)被執(zhí)行。
2、scripts_basic目標(biāo):
目標(biāo)不依賴(lài)其它目標(biāo),會(huì)執(zhí)行以下規(guī)則命令:
$(Q)$(MAKE) $(build)=scripts/basic
其中:
Q是顯示方式:靜默make -s;詳細(xì)make V=1;不顯示make V=0
MAKE=make
build定義在scriptskbuild.include
build := -f $(srctree)/scripts/Makefile.build obj
展開(kāi)后:
build := -f ./scripts/Makefile.build obj
展開(kāi)后:
@make -f ./scripts/Makefile.build obj=scripts/basic
@rm -f .tmp_quiet_recordmcount
最終會(huì)調(diào)用文件./scripts/Makefile.build
3、outputmakefile目標(biāo):
可以通過(guò)echo查看KBUILD_SRC為空
mytest:
@echo KBUILD_SRC = $(KBUILD_SRC)
所以該目標(biāo)規(guī)則沒(méi)有執(zhí)行如何命令。
第二步:命令部分
目標(biāo) %config 依賴(lài)于 scripts_basic、outputmakefile、FORCE ,執(zhí)行以下命令:
$(Q)$(MAKE) $(build)=scripts/kconfig $@
展開(kāi):
make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig
也跟文件./scripts/Makefile.build 有關(guān)
第三步:Makefile.build
上面的分析最后指向以下兩條命令:
make -f ./scripts/Makefile.build obj=scripts/basic
make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig
1、 scripts_basic 目標(biāo)對(duì)應(yīng)的命令:
make -f ./scripts/Makefile.build obj=scripts/basic
打開(kāi)文件 scripts/Makefile.build,有如下代碼:
# Modified for U-Boot
prefix := tpl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := spl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := .
endif
endif
# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)
使用@echo打印各個(gè)變量值,結(jié)果如下:
src= scripts/basic
kbuild-dir = ./scripts/basic
kbuild-file = ./scripts/basic/Makefile
include ./scripts/basic/Makefile
其中src的值即為obj=scripts/basic的值。
make執(zhí)行時(shí)未指定目標(biāo),會(huì)執(zhí)行Makefile.build中的默認(rèn)目標(biāo),如下:
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))
$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target))
$(subdir-ym) $(always)
@:
其中KBUILD_BUILTIN = 1、KBUILD_MODULES = 0,展開(kāi)后即為:
__build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)
@:
include ./scripts/basic/Makefile
2、 %config 目標(biāo)對(duì)應(yīng)的命令:
make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig
src的值即為obj=scripts/basic的值,所以Makefile.build中各個(gè)變量值如下:
src= scripts/kconfig
kbuild-dir = ./scripts/kconfig
kbuild-file = ./scripts/kconfig/Makefile
include ./scripts/kconfig/Makefile
include包含了./scripts/kconfig目錄下的Makefile,執(zhí)行make時(shí)會(huì)調(diào)用scripts/kconfig/ Makefile中的內(nèi)容,此文件有如下所示內(nèi)容:
%_defconfig: $(obj)/conf
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
# Added for U-Boot (backward compatibility)
%_config: %_defconfig
@:
目標(biāo)%_defconfig 剛好和我們輸入的 xxx_defconfig 匹配,依賴(lài)為$(obj)/conf,展開(kāi)后就是 scripts/kconfig/conf。接下來(lái)就是檢查并生成依賴(lài)scripts/kconfig/conf。
得到 scripts/kconfig/conf 以后就要執(zhí)行目標(biāo)%_defconfig 的命令:
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
將其展開(kāi)就是:
@ scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig
結(jié)果是將配置輸出到.config 文件中,最終生成 uboot 根目錄下的.config 文件。
整體流程圖:
參考正點(diǎn)原子linux驅(qū)動(dòng)開(kāi)發(fā)指南,使用conf程序去生成.config;另一種舊版使用mkconfig 去生成config.mk 、config.h。
03.make 生成 u-boot.bin 等文件
make //編譯u-boot,未指定目標(biāo)將執(zhí)行Makefile中默認(rèn)目標(biāo)
沒(méi)有指明目標(biāo),使用默認(rèn)的目標(biāo)。
如果 KBUILD_EXTMOD(編譯模塊) 為空的話(huà) _all 依賴(lài)于all:
all: $(ALL-y)
其中all依賴(lài)于ALL-y,即依賴(lài)于 u-boot.srec、u-boot.bin、u-boot.sym等:
u-boot.bin 依賴(lài) u-boot-nodtb.bin、FORCE目標(biāo):
u-boot-nodtb.bin 依賴(lài) u-boot、FORCE目標(biāo):
u-boot 依賴(lài) $(head-y):
head-y在 arch/arm/Makefile 定義,即 u-boot 依賴(lài) start.o :
head-y := arch/arm/cpu/$(CPU)/start.o
u-boot 依賴(lài) $(libs-y):
libs-y 在頂層 Makefile 中定義,為依賴(lài)的源碼文件目錄:
$(patsubst 名稱(chēng):模式字符串替換函數(shù) 功能:查找 表示任意長(zhǎng)度的字串。如果 個(gè) % 將是 返回:函數(shù)返回被替換過(guò)后的字符串。 表示 u-boot 依賴(lài) libs-y 所指定的所有源碼路徑下的 built-in.o 文件 結(jié)論 u-boot 依賴(lài) start.o、 built-in.o 文件,u-boot 將 built-in.o、start.o 文件鏈接在一起 04.鏈接 u-boot.lds 為鏈接腳本,將 arch/arm/cpu/armv7/start.o 和各個(gè)子目錄下的 built-in.o 鏈接在一起生成 u-boot。 05.備注 make xxx_defconfig:用于配置 uboot,這個(gè)命令最主要的目的就是生成.config 文件。 make:用于編譯 uboot,這個(gè)命令的主要工作就是生成二進(jìn)制的 u-boot.bin 文件和其他的一些與 uboot 有關(guān)的文件,比如 u-boot.imx 等。
上一篇:【IMX6ULL學(xué)習(xí)筆記】四、 U-BOOT啟動(dòng)流程
下一篇:【IMX6ULL學(xué)習(xí)筆記】二、U-Boot命令合集
推薦閱讀最新更新時(shí)間:2025-06-14 17:07






設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 【下載】LAT1526 利用SPI的下溢實(shí)現(xiàn)回顯功能
- 【下載】LAT1509 STM32G0B1的FDCAN進(jìn)行通信丟包和多包案例分享
- 【下載】LAT1511 運(yùn)行Ux_Host_HUB_HID_MSC通過(guò)Hub連接U盤(pán)讀寫(xiě)不穩(wěn)定問(wèn)題分析
- 【下載】LAT1466 USB x Device HID Standalone的移植
- 【下載】LAT1488 STM32 USBxDevice MSC standalone移植示例
- 【下載】LAT1482 STM32G0單線(xiàn)串口通信幀錯(cuò)誤問(wèn)題解析
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線(xiàn) 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線(xiàn)微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 對(duì)講機(jī)dtmf解碼
- TND315-D、160 W CRT-TV 電源文檔包
- NSV45020JZ 大電流 LED 燈串的典型應(yīng)用
- MIC8114的典型應(yīng)用:微處理器復(fù)位電路
- 用于消費(fèi)電子產(chǎn)品的 PIC33 MCU 開(kāi)發(fā)系統(tǒng)
- L7818C 0.5 至 10 V 輸出穩(wěn)壓器的典型應(yīng)用
- AD5313 雙軌至軌電壓輸出、10 位 DAC 的典型應(yīng)用
- 使用 Analog Devices 的 LT1021DIN8-10 的參考設(shè)計(jì)
- MIKROE-3274,磁性線(xiàn)性點(diǎn)擊板 HMC1501 磁阻傳感器
- LT3990EDD 1.8V 降壓轉(zhuǎn)換器的典型應(yīng)用
- 國(guó)芯科技發(fā)布全球首款48V安全氣囊芯片,引領(lǐng)智能汽車(chē)新紀(jì)元
- 亞馬遜全球部署100萬(wàn)臺(tái)機(jī)器人
- 自動(dòng)駕駛只用激光雷達(dá)進(jìn)行感知會(huì)有哪些問(wèn)題?
- 為什么電源紋波測(cè)試結(jié)果與理論設(shè)計(jì)如此之大?
- UWB信標(biāo)與LoRa基站網(wǎng)關(guān)數(shù)據(jù)區(qū)別在哪里?
- 什么是AI 同傳技術(shù)
- 人工智能處理器和加速器到底是什么?
- PWM控制(脈沖寬度調(diào)制)的基本原理是什么
- 如何設(shè)計(jì)帶集成運(yùn)放構(gòu)成的方波發(fā)生器
- DSP調(diào)度算法的基本概念和原理
- ATtiny2313 Flash程序存儲(chǔ)器
- 19課:單片機(jī)定時(shí)器、中斷試驗(yàn)
- 18課:單片機(jī)的中斷系統(tǒng)
- 17課:單片機(jī)定時(shí)器/計(jì)數(shù)器的方式控制字
- 16課:單片機(jī)定時(shí)器與計(jì)數(shù)器
- 國(guó)網(wǎng)信通產(chǎn)業(yè)集團(tuán)與騰訊云達(dá)成合作
- 簡(jiǎn)單盤(pán)點(diǎn)一些世界上比較先進(jìn)的機(jī)器人
- 大疆布局STEM教育發(fā)布首款教育機(jī)器人
- 機(jī)器人會(huì)是我們陪伴一生的的守護(hù)者嗎
- 2030年支持SLAM的自主移動(dòng)機(jī)器人的安裝基地將超過(guò)1500萬(wàn)