Makefile笔记(一)

 以前写过些简单的Makefile文件,现在工作需要,要写些稍微复杂点的makefile文件,我们在ROM开发时,有些apk经常更新或添加,导致apk依赖的库文件也要手动进行添加或删除,为了实现自动化,同事茂哥写了个.mk文件进行自动的解压并提起依赖的库文件,我现在就是学习茂哥的.mk文件,自己练习了一遍,现记录下,方便以后查看。
     实现自动化,也就是把apk依赖的库文件解压出来并全部拷贝到system/lib目录下,apk全部拷贝到system/app目录下。我们只要定义一个变量,该变量记录了,所以apk依赖的库文件的路径,另一个变量记录apk文件的路径,最终我们以这两个变量进行拷贝动作。具体代码如下:
ifeq ($(LOCAL_PATH), )                             #判断LOCAL_PATH变量,是否为空
LOCAL_PATH := .                              #LOCAL_PATH为空,则LOCAL_PATH表示当前路径值
else
LOCAL_PATH := $(LOCAL_PATH)/third_apk    #如果LOCAL_PATH不为空, 则LOCAL_PATH就表示当前目录的子目录third_apk
#$(info LOCAL_PATH=$(LOCAL_PATH))
endif
$(warning "the value of LOCAL_PATH is $(LOCAL_PATH)")     #warning 是我用来查看变量的值,主要输出log信息,以下warning 同理

#echo $(LOCAL_PATH)

THIRD_APKS := $(shell find $(LOCAL_PATH) -name "*.apk")           #调用shell  find命令在LOCAL_PATH目录查找.apk文件,
#THIRD_APKS := $(shell find . -name "*.apk")                                   #并把查找的结果保存在THIRD_APKS变量中
#$(info THIRD_APKS=$(THID_APKS))
$(warning "the THIRD_APKS=$(THIRD_APKS)")                              

#从THIRD_APKS变量中,过滤掉 PPTVLauncher-release.apk
THIRD_APKS := $(filter-out %PPTVLauncher-release.apk, $(THIRD_APKS))   
$(warning "FILTER-OUT AFTER THIRD_APKS=$(THIRD_APKS)")
#去掉.apk扩展名,并把结果保存到THIRD_DIRS变量中
THIRD_DIRS := $(THIRD_APKS:%.apk=%)
#$(warning "THIRD_DIRS=$(THIRD_DIRS)")
#$(info THIRD_DIRS=$(THIRD_DIRS))
#$(warning "xxx=$($1)")
#定义一个解压apk,并找出以.so结尾文件变量,该变量将被后面call函数调用,awk '{print $$4}'将输出第四列结果
#unzip -l 只是列出apk文件的具体信息,并没有解压
list_dso = $(shell unzip -l  $1 | grep "\.so$$" | awk '{ print $$4 }')
#list_dso = $(shell unzip -l $1 | grep "\.so$$" | awk '{print $$4}')
$(warning "_____THIRD=$(THIRD_APKS:%.apk=%)")
$(warning "_____THIRD=$(THIRD_APKS)")
#遍历每个apk,并调用call list_dso进行解压出.so文件,把最终结果保存到THIRD_DSOS变量中
THIRD_DSOS := $(foreach APK, $(THIRD_APKS), $(addprefix $(APK:%.apk=%)/, $(call list_dso, $(APK))))
#$(info THIRD_DSOS = $(THIRD_DSOS))
$(warning "THIRD_DSOS=$(THIRD_DSOS)")
#遍历每个apk,并以xx/xx/xx.apk:/system/app/xx.apk的形式保存到变量PRODUCT_COPY_FILES中,
#其中 xx/xx/xx.apk代表apk源文件路径, /system/app/xx.apk拷贝的目的路径
PRODUCT_COPY_FILES += $(foreach APK, $(THIRD_APKS), $(APK):./system/app/$(notdir $(APK)))
$(warning "PRODUCT_COPY_FILES=$(PRODUCT_COPY_FILES)")
遍历每个.so,并以xx/xx/xx.so:/system/lib/xx.so的形式保存到变量PRODUCT_COPY_FILES中  
PRODUCT_COPY_FILES += $(foreach DSO, $(THIRD_DSOS), $(DSO):./system/lib/$(notdir $(DSO)))
$(warning "PRODUCT_COPY_FILES=$(PRODUCT_COPY_FILES)")
#ROM生成时,我们只要根据这个变量,来实现拷贝动作
#.PHONY: update_third_dso
#update_third_dso: $(THIRD_DSOS)

.PHONY: clean_third_dso
clean_third_dso:
rm -rf $(THIRD_DIRS)
rm -rf $(foreach APK, $(THIRD_APKS), ./system/app/$(notdir $(APK)))
rm -rf $(foreach DSO, $(THIRD_DSOS), ./system/app/$(notdir $(DSO)))

#开始解压apk文件
$(THIRD_DIRS): % :%.apk               #THIRD_DIRS变量都后面添加.apk扩展名,如xxx -> xxx.apk
-unzip -d $@ $< "*.so"              #开始解压,解压xxx.apk并把.so文件放到xxx/目录下
$(THIRD_DSOS):$(THIRD_DIRS)  


最后保存名为third_apk.mk。
运行命令:make -f third_apk.mk
就可以看到结果,可以用warning 函数来输出变量值查看结果。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值