MakeFile 语法简介

sancaiodm Shell/Ubuntu系统 2022-05-07 1913 0

【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)

image.png

[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的其它文章:

Android 预制资源文件到系统内

Android.mk 简单分析记录

评论