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函數的參數二表示的選項.