设为首页 加入收藏

TOP

UBOOT编译--- UBOOT的编译和链接选项详解(六)(一)
2023-07-23 13:30:30 】 浏览:133
Tags:UBOOT 编译 --- 项详解

1. 前言

 UBOOT版本:uboot2018.03,开发板myimx8mmek240。

2. 函数 cc-option

编译选项变量cc-option 定义在 scripts/Kbuild.include中:

# scripts/Kbuild.include
# output directory for tests below
TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)

# try-run
# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
# Exit code chooses option. "$$TMP" is can be used as temporary file and
# is automatically cleaned up.
# modifed for U-Boot: prevent cc-option from leaving .*.su files
try-run = $(shell set -e;		\
	TMP="$(TMPOUT).$$$$.tmp";	\
	TMPO="$(TMPOUT).$$$$.o";	\
	TMPSU="$(TMPOUT).$$$$.su";	\
	if ($(1)) >/dev/null 2>&1;	\
	then echo "$(2)";		\
	else echo "$(3)";		\
	fi;				\
	rm -f "$$TMP" "$$TMPO" "$$TMPSU")
	
# cc-option
# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)

cc-option = $(call try-run,\
	$(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))

2.1 command >/dev/null 2>&1

command >/dev/null 2>&1 == command 1>/dev/null 2>&1

  • ‘command’ : 表示shell命令或者为一个可执行程序;
  • ‘>’ : 表示重定向到哪里;
  • ‘/dev/null’ : 表示Linux的空设备文件;
  • ‘2’ : 表示标准错误输出;
  • ‘&1’ : &表示等同于的意思,2>&1,表示2的输出重定向等于于1;

(1)1>/dev/null:表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。
(2)2>&1:表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

这条命令的意思就是:将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空。所以可以看出" >/dev/null 2>&1 "常用来避免shell命令或者程序等运行中有内容输出到终端。

2.2 cc-option解析

举例:

PLATFORM_CPPFLAGS += $(call cc-option,-marm,)

函数cc-option

  • 第一个参数赋给$ (1)(这里是指-marm),
  • 第二个参数给$(2)(这里为空)。

变量cc-option的值是函数try-run的执行结果,函数try-run又是$(shell ....)输出的结果;也就是if ...else...的结果。在函数try-run中

  • $(1) : $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(1) -c -x c /dev/null -o "
  • $(2) : 函数cc-option的 $(1) (这里是指-marm)
  • $(3) : 函数cc-option的 $(2) (这里为空)

如果函数try-run的$(1)能执行,那么echo $(2),否则echo $(3);echo 的值正是cc-option的值

综上:该例子的意思是如果交叉编译工具$(CC)支持cc-optionl函数的参数一表示的选项(也就是指-marm),那么cc-option函数的返回就是该选项(指-marm),否则返回的是call函数的参数二表示的选项。

cc-option:检测$(CC) 是否支持给定的选项

3. 平台代码重定位需要的编译选项$(PLATFORM_RELFLAGS))

#(1) 顶层config.mk
PLATFORM_RELFLAGS :=

#(2) arch/arm/config.mk
PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections \
		     -fno-common -ffixed-r9
PLATFORM_RELFLAGS += $(call cc-option, -msoft-float) \
      $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))  //空
......
PLATFORM_RELFLAGS	+= $(LLVM_RELFLAGS)     //空
  
#(3) arch/arm/cpu/armv8/config.mk
PLATFORM_RELFLAGS += -fno-common -ffixed-x18

展开为:

PLATFORM_RELFLAGS= -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -fno-common -ffixed-x18

参数讲解见本文末尾参考小节

4. 平台代码预处理需要的编译选项$(PLATFORM_CPPFLAGS)

#(1) 顶层config.mk
PLATFORM_CPPFLAGS :=
......
ifdef FTRACE
PLATFORM_CPPFLAGS += -finstrument-functions -DFTRACE  //调试时使用,一般不会打开
endif
# Allow use of stdint.h if available
ifneq ($(USE_STDINT),)
PLATFORM_CPPFLAGS += -DCONFIG_USE_STDINT   //空
endif
RELFLAGS := $(PLATFORM_RELFLAGS)          //见上一小节

PLATFORM_CPPFLAGS += $(RELFLAGS)
PLATFORM_CPPFLAGS += -pipe
export PLATFORM_CPPFLAGS

#(2) arch/arm/config.mk
# Choose between ARM/Thumb i
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇痞子衡嵌入式:对比恩智浦全系列M.. 下一篇UBOOT编译--- UBOOT编译过程目标..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目