Makefile解析(ARM LINLON V5/V7 VPU firmware tools例)

2024-05-10 17:28

本文主要是介绍Makefile解析(ARM LINLON V5/V7 VPU firmware tools例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

根目录Makefile

初始化一些变量
TARGETS := model executiontb cpu
ROOT_DIR?=$(abspath $(CURDIR))
OUT_DIR?=$(abspath $(CURDIR))
ADDR_FILE:=$(ROOT_DIR)/build/mmu_addr.txtmake all 执行 make help
all: help.PHONY后面跟的目标都被称为伪目标,也就是说我们 make 命令后面跟的参数如果出现在.PHONY 定义的伪目标中,那就直接在Makefile中就执行伪目标的依赖和命令。不管Makefile同级目录下是否有该伪目标同名的文件,即使有也不会产生冲突。另一个就是提高执行makefile时的效率
.PHONY: session_dump_file
session_dump_file:
ifndef SESSION_DUMP$(error No SESSION_DUMP file provided)
endif
echo和@echo的区别make 在执行命令之前会把要执行的命令进行输出,称之为回显如果要执行的命令以字符 @ 开始,则不会回显,例如:
1. @echo XXX在执行命令时,将输出  XXX
2. echo XXX在执行命令时,将输出    echo XXX    XXX@echo "Binarizing $(SESSION_DUMP) -> ${OUT_DIR}/src/session_dump.c"build/bin2a.sh -l $(SESSION_DUMP) g_session_dump > ${OUT_DIR}/src/session_dump.c.PHONY: self_check
self_check:
ifdef SELF_CHECK@echo "SELF_CHECK enabled: Binarizing $(SELF_CHECK) -> ${OUT_DIR}/src/self_check_reference.c"build/bin2a.sh -i $(SELF_CHECK) g_self_check_reference > ${OUT_DIR}/src/self_check_reference.c
endifdefine
endef
定义一个函数
可以通过$(call xxx)来进行调用
define target_rule
$(1): session_dump_file self_check
ifeq ($(PRE_CONVERT_PTABLE), 1)$$(MAKE) -f build/compile-$(1).mk ROOT_DIR=$(ROOT_DIR) OUT_DIR=$(OUT_DIR) ADDR_FILE=$(ADDR_FILE) python $(ROOT_DIR)/build/mmu_restore.py -i $(SESSION_DUMP) -s $(ADDR_FILE) -b 0/bin/rm -rf obj bin/bin/rm $(ADDR_FILE)/bin/mv $(SESSION_DUMP).tmp $(SESSION_DUMP)build/bin2a.sh -l $(SESSION_DUMP) g_session_dump > ${OUT_DIR}/src/session_dump.c
endif
顶层Makefile使用make -f调用子目录中的文件(文件名可以随意,不一定用Makefile作为文件名)作为Makefile,经测试,在顶层Makefile中使用-f选项,例如make -f ./xxx/xx/build.mk 此时make命令的工作目录仍然是顶层目录,即CUDIR变量依然是./目录而不是./xxx/xx/目录$$(MAKE) -f build/compile-$(1).mk ROOT_DIR=$(ROOT_DIR) OUT_DIR=$(OUT_DIR).PHONY: $(1)
endef$(foreach target,$(TARGETS),$(eval $(call target_rule,$(target))))clean: realcleanrealclean:@echo "Removing obj & bin"/bin/rm -rf obj binTARBALL = $(abspath $(CURDIR)/../$(notdir $(CURDIR)).tar.bz2)tarball: realclean@echo "Packaging $(TARBALL)"cd ..; \tar cjf $(TARBALL) $(notdir $(CURDIR))help:@echo "==============================="@echo ""@echo "make SESSION_DUMP=session_dump.mvedump"@echo "     [AFBC=1]"@echo "     [ARCH=MVE550] [CPU=8-A.32] [MCPU=a53] [OPTS=\"<extra compile flags>\"]"@echo "     [START_ADDRESS=0x80008000] [HEAP_ADDRESS=0x86000000] [UNCACHED_BUFFER=0x88000000]"@echo "     [MODEL_LIB=<model library>]"@echo "     [SELF_CHECK=<reference_output_file>]"@echo "     [ $(foreach target,$(TARGETS),$(target) |) tarball | clean | realclean ]"@echo ""@echo "SESSION_DUMP     : Dump file created with mve_decode/mve_encode with option --save_session"@echo "START_ADDRESS    : Binary image entry point"@echo "HEAP_ADDRESS     : Heap & stack address. Please see generated scatter file"@echo "UNCACHED_BUFFER  : Uncached memory region where output buffers are allocated"@echo "OPTS             : Extra compile flags passed to the source."@echo "                       -DMVEVERBOSE - extra verbose"@echo "                       -DMVEDEBUG   - extra debug"@echo "                       -DDHEAP_SIZE - size of memory pool for dynamic allocation. If not specified"@echo "                                      160MB (0xA000000) is used. Please note that aprox. 6.5MB"@echo "                                      (6.7MiB) and 25MB (25.9MiB) is needed per HD and UHD frame"@echo "                                      respectively."@echo "SELF_CHECK       : Enable built-in comparison with output reference file, instead of saving output"@echo "NO_UART          : UART is not present in the testbench"@echo "NO_GIC           : GIC is not present in the testbench"@echo "clean            : Clean all binary and object files"@echo "realclean        : Clean all binary and object files"@echo ""@echo "===============================".PHONY: clean realclean tarball help

common.mk

检查变量
ifeq ($(ROOT_DIR),)
$(error "ROOT_DIR is not defined")
endififeq ($(OBJ_DIR),)
$(error "OBJ_DIR is not defined")
endififeq ($(BIN_DIR),)
$(error "BIN_DIR is not defined")
endififeq ($(SESSION_DUMP),)
$(error "SESSION_DUMP is not defined")
endififdef SELF_CHECK
CHECK=1
else
CHECK=0
endifCREATE_VARIOUS_DIRS__EVAL_FOR_SIDE_EFFECTS := $(shell mkdir -p $(OBJ_DIR) && mkdir -p $(BIN_DIR))# Case
upper_case = $(shell echo $(1) | tr a-z A-Z)
lower_case = $(shell echo $(1) | tr A-Z a-z)# Hash
# $(1) : Prefix
# $(2) : String
hash = $(1)_$(shell echo $(2) | md5sum | cut -d ' ' -f1)ARCH ?= MVE550# Top main source file
TOP_MAIN := src/miniplayer.c
TEST_OBJS := $(OBJ_DIR)/$(subst .c,.o,$(notdir $(TOP_MAIN)))# User CFLAGS
COMMON_OPTS := $(OPTS)
COMMON_OPTS += $(if $(MVE_BASE), -DMVE_BASE=$(MVE_BASE),)
COMMON_OPTS += $(if $(MVE_IRQ),  -DMVE_IRQ=$(MVE_IRQ),)
COMMON_OPTS += $(if $(IN_FILE),  -DIN_FILE=\"$(IN_FILE)\",)
COMMON_OPTS += $(if $(OUT_FILE), -DOUT_FILE=\"$(OUT_FILE)\",)
COMMON_OPTS += $(if $(filter 1, $(SAVE_SESSION_V2)), -DSAVE_SESSION_V2,)
COMMON_OPTS += -DMEM_MAPPING_INFO# 64/32 bit builds
ifndef SYSTEM
ifeq ($(shell uname -m),x86_64)
SYSTEM := 64
else
SYSTEM := 32
endif
$(info "SYSTEM is not defined. Using SYSTEM=$(SYSTEM)")
endif# Generate source file from binary
# $(1) : Source binary dir
# $(2) : Source binary file variable name
# $(3) : Int array
# $(4) : Target C array name
define bin2a_rule
$(2)_C := $(OBJ_DIR)/$(call hash,auto_gen_$(call lower_case,$(2)),$(1)/$($(2))).c
$$($(2)_C): ./build/bin2a.sh $(1)/$($(2))@echo "Generating $$@"rm -rf $(OBJ_DIR)/auto_gen_$(call lower_case,$(2))_*$$< $(if $(3),-i,-c) $(1)/$($(2)) $(4) > $$@
endef# Generate this rule to track CFLAGS and embedded file name changes
# $(1) : All concerned objects
# $(2) : CFLAGS variable
define cflags_rule
$(1): $(OBJ_DIR)/CFLAGS
.PHONY: force
$(OBJ_DIR)/CFLAGS: forcetest -e $$@ || touch $$@echo "$(2)" > $$@.tmpcmp -s $$@ $$@.tmp || cp $$@.tmp $$@rm $$@.tmp
endef

compile-module.mk

初始化变量
TARGET_DIR := model
OBJ_DIR ?= $(ROOT_DIR)/obj/$(TARGET_DIR)
BIN_DIR ?= $(ROOT_DIR)/bin/$(TARGET_DIR)# Build testbench by default
all: modelinclude $(ROOT_DIR)/build/common.mkCC := gcc
LD := gcc
AR := ar###############################################################################
#
# Model
#定义编译出来的执行文件
model: $(BIN_DIR)/model_test定义要编译的源文件
MODEL_SRCS := src/mve_communication.c \src/mve_core.c \src/mve_fw_manager.c \src/mve_hw.c \src/mve_mmu.c \src/mve_port_linux_emul.c \src/mve_port_linux_emul_utils.c \src/session_dump.c \$(TOP_MAIN)#ifdef SELF_CHECK
#CHECK=1
#else
#CHECK=0
#endifaddprefix 是makefile中的函数,是添加前缀的函数
例如:
$(addprefix src/,foo bar)
返回值为“src/foo src/bar”
SRCS_ABS := $(addprefix $(ROOT_DIR)/,$(MODEL_SRCS))MODEL_DIR := $(ROOT_DIR)/../modelMODEL_LIB ?= $(MODEL_DIR)/libmvemodel$(SYSTEM).sowildcard, $(wildcard 指定文件类型), 显示指定路径下指定文件类型的所有文件
ifeq ($(wildcard $(MODEL_LIB)),)
$(error "Can't find $(MODEL_LIB)")
endifMODEL_CFLAGS  := -D_POSIX_C_SOURCE=199309L -O2 -m$(SYSTEM) -std=c99 -pthread -DTARGET_LINUX$(SYSTEM) 
$(dir <names...> )
名称:取目录函数——dir。
功能:从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。返回:返回文件名序列<names>的目录部分。示例: $(dir src/foo.c hacks)返回值是“src/ ./”
$(if $(filter 1,$(CHECK)),-DMVE_SELF_CHECK=1,) -I$(dir $(MODEL_LIB)) $(INC_COMMON) $(COMMON_OPTS)
MODEL_LDFLAGS := -m$(SYSTEM) -pthread $(COMMON_OPTS)
MODEL_LDLIBS  := -lm -lrtnotdir
名称:取文件函数——notdir。包括后缀,去除文件夹路径
功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”
)之后的部分。
返回:返回文件名序列<names>的非目录部分。
示例: $(notdir src/foo.c hacks)返回值是“foo.c hacks”
get_model_obj = $(addprefix $(OBJ_DIR)/,$(notdir $(patsubst %.c,%.o,$(1))))define model_rule
$(call get_model_obj,$(1)): $(1) $(OMX_DIR)@echo "Compiling $1"$(CC) -MM -MG $(MODEL_CFLAGS) $$< | sed -e 's,^\([^:]*\)\.o[ ]*:,$$(@D)/\1.o $$(@D)/\1.d:,' >$$(@:.o=.d)$(CC) -c -o $$@ $1 $(MODEL_CFLAGS)
endef$(foreach file,$(SRCS_ABS),$(eval $(call model_rule,$(file))))OBJS := $(call get_model_obj,$(SRCS_ABS))$(BIN_DIR)/model_test: $(OBJS) $(MODEL_LIB)@echo " >> Building $@"$(LD) -o $@ $(MODEL_LDFLAGS) $^ $(MODEL_LDLIBS)###############################################################################
#
# CFLAGS
#
#
$(eval $(call cflags_rule,$(OBJS),$(MODEL_CFLAGS) $(MODEL_LDFLAGS) $(MODEL_LIB)))###############################################################################
#
# Dependencies
#DEPS := $(OBJS:.o=.d)ifneq ($(MAKECMDGOALS),clean)
-include $(DEPS)
endif

这篇关于Makefile解析(ARM LINLON V5/V7 VPU firmware tools例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977087

相关文章

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄