android config.mk,android编译分析之10—config.mk

config.mk可以说是android编译系统中关于配置环境的一个总的makefile,定义了编译环境的方方面面。执行完config.mk就完成了android编译系统的所有准备工作,即准备好了所有的编译需要的全局变量,下一步直接执行make,即可产生镜像文件。

首先,定义了一些变量和目录,

# Only use ANDROID_BUILD_SHELL to wrap around bash.

# DO NOT use other shells such as zsh.

ifdef ANDROID_BUILD_SHELL

SHELL := $(ANDROID_BUILD_SHELL)

else

# Use bash, not whatever shell somebody has installed as /bin/sh

# This is repeated from main.mk, since envsetup.sh runs this file

# directly.

SHELL := /bin/bash

endif

# Utility variables.

empty :=

space := $(empty) $(empty)

comma := ,

# Note that make will eat the newline just before endef.

define newline

endef

# Unfortunately you can't simply define backslash as \ or \\.

backslash := \a

backslash := $(patsubst %a,%,$(backslash))

# Tell python not to spam the source tree with .pyc files. This

# only has an effect on python 2.6 and above.

export PYTHONDONTWRITEBYTECODE := 1

# Standard source directories.

SRC_DOCS:= $(TOPDIR)docs

# TODO: Enforce some kind of layering; only add include paths

# when a module links against a particular library.

# TODO: See if we can remove most of these from the global list.

SRC_HEADERS := \

$(TOPDIR)system/core/include \

$(TOPDIR)system/media/audio/include \

$(TOPDIR)hardware/libhardware/include \

$(TOPDIR)hardware/libhardware_legacy/include \

$(TOPDIR)hardware/ril/include \

$(TOPDIR)libnativehelper/include \

$(TOPDIR)frameworks/native/include \

$(TOPDIR)frameworks/native/opengl/include \

$(TOPDIR)frameworks/av/include \

$(TOPDIR)frameworks/base/include

SRC_HOST_HEADERS:=$(TOPDIR)tools/include

SRC_LIBRARIES:= $(TOPDIR)libs

SRC_SERVERS:= $(TOPDIR)servers

SRC_TARGET_DIR := $(TOPDIR)build/target

SRC_API_DIR := $(TOPDIR)prebuilts/sdk/api

SRC_SYSTEM_API_DIR := $(TOPDIR)prebuilts/sdk/system-api

# Some specific paths to tools

SRC_DROIDDOC_DIR := $(TOPDIR)build/tools/droiddoc

然后调用pathmap.mk,包含一些hard code的路径,

# Various mappings to avoid hard-coding paths all over the place

include $(BUILD_SYSTEM)/pathmap.mk

下面的这些变量在我们写Android.mk时经常会用到,一般都是通过include调用,其实都是一些makefile文件,

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

# Build system internal files

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

BUILD_COMBOS:= $(BUILD_SYSTEM)/combo

CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk

BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk

BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk

BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk

BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk

BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk

BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk

BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk

BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk

BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk

BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk

BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk

BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk

BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk

BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk

BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk

BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk

BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk

BUILD_NATIVE_BENCHMARK := $(BUILD_SYSTEM)/native_benchmark.mk

BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk

BUILD_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/shared_test_lib.mk

BUILD_HOST_SHARED_TEST_LIBRARY := $(BUILD_SYSTEM)/host_shared_test_lib.mk

BUILD_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/static_test_lib.mk

BUILD_HOST_STATIC_TEST_LIBRARY := $(BUILD_SYSTEM)/host_static_test_lib.mk

BUILD_NOTICE_FILE := $(BUILD_SYSTEM)/notice_files.mk

BUILD_HOST_DALVIK_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_java_library.mk

BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY := $(BUILD_SYSTEM)/host_dalvik_static_java_library.mk

如果make的目标中包含showcommands,则会打印完整的命令。

# The 'showcommands' goal says to show the full command

# lines being executed, instead of a short message about

# the kind of operation being done.

SHOW_COMMANDS:= $(filter showcommands,$(MAKECMDGOALS))

定义了一些全局变量,cflags,常用文件后缀等,

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

# Set common values

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

# These can be changed to modify both host and device modules.

COMMON_GLOBAL_CFLAGS:= -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith

COMMON_RELEASE_CFLAGS:= -DNDEBUG -UDEBUG

COMMON_GLOBAL_CPPFLAGS:= $(COMMON_GLOBAL_CFLAGS) -Wsign-promo -std=gnu++11

COMMON_RELEASE_CPPFLAGS:= $(COMMON_RELEASE_CFLAGS)

GLOBAL_CFLAGS_NO_OVERRIDE := \

-Werror=int-to-pointer-cast \

-Werror=pointer-to-int-cast \

GLOBAL_CPPFLAGS_NO_OVERRIDE :=

# Set the extensions used for various packages

COMMON_PACKAGE_SUFFIX := .zip

COMMON_JAVA_PACKAGE_SUFFIX := .jar

COMMON_ANDROID_PACKAGE_SUFFIX := .apk

# list of flags to turn specific warnings in to errors

TARGET_ERROR_FLAGS := -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point

ifdef TMPDIR

JAVA_TMPDIR_ARG := -Djava.io.tmpdir=$(TMPDIR)

else

JAVA_TMPDIR_ARG :=

endif

buildspec.mk还没研究咋用,-include可以看出不是强制必须存在的,

# ---------------------------------------------------------------

# Try to include buildspec.mk, which will try to set stuff up.

# If this file doesn't exist, the environment variables will

# be used, and if that doesn't work, then the default is an

# arm build

ifndef ANDROID_BUILDSPEC

ANDROID_BUILDSPEC := $(TOPDIR)buildspec.mk

endif

-include $(ANDROID_BUILDSPEC)

include了envsetup.mk,前面已经介绍,设置了很多编译相关的变量。

# ---------------------------------------------------------------

# Define most of the global variables. These are the ones that

# are specific to the user's build configuration.

include $(BUILD_SYSTEM)/envsetup.mk

在调用findleaves.py时设置的选项,

# Pruned directory options used when using findleaves.py

# See envsetup.mk for a description of SCAN_EXCLUDE_DIRS

FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .repo .git)

由于config.mk太长,后面不一一列出来了,找重点的分析,中间主要都是些host和target 编译链相关的变量,还有一些编译需要用的应用程序,例如aapt,aidl等等。

其中调用select.mk主要是为了设置host和target编译链相关的变量。

#下面调用select.mk设置host端,即编译机的编译链,gcc ar等

combo_target := HOST_

combo_2nd_arch_prefix :=

include $(BUILD_SYSTEM)/combo/select.mk

# Load the 2nd host arch if it's needed.

ifdef HOST_2ND_ARCH

combo_target := HOST_

# 2ND_

combo_2nd_arch_prefix := $(HOST_2ND_ARCH_VAR_PREFIX)

include $(BUILD_SYSTEM)/combo/select.mk

endif

# on windows, the tools have .exe at the end, and we depend on the

# host config stuff being done first

# 下面调用select.mk设置target端,即目标机的编译链,gcc ar等

combo_target := TARGET_

combo_2nd_arch_prefix :=

include $(BUILD_SYSTEM)/combo/select.mk

# Load the 2nd target arch if it's needed.

ifdef TARGET_2ND_ARCH

combo_target := TARGET_

combo_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)

include $(BUILD_SYSTEM)/combo/select.mk

endif

然后include了ccache,为了加快再次编译速度,关于ccache后续再研究。

include $(BUILD_SYSTEM)/ccache.mk

接着include了javac.mk,用来设置java编译器,

include $(BUILD_SYSTEM)/combo/javac.mk

同时在android6.0以上默认使用jack进行编译,在javac.mk中,如果ANDROID_COMPILE_WITH_JACK默认没设置,就设置为true。

ifndef ANDROID_COMPILE_WITH_JACK

# Defines if compilation with jack is enabled by default.

ANDROID_COMPILE_WITH_JACK := true

endif

接着包含了clang相关的makefile,关于clang后续再研究。

include $(BUILD_SYSTEM)/clang/config.mk

注:Clang是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言。传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd)。在编译过程中,前端主要负责词法和语法分析,将源代码转化为抽象语法树;优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效;后端则是将已经优化的中间代码转化为针对各自平台的机器代码。Clang则是以LLVM为后端的一款高效易用,并且与IDE结合很好的编译前端。

最后include了dumpvar.mk,就是专为打印变量值的makefile,前面已经分析过。

include $(BUILD_SYSTEM)/dumpvar.mk

envsetup.sh中的一些函数,例如check_product,最终就是make config.mk,而make的目标为dumpvar-*。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Spring中记录JAX-WS SOAP消息

每当在Spring中使用JAX-WS时,您可能都希望记录传入和传出的SOAP消息-如果仅用于开发过程中的调试。 因此,第一件事就是增加日志级别,对吗? 不幸的是,这将无效。 您将要做的是利用javax.xml.ws.handler.HandlerResolver…

WordPress /wp-admin/includes/post.php user_ID 参数操作权限提升漏洞

漏洞版本: WordPress 3.6 漏洞描述: Bugtraq ID:62346 CVE ID:CVE-2013-4340WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设自己的网志WordPress wp-admin/includes/post.php脚本在处理user_ID参数时存在一个安全漏洞&…

rip协议中周期性广播路由信息的报文_技术实操||距离矢量路由协议-RIP

距离矢量路由协议—RIP01距离矢量路由协议概述路由信息协议RIP(RoutingInformation Protocol)的简称,它是一种基于距离矢量(Distance-Vector)算法的协议,使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。RIP是一种比较简单的…

android中可以有两个焦点吗,android – 如何通过焦点在屏幕上调整两个片段的大小?...

我有三个片段,前两个填充80%的屏幕,最后一个填充其余的片段(这个片段永远不会改变大小).我希望,在用户(焦点)输入片段后,调整片段的大小,使其填满屏幕的70%(将10%留给另一个).像这样:可以通过动态改变碎片的重量吗?或者…

使用tinylog 1.0简化您的日志记录

tinylog的大小仅为75 KB,是广泛使用的经典日志记录框架Log4j和Logback的轻型替代方案。 经过三年的开发,最终版本1.0刚刚于 3月底发布 。 在几个设计问题中,tinylog采取了与Java中经典日志记录框架完全不同的方法。 本文将介绍与Log4j和Logba…

MySQL : 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost...

MySQL : 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost 摘自: http://www.cnblogs.com/xyzdw/archive/2011/08/11/2135227.html 报错:1130-host ... is not allowed to connect to this MySql server 解决方法&#x…

华谊兄弟出现什么问题_什么是语言训练?这就要从语言问题的出现说起了

开口、发音是每一个孩子在语言发展过程中所不可少的经历,他们从周围环境中获取到的各种信息转化为想要表达的内容。虽然一开始孩子的语言并没有成年人那么流畅和准确,但随着时间的推移,他们的说话发音愈发成熟。只是,并不是所有孩…

【算法提升—力扣每日一刷】五日总结【12/18--12/22】

文章目录 2023/12/18LeetCode每日一刷:[20. 有效的括号](https://leetcode.cn/problems/valid-parentheses/) 2023/12/19LeetCode每日一刷:[150. 逆波兰表达式求值(后缀表达式运算)](https://leetcode.cn/problems/evaluate-rever…

CompletableFuture不能被打断

我已经写了很多有关InterruptedException和中断线程的文章 。 简而言之,如果您没有Future.cancel()调用Future.cancel()那么Future将终止待处理的get() ,但还将尝试中断基础线程。 这是一个非常重要的功能,可以更好地利用线程池。 我还写信总…

Nginx 禁止部分 User-Agrent 访问

经常有一些垃圾爬虫,完全不管你受得了受不了,完全不管你的 robots.txt ,拼命的爬你的网站,用下面方面可以帮这帮垃圾干掉。 location / { root /home/www/; if ($http_user_agent ~* "qihoobot") { retu…

crio电压采集 labview_NI cDAQ917采集温度方法

NI cDAQ-9171是一款由总线供电的单槽NI CompactDAQ USB机箱,适合较小的便携式传感器测量系统。cDAQ-9171可与50多款专用测量模块配合使用,用于构建模拟输出、数字I/O或计数器/定时器测量系统。这些模块适用于各种传感器测量,包括热电偶、RTD、…

JPA 2.1如何成为新的EJB 2.0

美丽在于情人眼中。 “轻松”也是如此: 了解有关SQL结果集映射的更多信息,并轻松处理本机查询结果: http : //t.co/WH4BTlClIP #JPA #Java #JavaEE — Thorben Janssen( thjanssen123) 2015年4月15日 Thorben撰写了…

常见问题摘要(生活篇)

1 lingoes软件安装了,却没发现怎么取词? 答:在软件设置里面,修改取词模式,一般以鼠标左键按下ctrl 为标准操作。转载于:https://www.cnblogs.com/lastshadow/p/3330146.html

android finish 区别,Android Activity类finish、onDestory和System.exit介绍

image.pngfinish函数Activity.finish()Call this when your activity is done and should be closed.在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。当调用此方法的时候,系统只是将最上面的Activity移出了栈&#xf…

github哪些协议能商用_GitHub 上有哪些一般人也可以用的项目?

​之前有不少粉丝来信询问:能否给初步接触 GitHub 的用户,推荐几个比较实用、容易看懂,无需具备太多专业知识便能上手使用的项目呢?答案是:有的。今天,我们就上述问题,来聊聊 GitHub 上有哪几个…

在JVM中记录世界停顿

不同的事件可能导致JVM暂停所有应用程序线程。 这种暂停称为世界停止(STW)暂停。 触发STW暂停的最常见原因是垃圾回收( 例如github中的示例 ),但是不同的JIT操作( 示例 ),偏向锁吊销…

目睹鸿蒙开创四大至高位面,吞噬星空 绝非鸿蒙系列,完结前最后的分析【申精】...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼先说说空间的划分:第一要说的是空间等级的划分,盘龙里分的很清楚,物质位面,七大神位面,四大至高位面,说得很清楚,物质位面虽然是最低等的位面&…

小程序确定取消弹窗_小程序开发之弹出框

小程序开发过程中,很多地方为了便利我们多采用小程序自带弹出框来实现交互效果。这也够大多数开发使用,下面我给大家详细介绍下小程序弹出框wx.showToast()title:显示的提示信息,在没有图标的情况下,文本内容可显示两行…

jOOQ与Hibernate:何时选择哪个

Hibernate已成为Java生态系统中的事实上的标准,事实上, 如果标准对您很重要 ,并且如果您将JCP与ISO,ANSI,IEEE等置于同一级别,那么Hibernate也是实际的JavaEE标准实现。 本文的目的不是讨论标准&#xff0…

【IE6的疯狂之四】IE6文字溢出BUG

在IE6下使用浮动可能会出现文字重复的情况. 在IE6下&#xff0c;浮动层之间有注释文字的话&#xff0c;之前那个浮动层的内容文字就有可能遭遇一个“隐形”的复制&#xff0c;但是代码里查看文字可并没有多出来。 看个例子&#xff1a; XML/HTML代码<!DOCTYPE html PUBLIC ”…