uboot之makefile底層文件

 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.指定編譯鏈接時目標文件的輸出目錄

ifdef O
ifeq ("$(origin O)", "command line")#if 命令行傳遞過來了變量O
BUILD_DIR := $(O)
endif
endif

ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})#if 存在了BUILD_DIR就跳過||右邊的語句,否則要執行右邊的語句)

# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))#if BUILD_DIR爲空則顯示報警信息 
endif # ifneq ($(BUILD_DIR),)
有兩種方式指定輸出文件的目錄:

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章