Android Makefile常用函數簡介(不定期更新)

Android Makefile常用函數簡介(不定期更新)

Qidi 2017.02.20 Markdown & Haroopad


CSDN的Markdown編輯器對美元符號($)和百分號(%)的支持好像有問題。下面正文中的括號前都有美元符號($),我現在已經爲這些美元符號額外添加轉義符號了。如果還有沒顯示出來的,煩請告知。謝謝。
而且CSDN對特定關鍵字會自動添加超鏈接,比如Android、java等,這也影響了Markdown文本的正確顯示。
下次再在CSDN發表博客,我還是換回普通編輯器吧。


word N, TEXT
作用:取出TEXT中第N個單詞
示例:$(word 3, aaa bbb ccc) 結果爲 ccc
出處:main.mk:26:#TOP := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))

words TEXT
作用:返回TEXT中的單詞數目
示例:$(words aaa bbb ccc) 結果爲 3
出處:main.mk:26:#TOP := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))

dir FILENAME
作用:返回FILENAME文件的目錄
示例:$(dir core/main.mk) 結果爲 core/
出處:main.mk:26:#TOP := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))

patsubst FROM, TO, FILELIST
作用:將FILELIST中符合模式(pattern)FROM的文件名或字符串替換爲TO模式那樣的文件名或字符串
示例:$(patsubst %c, %.o, aaa.c bbb.c) 結果是 aaa.o bbb.o
出處:main.mk:27:#TOP := $(patsubst %/, %, $(TOP))

lastword TEXT
作用:返回TEXT文本中的最後1個單詞。相當於$(word $(words TEXT), TEXT)
示例:$(lastword aaa bbb ccc) 結果爲 ccc
出處:clear_cars.mk:377:MAKEFILE_LIST := $(lastword $(MAKEFILE_LIST))

filter PATERN, TEXT
作用:取出TEXT中符合PATERN模式的字符串
示例:$(filter a%, aaa abc bbb ccc) 結果爲 aaa abc
出處:envsetup.mk:252:ifneq ($(filter  dax%, $(TARGET_PRODUCT)), )

filter-out PATTERN, TEXT
作用:取出TEXT中除了符合PATTERN模式的其餘字符串
示例:$(filter-out aaa, aaa bbb ccc) 結果爲 bbb ccc
出處: Android.mk:52:LOCAL_SRC_FILES := $(filter-out DolbySoundTile.java DolbySoundController.java, $(LOCAL_SRC_FILES))

strip TEXT
作用:去掉TEXT中的空格
示例:$(strip aaa bbb ccc) 結果爲 aaabbbccc
出處:dolby-product.mk:49:ifneq ($(strip $(DOLBY_MONO_SPEAKER)), )

findstring TARGET, TEXT
作用:在TEXT字符串中查找並返回TARGET字符串,若不存在則返回空
示例:$(findstring aaa, aaa bbb ccc) 結果爲 aaa
出處:Android.mk:14:ifeq ($(findstring arm, $(TARGET_ARCH)), arm)

error TEXT
作用:打印內容爲TEXT的錯誤消息,並結束makefile運行
示例:$(error “Fatal error occured.”)
出處: Android.mk:18:$(error “Unsupported architecture for DAP1: $(TARGET_ARCH)”)


【補充說明】

很多時候我們還會看到有all-makefiles-underall-c-files-underall-cpp-files-underall-java-files-underfind-subdir-filesmy-dirinherit-productinherit-device等函數的調用。舉個例子:LOCAL_SRC_FILES := $(call all-java-files-under, src)這個調用就是要查找出src/目錄下的所有java源文件,並將這些源文件的名字添加到LOCAL_SRC_FILES這個變量中。

這些makefile函數其實都是在build/core/*.mk文件中定義的,通常以define關鍵字開頭。如果我們想知道它們的作用是什麼,可以直接去makefile文件中查看。在build/core/目錄下使用命令grep -rn ^define\ all-java-files-under就可以輕鬆查找到相應命令的定義。

比如all-java-files-under就是在build/core/definitions.mk文件中定義的。定義內容如下:

##########################################################
## Find all of the java files under the named directories.
## Meant to be used like:
##    SRC_FILES := $(call all-java-files-under, src tests)
##########################################################
define all-java-files-under
$(call all-named-files-under, *.java, $(1))
endef
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章