a83b769566
The purpose of removing global inline options is to give compiler the opportunity to do inline optimizations and inline tunings for Android native codes. By removing these global inline options now, the size of almost all native libraries are reduced. And there is no noticable performance degradation on webkit, gcstone and skia benchmarks. Change-Id: I31e71f51e4f29fa6286fddb89e9eab227581c7b3
290 lines
10 KiB
Makefile
290 lines
10 KiB
Makefile
#
|
|
# Copyright (C) 2006 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
# Configuration for Linux on ARM.
|
|
# Included by combo/select.mk
|
|
|
|
# You can set TARGET_ARCH_VARIANT to use an arch version other
|
|
# than ARMv5TE. Each value should correspond to a file named
|
|
# $(BUILD_COMBOS)/arch/<name>.mk which must contain
|
|
# makefile variable definitions similar to the preprocessor
|
|
# defines in system/core/include/arch/<combo>/AndroidConfig.h. Their
|
|
# purpose is to allow module Android.mk files to selectively compile
|
|
# different versions of code based upon the funtionality and
|
|
# instructions available in a given architecture version.
|
|
#
|
|
# The blocks also define specific arch_variant_cflags, which
|
|
# include defines, and compiler settings for the given architecture
|
|
# version.
|
|
#
|
|
ifeq ($(strip $(TARGET_ARCH_VARIANT)),)
|
|
TARGET_ARCH_VARIANT := armv5te
|
|
endif
|
|
|
|
TARGET_ARCH_SPECIFIC_MAKEFILE := $(BUILD_COMBOS)/arch/$(TARGET_ARCH)/$(TARGET_ARCH_VARIANT).mk
|
|
ifeq ($(strip $(wildcard $(TARGET_ARCH_SPECIFIC_MAKEFILE))),)
|
|
$(error Unknown ARM architecture version: $(TARGET_ARCH_VARIANT))
|
|
endif
|
|
|
|
include $(TARGET_ARCH_SPECIFIC_MAKEFILE)
|
|
|
|
# You can set TARGET_TOOLS_PREFIX to get gcc from somewhere else
|
|
ifeq ($(strip $(TARGET_TOOLS_PREFIX)),)
|
|
TARGET_TOOLS_PREFIX := \
|
|
prebuilt/$(HOST_PREBUILT_TAG)/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-
|
|
endif
|
|
|
|
TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX)
|
|
TARGET_CXX := $(TARGET_TOOLS_PREFIX)g++$(HOST_EXECUTABLE_SUFFIX)
|
|
TARGET_AR := $(TARGET_TOOLS_PREFIX)ar$(HOST_EXECUTABLE_SUFFIX)
|
|
TARGET_OBJCOPY := $(TARGET_TOOLS_PREFIX)objcopy$(HOST_EXECUTABLE_SUFFIX)
|
|
TARGET_LD := $(TARGET_TOOLS_PREFIX)ld$(HOST_EXECUTABLE_SUFFIX)
|
|
TARGET_STRIP := $(HOST_OUT_EXECUTABLES)/soslim$(HOST_EXECUTABLE_SUFFIX)
|
|
TARGET_STRIP_COMMAND = $(TARGET_STRIP) --strip --shady --quiet $< --outfile $@
|
|
|
|
TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined
|
|
|
|
TARGET_arm_CFLAGS := -O2 \
|
|
-fomit-frame-pointer \
|
|
-fstrict-aliasing \
|
|
-funswitch-loops
|
|
|
|
# Modules can choose to compile some source as thumb. As
|
|
# non-thumb enabled targets are supported, this is treated
|
|
# as a 'hint'. If thumb is not enabled, these files are just
|
|
# compiled as ARM.
|
|
ifeq ($(ARCH_ARM_HAVE_THUMB_SUPPORT),true)
|
|
TARGET_thumb_CFLAGS := -mthumb \
|
|
-Os \
|
|
-fomit-frame-pointer \
|
|
-fno-strict-aliasing
|
|
else
|
|
TARGET_thumb_CFLAGS := $(TARGET_arm_CFLAGS)
|
|
endif
|
|
|
|
# Set FORCE_ARM_DEBUGGING to "true" in your buildspec.mk
|
|
# or in your environment to force a full arm build, even for
|
|
# files that are normally built as thumb; this can make
|
|
# gdb debugging easier. Don't forget to do a clean build.
|
|
#
|
|
# NOTE: if you try to build a -O0 build with thumb, several
|
|
# of the libraries (libpv, libwebcore, libkjs) need to be built
|
|
# with -mlong-calls. When built at -O0, those libraries are
|
|
# too big for a thumb "BL <label>" to go from one end to the other.
|
|
ifeq ($(FORCE_ARM_DEBUGGING),true)
|
|
TARGET_arm_CFLAGS += -fno-omit-frame-pointer -fno-strict-aliasing
|
|
TARGET_thumb_CFLAGS += -marm -fno-omit-frame-pointer
|
|
endif
|
|
|
|
android_config_h := $(call select-android-config-h,linux-arm)
|
|
arch_include_dir := $(dir $(android_config_h))
|
|
|
|
TARGET_GLOBAL_CFLAGS += \
|
|
-msoft-float -fpic \
|
|
-ffunction-sections \
|
|
-fdata-sections \
|
|
-funwind-tables \
|
|
-fstack-protector \
|
|
-Wa,--noexecstack \
|
|
-Werror=format-security \
|
|
-fno-short-enums \
|
|
$(arch_variant_cflags) \
|
|
-include $(android_config_h) \
|
|
-I $(arch_include_dir)
|
|
|
|
# This is to avoid the dreaded warning compiler message:
|
|
# note: the mangling of 'va_list' has changed in GCC 4.4
|
|
#
|
|
# The fact that the mangling changed does not affect the NDK ABI
|
|
# very fortunately (since none of the exposed APIs used va_list
|
|
# in their exported C++ functions). Also, GCC 4.5 has already
|
|
# removed the warning from the compiler.
|
|
#
|
|
TARGET_GLOBAL_CFLAGS += -Wno-psabi
|
|
|
|
TARGET_GLOBAL_LDFLAGS += \
|
|
-Wl,-z,noexecstack \
|
|
-Wl,--icf=safe \
|
|
$(arch_variant_ldflags)
|
|
|
|
# We only need thumb interworking in cases where thumb support
|
|
# is available in the architecture, and just to be sure, (and
|
|
# since sometimes thumb-interwork appears to be default), we
|
|
# specifically disable when thumb support is unavailable.
|
|
ifeq ($(ARCH_ARM_HAVE_THUMB_SUPPORT),true)
|
|
TARGET_GLOBAL_CFLAGS += -mthumb-interwork
|
|
else
|
|
TARGET_GLOBAL_CFLAGS += -mno-thumb-interwork
|
|
endif
|
|
|
|
TARGET_GLOBAL_CPPFLAGS += -fvisibility-inlines-hidden
|
|
|
|
# More flags/options can be added here
|
|
ifeq ($(NEED_WORKAROUND_CORTEX_A9_745320),true)
|
|
TARGET_GLOBAL_CFLAGS += -DWORKAROUND_CORTEX_A9_745320
|
|
endif
|
|
|
|
TARGET_RELEASE_CFLAGS := \
|
|
-DNDEBUG \
|
|
-g \
|
|
-Wstrict-aliasing=2 \
|
|
-fgcse-after-reload \
|
|
-frerun-cse-after-loop \
|
|
-frename-registers
|
|
|
|
libc_root := bionic/libc
|
|
libm_root := bionic/libm
|
|
libstdc++_root := bionic/libstdc++
|
|
libthread_db_root := bionic/libthread_db
|
|
|
|
|
|
## on some hosts, the target cross-compiler is not available so do not run this command
|
|
ifneq ($(wildcard $(TARGET_CC)),)
|
|
# We compile with the global cflags to ensure that
|
|
# any flags which affect libgcc are correctly taken
|
|
# into account.
|
|
TARGET_LIBGCC := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) -print-libgcc-file-name)
|
|
endif
|
|
|
|
# Define FDO (Feedback Directed Optimization) options.
|
|
|
|
TARGET_FDO_CFLAGS:=
|
|
TARGET_FDO_LIB:=
|
|
|
|
target_libgcov := $(shell $(TARGET_CC) $(TARGET_GLOBAL_CFLAGS) \
|
|
--print-file-name=libgcov.a)
|
|
ifneq ($(strip $(BUILD_FDO_INSTRUMENT)),)
|
|
# Set BUILD_FDO_INSTRUMENT=true to turn on FDO instrumentation.
|
|
# The profile will be generated on /data/local/tmp/profile on the device.
|
|
TARGET_FDO_CFLAGS := -fprofile-generate=/data/local/tmp/profile -DANDROID_FDO
|
|
TARGET_FDO_LIB := $(target_libgcov)
|
|
else
|
|
# If BUILD_FDO_INSTRUMENT is turned off, then consider doing the FDO optimizations.
|
|
# Set TARGET_FDO_PROFILE_PATH to set a custom profile directory for your build.
|
|
ifeq ($(strip $(TARGET_FDO_PROFILE_PATH)),)
|
|
TARGET_FDO_PROFILE_PATH := fdo/profiles/$(TARGET_ARCH)/$(TARGET_ARCH_VARIANT)
|
|
else
|
|
ifeq ($(strip $(wildcard $(TARGET_FDO_PROFILE_PATH))),)
|
|
$(warning Custom TARGET_FDO_PROFILE_PATH supplied, but directory does not exist. Turn off FDO.)
|
|
endif
|
|
endif
|
|
|
|
# If the FDO profile directory can't be found, then FDO is off.
|
|
ifneq ($(strip $(wildcard $(TARGET_FDO_PROFILE_PATH))),)
|
|
TARGET_FDO_CFLAGS := -fprofile-use=$(TARGET_FDO_PROFILE_PATH) -DANDROID_FDO
|
|
TARGET_FDO_LIB := $(target_libgcov)
|
|
endif
|
|
endif
|
|
|
|
|
|
# unless CUSTOM_KERNEL_HEADERS is defined, we're going to use
|
|
# symlinks located in out/ to point to the appropriate kernel
|
|
# headers. see 'config/kernel_headers.make' for more details
|
|
#
|
|
ifneq ($(CUSTOM_KERNEL_HEADERS),)
|
|
KERNEL_HEADERS_COMMON := $(CUSTOM_KERNEL_HEADERS)
|
|
KERNEL_HEADERS_ARCH := $(CUSTOM_KERNEL_HEADERS)
|
|
else
|
|
KERNEL_HEADERS_COMMON := $(libc_root)/kernel/common
|
|
KERNEL_HEADERS_ARCH := $(libc_root)/kernel/arch-$(TARGET_ARCH)
|
|
endif
|
|
KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH)
|
|
|
|
TARGET_C_INCLUDES := \
|
|
$(libc_root)/arch-arm/include \
|
|
$(libc_root)/include \
|
|
$(libstdc++_root)/include \
|
|
$(KERNEL_HEADERS) \
|
|
$(libm_root)/include \
|
|
$(libm_root)/include/arm \
|
|
$(libthread_db_root)/include
|
|
|
|
TARGET_CRTBEGIN_STATIC_O := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_static.o
|
|
TARGET_CRTBEGIN_DYNAMIC_O := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_dynamic.o
|
|
TARGET_CRTEND_O := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_android.o
|
|
|
|
TARGET_CRTBEGIN_SO_O := $(TARGET_OUT_STATIC_LIBRARIES)/crtbegin_so.o
|
|
TARGET_CRTEND_SO_O := $(TARGET_OUT_STATIC_LIBRARIES)/crtend_so.o
|
|
|
|
TARGET_STRIP_MODULE:=true
|
|
|
|
TARGET_DEFAULT_SYSTEM_SHARED_LIBRARIES := libc libstdc++ libm
|
|
|
|
TARGET_CUSTOM_LD_COMMAND := true
|
|
|
|
# Enable the Dalvik JIT compiler if not already specified.
|
|
ifeq ($(strip $(WITH_JIT)),)
|
|
WITH_JIT := true
|
|
endif
|
|
|
|
define transform-o-to-shared-lib-inner
|
|
$(TARGET_CXX) \
|
|
-nostdlib -Wl,-soname,$(notdir $@) -Wl,-T,$(BUILD_SYSTEM)/armelf.xsc \
|
|
-Wl,--gc-sections \
|
|
-Wl,-shared,-Bsymbolic \
|
|
$(PRIVATE_TARGET_GLOBAL_LD_DIRS) \
|
|
$(PRIVATE_ALL_OBJECTS) \
|
|
$(PRIVATE_TARGET_CRTBEGIN_SO_O) \
|
|
-Wl,--whole-archive \
|
|
$(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \
|
|
-Wl,--no-whole-archive \
|
|
$(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
|
|
$(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
|
|
-o $@ \
|
|
$(PRIVATE_TARGET_GLOBAL_LDFLAGS) \
|
|
$(PRIVATE_LDFLAGS) \
|
|
$(PRIVATE_TARGET_FDO_LIB) \
|
|
$(PRIVATE_TARGET_LIBGCC) \
|
|
$(PRIVATE_TARGET_CRTEND_SO_O)
|
|
endef
|
|
|
|
define transform-o-to-executable-inner
|
|
$(TARGET_CXX) -nostdlib -Bdynamic -Wl,-T,$(BUILD_SYSTEM)/armelf.x \
|
|
-Wl,-dynamic-linker,/system/bin/linker \
|
|
-Wl,--gc-sections \
|
|
-Wl,-z,nocopyreloc \
|
|
-o $@ \
|
|
$(TARGET_GLOBAL_LD_DIRS) \
|
|
-Wl,-rpath-link=$(TARGET_OUT_INTERMEDIATE_LIBRARIES) \
|
|
$(call normalize-target-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \
|
|
$(TARGET_CRTBEGIN_DYNAMIC_O) \
|
|
$(PRIVATE_ALL_OBJECTS) \
|
|
$(call normalize-target-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \
|
|
$(TARGET_GLOBAL_LDFLAGS) \
|
|
$(PRIVATE_LDFLAGS) \
|
|
$(TARGET_FDO_LIB) \
|
|
$(TARGET_LIBGCC) \
|
|
$(TARGET_CRTEND_O)
|
|
endef
|
|
|
|
define transform-o-to-static-executable-inner
|
|
$(TARGET_CXX) -nostdlib -Bstatic -Wl,-T,$(BUILD_SYSTEM)/armelf.x \
|
|
-Wl,--gc-sections \
|
|
-o $@ \
|
|
$(TARGET_GLOBAL_LD_DIRS) \
|
|
$(TARGET_CRTBEGIN_STATIC_O) \
|
|
$(TARGET_GLOBAL_LDFLAGS) \
|
|
$(PRIVATE_LDFLAGS) \
|
|
$(PRIVATE_ALL_OBJECTS) \
|
|
$(call normalize-target-libraries,$(filter-out %libc_nomalloc.a,$(filter-out %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES)))) \
|
|
-Wl,--start-group \
|
|
$(call normalize-target-libraries,$(filter %libc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \
|
|
$(call normalize-target-libraries,$(filter %libc_nomalloc.a,$(PRIVATE_ALL_STATIC_LIBRARIES))) \
|
|
$(TARGET_FDO_LIB) \
|
|
$(TARGET_LIBGCC) \
|
|
-Wl,--end-group \
|
|
$(TARGET_CRTEND_O)
|
|
endef
|