1.HOSTARCH 和HOSTOS
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/macppc/ppc/)
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
sed -e 's/\(cygwin\).*/cygwin/')
在此使用了 shell 命令 sed ,此命令会把主机架构名“i686”替换为“i386”,把主机操作系统“Linux”替换为“linux”,目的是尽量统一主机的架构名和操作系统类型。
2.指定编译链接时目标文件的输出目录
(1)Add O= to the make command line
# 'make O=/tmp/build all'
(2) Set environement variable BUILD_DIR to point to the desired location
# 'export BUILD_DIR=/tmp/build'
# 'make'
3.makefile的if语句
定义编译选项变量
cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
引用编译选项变量cc-option
PLATFORM_CPPFLAGS += $(call cc-option,-marm,)
解析:call调用函数(指变量cc-option),传递的第一个参数赋给$(1),第二个参数给$(2)
变量cc-option的值是函数$(shell ....)返回的结果,也就是if函数的返回结果(shell只负责对if函数的返回结果处理)
if函数格式为(要注意的是if函数和makefile里的$(if..,. ,..)的差别):
if 语句1;then 语句2;else 语句3;fi;
表示如果语句1能够执行,则执行语句2,如果不能执行(比如有错等),则执行语句3
对于函数$(call cc-option,-marm,):
如果交叉编译工具$(CC)支持call函数的参数一表示的选项(也就是指-marm),那么call函数的返回就是该选项(指-marm),否则返回的是call函数的参数二表示的选项.