android.mk文件里的 是什么意思,浅析Android下的Android.mk文件(三)

因为从事着android驱动开发所以天天要接触Android.mk。

1、在运行  . build/envsetup.sh 会生成一些操作例如:chooseproduct mmm

2、运行 chooseproduct project  选择所要编译的工程

3、运行make,回去编译整个android source

怎么说到了编译Android Source的方法呢

切入主题 先写一个简单的Android.mk

LOCAL_PATH := $(call my-dir) #指定当前目录

include $(CLEAR_VARS) #引入编译变量

LOCAL_MODULE_TAGS := optional #编译选项便是在何种情况下编译

LOCAL_SRC_FILES := hello.c #源文件(可以指定多个)

LOCAL_MODULE := hello #编译出来的模块名

LOCAL_MODULE_CLASS := EXECUTABLES #指定编译之后放置的位置(此处指示放在system/bin下)

include $(BUILD_EXECUTABLE) #引入编译成可执行文件的规则

以上的Android.mk 会编译出一个hello的可执行文件,并放入system/bin

LOCAL_PATH : 指定目录,以上是一般用法指示当前目录(my-dir函数是Android编译时. build/envsetup.sh命令生成的 能够获取当前目录的路径)

CLEAR_VARS: android有自己的一套代码编译规则跟编译选项等变量的定义,此变量会引入,实际是android/build/core下的clear_vas.mk,

##########################################################

## Clear out values of all variables used by rule templates.

###########################################################

LOCAL_MODULE:=

LOCAL_MODULE_PATH:=

LOCAL_MODULE_STEM:=

LOCAL_DONT_CHECK_MODULE:=

LOCAL_CHECKED_MODULE:=

.

.

.

LOCAL_CERTIFICATE:=

LOCAL_SDK_VERSION:=

LOCAL_NDK_VERSION:=

LOCAL_NO_EMMA_INSTRUMENT:=

LOCAL_NO_EMMA_COMPILE:=

LOCAL_PROGUARD_ENABLED:= # '',optonly,full,custom

LOCAL_PROGUARD_FLAGS:=

LOCAL_PROGUARD_FLAG_FILES:=

LOCAL_EMMA_COVERAGE_FILTER:=

LOCAL_MANIFEST_FILE:=

LOCAL_BUILD_HOST_DEX:=

LOCAL_DEX_PREOPT:=

LOCAL_DEX_PREOPT:=

# Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to

# iterate over thousands of entries every time.

# Leave the current makefile to make sure we don't break anything

# that expects to be able to find the name of the current makefile.

MAKEFILE_LIST := $(lastword $(MAKEFILE_LIST))在编译C/C++代码时候常用的变量定义

LOCAL_MODULE 指示当前编译出来的模块名

LOCAL_MODULE_TAGS 标识在什么情况下去编译起模块

有几个选项

user

模块只在user下编译

eng

模块在eng模式下编译

tests

test状态下编译

optional

此模块在所有版本下都编译(??有疑问:见浅析Android下的Android.mk文件(补充))即 TARGET_BUILD_VARIANT=eng 编译TAGS为eng和optional的模块

LOCAL_SRC_FILES 表示编译出此模块需要的源程序 可以有多个

LOCAL_C_INCLUDE  如果不去调用标准库头文件,跟当前目录的头文件,则需要在此指定头文件的位置,在此指定头文件的目录。

LOCAL_STATIC_LIBRARIES:  指定需要连接的静态库像一些比较通用的标准库就无需指定了

LOCAL_SHARED_LIBRARIES: 指定需要连接的动态库

最后include $(BUILD_XXX) 表示编译出来的模块类型,有三种

BUILD_EXECUTABLE

编译成可执行的模块

build/core/host_executable.mk

BUILD_STATIC_LIBRARY

编译成静态库

build/core/host_static_library.mk

BUILD_SHARED_LIBRARY

编译成动态库

build/core/host_shared_library.mk

LOCAL_MODULE_CLASS 标识了所编译模块最后放置的位置,

如果不指定,不会放到系统中,会放在最后的obj目录下的对应目录中(见上一篇浅析Android下的Android.mk文件(二))。

LOCAL_MODULE_CLASS := ETC                                    #表示放于system/etc目录

LOCAL_MODULE_CLASS := EXECUTABLES               #放于/system/bin

LOCAL_MODULE_CLASS := SHARED_LIBRARIES     #放在/system/lib下

build/core下有很多编译的全局的mk,如编译C/C++规则definitions.mk ......

再说一下编译内核模块的Makefile

ifneq ($(KERNELRELEASE),) #查看是都已定义kernel版本

obj-m := gps_onoff.o #如果已定义则编译出得模块名是gps_onoff.o

#(在linux2.6编译模块后会生成module_name.ko module_name.o

#使用insmod module_name.ko来装载模块moudule_name.o已经弃用

#即moudule_name.ko 是最终产物)

else #第一次运行时候会走此分支

PWD := $(shell pwd) #指定源文件目录

KDIR ?= /home/zk/POP_TD/marvell-pxa920-kernel #指定到已经编译的内核的目录

#如果编译PC机上的模块则指定到当前运行的内核

#(uname -r 查看当前的内核版本)

#(此时内核版本也被定义KERNELRELEASE非空)

#内核编译命令 此处可以指定硬件体系与交叉编译工具

all:

$(MAKE) -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-eabi-

#重新编译内核前需要先make clean 清空编译生成的文件 否则编译会出错

clean:

rm -rf .* *.ko *.o *.cmd *.tmp_version *.mod.c *.order Module.*endif

编译模块的Makefile会被读取两次,Makefile从命令行调用时候KERNELRELEASE尚未设置,

在运行到KDIR时即会指向一个内核构造树,

在运行$(MAKE)时 会会第二次运行make命令,此时设置obj-m 构造真正的内核模块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值