在Android编译框架中,把许多固定的、反复用到的目录路径定义为 宏变量,常用 宏 如下:

out/target/product/xxx的宏即为:PRODUCT_OUT

out/target/product/xxx/system的宏即为:TARGET_OUT

out/target/product/xxx/root的宏即为:TARGET_ROOT_OUT,

device/test05/BoardConfig.mk 红色部分即为:TARGET_PRODUCT
宏,一般 TARGET_PRODUCT、 PRODUCT_DEVICE、TARGET_DEVICE,指的是同一个值。

  大多数的宏变量 定义位置:build/core/envsetup.mk

+++++++++++++++++++++++++++++++++++++++++++++++++++

# Variables we check:

#     HOST_BUILD_TYPE = { release debug }

#     TARGET_BUILD_TYPE = { release debug }

# and we output a bunch of variables, see the case statement at

# the bottom for the full list

#     OUT_DIR is also set to "out" if it's not already set.

#         this allows you to set it to somewhere else if you like



# Set up version information.

include $(BUILD_SYSTEM)/version_defaults.mk



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

# If you update the build system such that the environment setup

# or buildspec.mk need to be updated, increment this number, and

# people who haven't re-run those will have to do so before they

# can build.  Make sure to also update the corresponding value in

# buildspec.mk.default and envsetup.sh.

CORRECT_BUILD_ENV_SEQUENCE_NUMBER := 10



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

# The product defaults to generic on hardware

# NOTE: This will be overridden in product_config.mk if make

# was invoked with a PRODUCT-xxx-yyy goal.

ifeq ($(TARGET_PRODUCT),)

TARGET_PRODUCT := full

endif





# the variant -- the set of files that are included for a build

ifeq ($(strip $(TARGET_BUILD_VARIANT)),)

TARGET_BUILD_VARIANT := eng

endif



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

# Set up configuration for host machine.  We don't do cross-

# compiles except for arm, so the HOST is whatever we are

# running on



UNAME := $(shell uname -sm)



# HOST_OS

ifneq (,$(findstring Linux,$(UNAME)))

    HOST_OS := linux

endif

ifneq (,$(findstring Darwin,$(UNAME)))

    HOST_OS := darwin

endif

ifneq (,$(findstring Macintosh,$(UNAME)))

    HOST_OS := darwin

endif

ifneq (,$(findstring CYGWIN,$(UNAME)))

    HOST_OS := windows

endif



# BUILD_OS is the real host doing the build.

BUILD_OS := $(HOST_OS)



# Under Linux, if USE_MINGW is set, we change HOST_OS to Windows to build the

# Windows SDK. Only a subset of tools and SDK will manage to build properly.

ifeq ($(HOST_OS),linux)

ifneq ($(USE_MINGW),)

    HOST_OS := windows

endif

endif



ifeq ($(HOST_OS),)

$(error Unable to determine HOST_OS from uname -sm: $(UNAME)!)

endif





# HOST_ARCH

ifneq (,$(findstring 86,$(UNAME)))

    HOST_ARCH := x86

endif



ifneq (,$(findstring Power,$(UNAME)))

    HOST_ARCH := ppc

endif



BUILD_ARCH := $(HOST_ARCH)



ifeq ($(HOST_ARCH),)

$(error Unable to determine HOST_ARCH from uname -sm: $(UNAME)!)

endif



# the host build defaults to release, and it must be release or debug

ifeq ($(HOST_BUILD_TYPE),)

HOST_BUILD_TYPE := release

endif



ifneq ($(HOST_BUILD_TYPE),release)

ifneq ($(HOST_BUILD_TYPE),debug)

$(error HOST_BUILD_TYPE must be either release or debug, not '$(HOST_BUILD_TYPE)')

endif

endif



# This is the standard way to name a directory containing prebuilt host

# objects. E.g., prebuilt/$(HOST_PREBUILT_TAG)/cc

ifeq ($(HOST_OS),windows)

  HOST_PREBUILT_TAG := windows

else

  HOST_PREBUILT_TAG := $(HOST_OS)-$(HOST_ARCH)

endif



# TARGET_COPY_OUT_* are all relative to the staging directory, ie PRODUCT_OUT.

# Define them here so they can be used in product config files.

TARGET_COPY_OUT_SYSTEM := system

TARGET_COPY_OUT_DATA := data

TARGET_COPY_OUT_VENDOR := system/vendor

TARGET_COPY_OUT_ROOT := root

TARGET_COPY_OUT_RECOVERY := recovery




# Read the product specs so we an get TARGET_DEVICE and other

# variables that we need in order to locate the output files.

include $(BUILD_SYSTEM)/product_config.mk



build_variant := $(filter-out eng user userdebug tests,$(TARGET_BUILD_VARIANT))

ifneq ($(build_variant)-$(words $(TARGET_BUILD_VARIANT)),-1)

$(warning bad TARGET_BUILD_VARIANT: $(TARGET_BUILD_VARIANT))

$(error must be empty or one of: eng user userdebug tests)

endif



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

# Set up configuration for target machine.

# The following must be set:

#         TARGET_OS = { linux }

#         TARGET_ARCH = { arm | x86 }





ifeq ($(TARGET_ARCH),)

TARGET_ARCH := arm

endif

TARGET_OS := linux



# the target build type defaults to release

ifneq ($(TARGET_BUILD_TYPE),debug)

TARGET_BUILD_TYPE := release

endif




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

# figure out the output directories



ifeq (,$(strip $(OUT_DIR)))

ifeq (,$(strip $(OUT_DIR_COMMON_BASE)))

OUT_DIR := $(TOPDIR)out  #指定 OUT_DIR 为 out/

else

OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD))

endif

endif



DEBUG_OUT_DIR := $(OUT_DIR)/debug



# Move the host or target under the debug/ directory

# if necessary.

TARGET_OUT_ROOT_release := $(OUT_DIR)/target

TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target

TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE)) #TARGET_BUILD_TYPE这个变量 一般 lunch的时候 指定



HOST_OUT_ROOT_release := $(OUT_DIR)/host

HOST_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/host

HOST_OUT_ROOT := $(HOST_OUT_ROOT_$(HOST_BUILD_TYPE))



HOST_OUT_release := $(HOST_OUT_ROOT_release)/$(HOST_OS)-$(HOST_ARCH)

HOST_OUT_debug := $(HOST_OUT_ROOT_debug)/$(HOST_OS)-$(HOST_ARCH)

HOST_OUT := $(HOST_OUT_$(HOST_BUILD_TYPE))



BUILD_OUT := $(OUT_DIR)/host/$(BUILD_OS)-$(BUILD_ARCH)



TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product




TARGET_COMMON_OUT_ROOT := $(TARGET_OUT_ROOT)/common

HOST_COMMON_OUT_ROOT := $(HOST_OUT_ROOT)/common



PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)  #TARGET_DEVICE 在 product_config.mk 里定义,最终 由 PRODUCT_DEVICE决定,而这个 变量是在 具体 lunch 的时候 指定;



OUT_DOCS := $(TARGET_COMMON_OUT_ROOT)/docs



BUILD_OUT_EXECUTABLES:= $(BUILD_OUT)/bin



HOST_OUT_EXECUTABLES:= $(HOST_OUT)/bin

HOST_OUT_SHARED_LIBRARIES:= $(HOST_OUT)/lib

HOST_OUT_JAVA_LIBRARIES:= $(HOST_OUT)/framework

HOST_OUT_SDK_ADDON := $(HOST_OUT)/sdk_addon



HOST_OUT_INTERMEDIATES := $(HOST_OUT)/obj

HOST_OUT_HEADERS:= $(HOST_OUT_INTERMEDIATES)/include

HOST_OUT_INTERMEDIATE_LIBRARIES := $(HOST_OUT_INTERMEDIATES)/lib

HOST_OUT_STATIC_LIBRARIES := $(HOST_OUT_INTERMEDIATE_LIBRARIES)

HOST_OUT_NOTICE_FILES:=$(HOST_OUT_INTERMEDIATES)/NOTICE_FILES

HOST_OUT_COMMON_INTERMEDIATES := $(HOST_COMMON_OUT_ROOT)/obj



TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj


TARGET_OUT_HEADERS:= $(TARGET_OUT_INTERMEDIATES)/include

TARGET_OUT_INTERMEDIATE_LIBRARIES := $(TARGET_OUT_INTERMEDIATES)/lib

TARGET_OUT_COMMON_INTERMEDIATES := $(TARGET_COMMON_OUT_ROOT)/obj



TARGET_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_SYSTEM)

TARGET_OUT_EXECUTABLES:= $(TARGET_OUT)/bin

TARGET_OUT_OPTIONAL_EXECUTABLES:= $(TARGET_OUT)/xbin

TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib

TARGET_OUT_JAVA_LIBRARIES:= $(TARGET_OUT)/framework


TARGET_OUT_APPS:= $(TARGET_OUT)/app

TARGET_OUT_KEYLAYOUT := $(TARGET_OUT)/usr/keylayout

TARGET_OUT_KEYCHARS := $(TARGET_OUT)/usr/keychars

TARGET_OUT_ETC := $(TARGET_OUT)/etc

TARGET_OUT_STATIC_LIBRARIES:= $(TARGET_OUT_INTERMEDIATES)/lib

TARGET_OUT_NOTICE_FILES:=$(TARGET_OUT_INTERMEDIATES)/NOTICE_FILES

TARGET_OUT_FAKE := $(PRODUCT_OUT)/fake_packages



TARGET_OUT_DATA := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_DATA)

TARGET_OUT_DATA_EXECUTABLES:= $(TARGET_OUT_EXECUTABLES)

TARGET_OUT_DATA_SHARED_LIBRARIES:= $(TARGET_OUT_SHARED_LIBRARIES)

TARGET_OUT_DATA_JAVA_LIBRARIES:= $(TARGET_OUT_JAVA_LIBRARIES)


TARGET_OUT_DATA_APPS:= $(TARGET_OUT_DATA)/app

TARGET_OUT_DATA_KEYLAYOUT := $(TARGET_OUT_KEYLAYOUT)

TARGET_OUT_DATA_KEYCHARS := $(TARGET_OUT_KEYCHARS)

TARGET_OUT_DATA_ETC := $(TARGET_OUT_ETC)

TARGET_OUT_DATA_STATIC_LIBRARIES:= $(TARGET_OUT_STATIC_LIBRARIES)

TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest



TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache



TARGET_OUT_VENDOR := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)

TARGET_OUT_VENDOR_EXECUTABLES:= $(TARGET_OUT_VENDOR)/bin

TARGET_OUT_VENDOR_OPTIONAL_EXECUTABLES:= $(TARGET_OUT_VENDOR)/xbin

TARGET_OUT_VENDOR_SHARED_LIBRARIES:= $(TARGET_OUT_VENDOR)/lib

TARGET_OUT_VENDOR_JAVA_LIBRARIES:= $(TARGET_OUT_VENDOR)/framework

TARGET_OUT_VENDOR_APPS:= $(TARGET_OUT_VENDOR)/app

TARGET_OUT_VENDOR_ETC := $(TARGET_OUT_VENDOR)/etc



TARGET_OUT_UNSTRIPPED := $(PRODUCT_OUT)/symbols

TARGET_OUT_EXECUTABLES_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/system/bin

TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/system/lib

TARGET_ROOT_OUT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)

TARGET_ROOT_OUT_SBIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/sbin

TARGET_ROOT_OUT_BIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/bin



TARGET_ROOT_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ROOT)


TARGET_ROOT_OUT_BIN := $(TARGET_ROOT_OUT)/bin

TARGET_ROOT_OUT_SBIN := $(TARGET_ROOT_OUT)/sbin

TARGET_ROOT_OUT_ETC := $(TARGET_ROOT_OUT)/etc

TARGET_ROOT_OUT_USR := $(TARGET_ROOT_OUT)/usr



TARGET_RECOVERY_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_RECOVERY)


TARGET_RECOVERY_ROOT_OUT := $(TARGET_RECOVERY_OUT)/root



TARGET_SYSLOADER_OUT := $(PRODUCT_OUT)/sysloader

TARGET_SYSLOADER_ROOT_OUT := $(TARGET_SYSLOADER_OUT)/root

TARGET_SYSLOADER_SYSTEM_OUT := $(TARGET_SYSLOADER_OUT)/root/system



TARGET_INSTALLER_OUT := $(PRODUCT_OUT)/installer

TARGET_INSTALLER_DATA_OUT := $(TARGET_INSTALLER_OUT)/data

TARGET_INSTALLER_ROOT_OUT := $(TARGET_INSTALLER_OUT)/root

TARGET_INSTALLER_SYSTEM_OUT := $(TARGET_INSTALLER_OUT)/root/system



TARGET_FACTORY_RAMDISK_OUT := $(PRODUCT_OUT)/factory_ramdisk



COMMON_MODULE_CLASSES := TARGET-NOTICE_FILES HOST-NOTICE_FILES HOST-JAVA_LIBRARIES



ifeq (,$(strip $(DIST_DIR)))

  DIST_DIR := $(OUT_DIR)/dist

endif



ifeq ($(PRINT_BUILD_CONFIG),)

PRINT_BUILD_CONFIG := true

endif

++++++++++++++++++++++++++++++++++++++

android的 makefile里 的常用 宏定义的更多相关文章

  1. Makefile,如何传递宏定义DEBUG【转】

    转自:http://blog.csdn.net/linuxheik/article/details/8051598 版权声明:本文为博主原创文章,未经博主允许不得转载. Makefile,如何传递宏定 ...

  2. iOS - 常用宏定义和PCH文件知识点整理

    (一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //=============== ...

  3. iOS常用宏定义大全

    宏定义与常量的区别 宏:只是在预处理器里进行文本替换,不做任何类型检查,宏能定义代码,const不能,多个宏编译时间相对较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间. 所以在使用 ...

  4. iOS之常用宏定义

    下面我为大家提供一些常用的宏定义! 将这些宏定义 加入到.pch使用 再也不用 用一次写一次这么长的程序了 //-------------------获取设备大小------------------- ...

  5. iOS 日常工作之常用宏定义大全

    转自:http://www.jianshu.com/p/213b3b96cafe 前言: 在工作中, 很多小伙伴都会在PCH文件定义一些常用的宏,但是又怕写这些简单的宏浪费时间,又有时候忘记怎么定义了 ...

  6. Makefile中的特殊宏定义以及实用选项

    Makefile中的一些特殊宏定义的名字跟shell中的位置变量挺相似的. $?    当前目标所依赖的文件列表中比当前目标文件还要新的文件 $@   当前目标我名字 $<   当前依赖文件的名 ...

  7. iOS常用宏 定义

    总结了iOS开发过程中的一些常用宏,以后会陆陆续续添加进来. 字符串是否为空 1   #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull c ...

  8. 20个C语言中常用宏定义总结

    01: 防止一个头文件被重复包含 #ifndef COMDEF_H#define COMDEF_H//头文件内容#endif 02: 重新定义一些类型防止由于各种平台和编译器的不同,而产生的类型字节数 ...

  9. iOS日常工作之常用宏定义大全

    前言: 在工作中, 很多小伙伴都会在PCH文件定义一些常用的宏,但是又怕写这些简单的宏浪费时间,又有时候忘记怎么定义了怎么办?本人在工作中也是如此.所以在这里给大家分享一些常用的宏定义,喜欢的小伙伴可 ...

随机推荐

  1. [redis] Jedis 与 ShardedJedis 设计

    Jedis设计 Jedis作为推荐的java语言redis客户端,其抽象封装为三部分: 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjec ...

  2. 安装 request模块

    python3 requests 安装包下载安装[windows] 听语音 | 浏览:54 | 更新:2016-07-25 17:09 windows下直接使用:easy_install reques ...

  3. (06)odoo报表

    ----------更新时间:18:06 2016-09-18 星期日18:13 2016-04-05 星期二10:31 2016-03-01 星期二----------* odoo8 采用是Qweb ...

  4. thinkphp @代表什么

    import('@.ORG.Util.RBAC'); @表示在同一目录下.看一下Lib目录下除了Action外,还有ORG目录.如果使用@.ORG.Util.RBAC,则表示RBAC是放在Lib/OR ...

  5. C++继承与派生(原理归纳)

    1.   C++继承与java不同,java遵循单继承,但java的接口为其不足做了很好的弥补了. C++则是灵活的多,为多继承.即一个C++类可以同时继承N个类的属性. 2. 对于继承方式 : 有三 ...

  6. 【如何快速的开发一个完整的iOS直播app】(推流篇)

    前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,肯定需要流媒体服务器,本篇主要讲解直播中流媒体服务器搭建,并且讲解了如 ...

  7. MATLAB 生成数据保存至文件

    % load pyrim % NumTrain = 50; % load machine %NumTrain = 150; % load housing % NumTrain = 300; % loa ...

  8. 菜鸟学习Andriod-弹窗

    菜鸟学习Andriod-弹窗 return new AlertDialog.Builder(ZyScreenSaver.this).setIcon( R.drawable.ic_launcher).s ...

  9. <<薪资至少10K的一道题,你能拿下吗>>练习

    偶尔要写写算法,是我平时用来保持感觉的常用的方法.今天看到园子里一面试题,看了一下感觉也能实现,不过过程确实艰的,自认为自己对算法的感觉还不错.不过这题确实我也用了差不多一下午的时间,基本上把工作时间 ...

  10. influxdb和boltDB简介——底层本质类似LMDB,MVCC+B+树

    influxdb influxdb是最新的一个时间序列数据库,最新一两年才产生,但已经拥有极高的人气.influxdb 是用Go写的,0.9版本的influxdb对于之前会有很大的改变,后端存储有Le ...