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 $@为目标