MakeFile 语法简介
【1】在Makefile的mk文件中‘:=’是赋值的意思;’+=’是追加的意思;‘$’表示引用某变量的值
【2】每个编译模块都是由include $(CLEAR_VARS)开始,到include $(BUILD_SHARED_LIBRARY)结束
LOCAL_PATH := $(call my-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir 则由Build System提供。
返回包含Android.mk的目录路径,这个路径非常有用。
----------------------
include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
----------------------
TARGET_OUT
TARGET_OUT相当于out/target/product/productname
----------------------
TARGET_PRODUCT
TARGET_PRODUCT值为对应编译项目的选择,就是lunch时选择的项目
----------------------
TARGET_BUILD_VARIANT
TARGET_BUILD_VARIANT值对应项目的选择编译类型,就是lunch时选择项目的编译类型,如user,userdebug,eng
----------------------
PLATFORM平台
芯片平台,是MTK,还是QCOM
ifneq ((PLATFORM)), QCOM)
PRODUCT_PACKAGES += XXX
endif
在Android.mk文件中打印log
$(info xxxxx) //一般打印信息
$(warning xxxxx) //警告性级别信息输出
$(error xxxxx) //输出错误信息,并终止编译
输出变量方式为:$(warning $(var)) or $(warning $var)
如$(warning $(LOCAL_PATH)) or $(warning "string$(LOCAL_PATH)") or $(warning this is $LOCAL_PACKAGE_NAME)
[1]inherit-product
如果要引用自己创建的某mk文件,需要在build/target/product/core.mk目录下(不一定是此目录,视各自公司规定而定)中加入://文件存放位置的绝对路径
$(call inherit-product, $(SRC_TARGET_DIR)/product/mytest.mk)
在/build/target/product目录下,创建一个makefile文件取为mytest.mk吧
(2)在里面输入(TEST为我们要预置的APK文件名):
PRODUCT_PACKAGES := TEST
inherit-product 表示继承另外一个文件:
$(call inherit-product, vendor/dolby/ds/dolby-product.mk)
$(call inherit-product-if-exists, vendor/dolby/ds/gms.mk)
include和 inherit-product的区别
假设您PRODUCT_VAR := a在 A.mk 中,PRODUCT_VAR := b在 B.mk 中。
如果你在 A.mk 中include B.mk,你最终会得到PRODUCT_VAR := b。
但是如果你inherit-product在 A.mk 中 B.mk,你会得到PRODUCT_VAR := a b.
并inherit-product确保您不会两次包含 makefile,在 ALL_PRODUCTS 变量中标识出当前操作的 Makefile 文件已经被访问过了(以免重复访问)。
[2]-include
如是在我们的自己写的某mk文件中引用执行其它mk文件我们可以如下写:
-include $(TOPDIR)vendor/odm/prebuilts/customname.mk
include $(TOPDIR)vendor/odm/prebuilts/customname.mk
两者的区别:
include 作用是导入执行指定的mk文件,带-include的表示如果指定执行的mk文件不存在或是无法创建时并不会停止编译,而是忽略此操作的错误,而不-的include遇到指定执行的mk文件不存在时就立刻报错并停止编译。
[3]$(strip string)
功能:去掉字串中开头和结尾的空字符。
返回:返回被去掉空格的字符串值。
//BOARD_HAS_QCOM_WLAN去掉首尾空格符字符串为true则if条件满足
ifeq ($(strip $(BOARD_HAS_QCOM_WLAN)),true)
include device/qcom/AndroidBoardWlan.mk
endif
//判断一个变量foo的值是否为空,为空则满足if条件
ifeq ($(strip $(foo)),)
TEXT-IF-EMPTY
endif
[4]条件判断语句
ifeq 判断参数是否不相等,相等为 true,不相等为 false。
ifneq判断参数是否不相等,不相等为 true,相等为 false。
ifeq ($(变量名), 变量值 )
........
else ifeq ($(..), ..)
.........
else
.........
endif
ifeq ($(TARGET_USES_QMAA), true)
ifneq ($(TARGET_USES_QMAA_OVERRIDE_WLAN), true)
include device/qcom/wlan/default/wlan.mk
else
include device/qcom/wlan/xxx/wlan.mk
endif
else
include device/qcom/wlan/xxx/wlan.mk
endif
ifdef 判断是否有值,有值为 true,没有值为 false。
ifndef判断是否有值,没有值为 true,有值为 false。
站点有关makefile的其它文章:
评论