Android.mk与Makefile基础用法

Android.mk

模块编译

LOCAL_MODULE_CLASS与LOCAL_MODULE_PATH的影响

LOCAL_PATH := $(call my-dir) 	    #定义当前mk文件的目录
include $(CLEAR_VARS)        	    #清除全局变量
LOCAL_MODULE := hello              #生成目标的so文件 
LOCAL_SRC_FILES := hello.c   	    #需要编译的源文件
LOCAL_C_INCLUDES :=                 #加入所需要的头文件路径
LOCAL_STATIC_LIBRARIES :=         #加入所需要链接的静态库(*.a)
LOCAL_SHARED_LIBRARIES :=       #加入所需要编译的动态库(*.so)
LOCAL_MODULE_CLASS := STATIC_LIBRARIES  #所要编译的模块类型 
#include $(BUILD_PREBUILT)需要注意LOCAL_MODULE_CLASS
#编译三种模块的差异性
#(1)
include $(BUILD_SHARED_LIBRARY) #编译生成动态链接库

#(2)
include $(BUILD_STATIC_LIBRARY) #编译生成静态链接库

#(3)
include $(BUILD_EXECUTABLE)     #编译生成应用程序

Call 命令与指定路径

TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib64 #build/core/envsetup.mk中定义
LOCAL_MODUEL_PATH = $(TARGET_OUT_SHARED_LIBRARIES)/camera 可修改为
LOCAL_MODULE_RELATIVE_PATH := camera #动态库的相对路径
 
CAM_GEN_DIR := $(call local-generated-sources-dir)/generated #系统自动生成的宏定义
#编译会生成在out/target/product/lito/gen/STATIC_LIBRARIES/libcamxgenerated_intermediates/generated

LOCAL_PATH := $(abspath $(call my-dir)/../..) #返回当前的绝对路径

include $(call all-subdir-makefiles) #当前目录没有需要编译文件,向子目录深入
include $(call all-makefiles-under, $(LOCAL_PATH))#先编译当前目录的,在深入子目录

ifeq/ifneq的用法

Android.mk ifeq/ifneq的用法
判断两个变量都存在,Android.mk中没有 ||  && 操作
ifneq ($(VALUE1)$(VALUE2),)

endif
若要判断两个变量具体的值
ifneq ($(findstring $(VALUE1)$(VALUE2), V1, V2),)

endif

打印输出

$(warning string)
$(error string)
$(warning $(var))
$(shell echo "test echo"> $(LOCAL_PATH)/xxx) #echo需要重定向
$(shell uname -m) #其他shell命令 返回计算机名

CAMX客制化log level

vendor/qcom/proprietary/chi-cdk/oem/Android.mk
include $(CAMX_CHICDK_OEM_PATH)/qcom/node/camxoverridesettings/build/android/Android.mk

vendor/qcom/prorietaty/chi-cdk/node/camxoverrdiesettings/build/android/Android.mk

LOCAL_PATH = $(CAMX_CHICDK_PATH)/oem/qcom/node/camxoverridesettings
include $(CLEAR_VARS)
$(shell mkdir -p $(TARGET_OUT_VENDOR)/etc/camera)
$(shell cp $(LOCAL_PAHT)/camxoverridesettings.txt  $(TARGET_OUT_VENDOR/etc/camera)  -ap ) 

Makefile

基本格式

(1)Makefile必须使用TAB缩进
(2)规则可分为三部分:
	目标:依赖1 依赖2 ...
	命令
(3)Makefile还可写作makefile,make执行会将第一个target作为目标文件
(4)四中基本赋值
	=  是最基本的赋值
	:= 是覆盖之前的值
	?= 是如果没有被赋值过就赋予等号后面的值
	+= 是添加等号后面的值

伪目标

Makefile默认目标就是文件,若当前目录下存在文件clean,当执行make会无法继续,伪目标则是作为一个伪造的target不受影响
clean:
	rm hello.c hello.o
.PHONY: clean
	-rm hello.c hello.o 
rm前面的减号-表示不管出现什么问题都要继续做后面的事情

添加宏定义

CFLAGS += -DG_DEBUG #在源码中可以使用#ifdef G_DEBUG XXXX

常用函数

(1)# if 的用法
$(if <condition>, <then part>, <else-part>)

(2)# addprefix/addsuffix加前后缀函数的用法 
$(addprefix <prefixe>, <name1 name2 ...>)

# 案例 1
suffix :=
result1 := $(if($(suffix), $(addprefix %.,$(suffixe)),%)
suffix := c cpp
result2 := $if($(suffix), $(addprefixe %.,$(suffix)),%)
test:
	echo result1 is $(result1)
	echo result2 is $(result2)
输出
	result1 is %
	result2 is %.c %.cpp

(3)# basename/suffix 取前后缀函数的用法
$(basename <names...>)

#案例 2
SRC := src/main.c src/hello.c
OBJ := $(basename $(SRC))
all:
	@echo "$(OBJ)"
输出:
	src/main src/hello   #suffix则是输出.c .c

(4)wildcard 扩展通配符
在定义变量和函数引用时,通配符*将会失效
objects = $(wildcard *.c)

#案例 3
SOURCES = $(wildcard *.c)
OBJECTS = $(patsubst %.c,%.o,$(SOURCES)) #替换通配符
test:$(OBJECTS)
	gcc $^ -o $@  #自动化变量 $^表示所有依赖OBJECTS $@为目标

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值