android开发笔记之Makefile(二)

公司编译项目的命令为:

make -j8  PROJECT_NAME=*** SUB_PROJECT_NAME=**** BUILD_MYOS=yes1

比原始的编译方法多了几个后面的参数,那我们就分析一下这几个参数是怎么来的吧。

BUILD_MYOS

./build/core/main.mk

#如果BUILD_MYOS为yes,我们执行****
ifeq ($(strip $(BUILD_MYOS)),yes)
****
endif1234

#如果BUILD_MYOS为no,我们执行****
ifeq ($(strip $(BUILD_MYOS)),no)
*****
endif1234

SUB_PROJECT_NAME

Android.mk文件

#如果SUB_PROJECT_NAME不为空,则包含此路径的Android.mk
ifneq ($(strip $(SUB_PROJECT_NAME)),)
include $(LOCAL_PATH)/$(SUB_PROJECT_NAME)/Android.mk
endif1234

*.mk文件

#取SUB_PROJECT_NAME的值
LOCAL_PATH := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/SUB_PROJECTS/$(SUB_PROJECT_NAME)

#取SUB_PROJECT_NAME的值
PRODUCT_PROPERTY_OVERRIDES += ro.tinno.operator=$(SUB_PROJECT_NAME)

#如果SUB_PROJECT_NAME为空,则**,如果SUB_PROJECT_NAME不为空,则**
ifeq ($(strip $(SUB_PROJECT_NAME)),)
*****
else
****
endif


# 如果SUB_PROJECT_NAME不为空,则包含对应SUB_PROJECT_NAME目录下的configs.mk,或则包含上一个层级的configs.mk
CFG_FILE := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/configs.mk
ifneq ($(strip $(SUB_PROJECT_NAME)),)
CFG_FILE := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/SUB_PROJECTS/$(SUB_PROJECT_NAME)/configs.mk
ifeq ($(wildcard $(CFG_FILE)),)
    CFG_FILE := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/configs.mk
endif
endif
-include $(CFG_FILE)

#如果SUB_PROJECT_NAME不为空,则包含对应SUB_PROJECT_NAME目录下的gms.mk,或则包含默认目录下的gms.mk
GMS_FILE :=vendor/google/products/gms.mk
ifneq ($(strip $(SUB_PROJECT_NAME)),)
GMS_FILE :=vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)/SUB_PROJECTS/$(SUB_PROJECT_NAME)/gms.mk
ifeq ($(wildcard $(GMS_FILE)),)
  GMS_FILE :=vendor/tinno/google/products/gms.mk
endif
endif
$(call inherit-product-if-exists, $(GMS_FILE))123456789101112131415161718192021222324252627282930313233

build/core/Makefile

#如果SUB_PROJECT_NAME不为空
ifneq ($(strip $(SUB_PROJECT_NAME)),)
****
endif1234

build/core/main.mk

#如果SUB_PROJECT_NAME不为空,则
ifneq ($(strip $(SUB_PROJECT_NAME)),)
   PROPERTY_CINFIGS_SUB_PROJECT_NAME = $(SUB_PROJECT_NAME)
endif1234

PROJECT_NAME

*.mk

#当前目录
LOCAL_PATH := vendor/$(TARGET_PRODUCT)/$(PROJECT_NAME)
#给系统属性赋值
PRODUCT_PROPERTY_OVERRIDES += ro.project=$(PROJECT_NAME)

#如果PROJECT_NAME为test,则***
ifeq ($(strip $(PROJECT_NAME)),test)
***
endif

#如果PROJECT_NAME为test,则***
ifeq ($(PROJECT_NAME),test)
***
endif

#如果PROJECT_NAME对应的目录下的文件不为空,则复制此文件到对应的目录,或者复制默认的文件到对应的目录
NEW_APN_FILES := vendor/$(TARGET_PROJECT)/$(PROJECT_NAME)/etc/apns-conf.xml
ifneq ($(wildcard $(NEW_APN_FILES)),)
  PRODUCT_COPY_FILES += $(NEW_APN_FILES):/system/etc/apns-conf.xml
else
  PRODUCT_COPY_FILES += $(LOCAL_PATH)/apns-conf.xml:/system/etc/apns-conf.xml
endif

123456789101112131415161718192021222324

./build/core/Makefile

#如果SUB_PROJECT_NAME和PROJECT_NAME结果不相等
ifneq ($(strip $(SUB_PROJECT_NAME)),$(PROJECT_NAME))
****
endif1234

看到这,其实我们基本上已经是非常清楚为什么多了这些参数,说白了就是加了几个变量,然后根据这些变量,来执行对应的操作。没有什么非常玄的东西。

TARGET_PRODUCT

TARGET_PRODUCT值为对应编译项目的选择,就是lunch时选择的项目

TARGET_BUILD_VARIANT

TARGET_BUILD_VARIANT值对应项目的选择编译类型,就是lunch时选择项目的编译类型,如user,userdebug,eng
---------------------
作者:hfreeman2008
来源:CSDN
原文:https://blog.csdn.net/hfreeman2008/article/details/72490894?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

发布了6 篇原创文章 · 获赞 44 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/sinat_29255093/article/details/83067595