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