| # The following definitions are the defaults used by all toolchains. |
| # This is included in setup-toolchain.mk just before the inclusion |
| # of the toolchain's specific setup.mk file which can then override |
| # these definitions. |
| # |
| |
| # These flags are used to ensure that a binary doesn't reference undefined |
| # flags. |
| TARGET_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined |
| |
| |
| # Return the list of object, static libraries and shared libraries as they |
| # must appear on the final static linker command (order is important). |
| # |
| # This can be over-ridden by a specific toolchain. Note that by default |
| # we always put libgcc _after_ all static libraries and _before_ shared |
| # libraries. This ensures that any libgcc function used by the final |
| # executable will be copied into it. Otherwise, it could contain |
| # symbol references to the same symbols as exported by shared libraries |
| # and this causes binary compatibility problems when they come from |
| # system libraries (e.g. libc.so and others). |
| # |
| # IMPORTANT: The result must use the host path convention. |
| # |
| # $1: object files |
| # $2: static libraries |
| # $3: whole static libraries |
| # $4: shared libraries |
| # |
| TARGET-get-linker-objects-and-libraries = \ |
| $(call host-path, $1) \ |
| $(call link-whole-archives,$3) \ |
| $(call host-path, $2) \ |
| $(PRIVATE_LIBATOMIC) \ |
| $(call host-path, $4) \ |
| |
| # This flag are used to provide compiler protection against format |
| # string vulnerabilities. |
| TARGET_FORMAT_STRING_CFLAGS := -Wformat -Werror=format-security |
| |
| # This flag disables the above security checks |
| TARGET_DISABLE_FORMAT_STRING_CFLAGS := -Wno-error=format-security |
| |
| define cmd-build-shared-library |
| $(PRIVATE_LD_DRIVER) \ |
| -Wl,-soname,$(notdir $(LOCAL_BUILT_MODULE)) \ |
| -shared \ |
| $(PRIVATE_LINKER_OBJECTS_AND_LIBRARIES) \ |
| $(GLOBAL_LDFLAGS) \ |
| $(PRIVATE_LDFLAGS) \ |
| $(PRIVATE_LDLIBS) \ |
| -o $(call host-path,$(LOCAL_BUILT_MODULE)) |
| endef |
| |
| # The following -rpath-link= are needed for ld.bfd (default for ARM64) when |
| # linking executables to supress warning about missing symbol from libraries not |
| # directly needed. ld.gold (default for all other architectures) doesn't emulate |
| # this buggy behavior. |
| define cmd-build-executable |
| $(PRIVATE_LD_DRIVER) \ |
| -Wl,-rpath-link=$(call host-path,$(PRIVATE_SYSROOT_API_LIB_DIR)) \ |
| -Wl,-rpath-link=$(call host-path,$(TARGET_OUT)) \ |
| $(PRIVATE_LINKER_OBJECTS_AND_LIBRARIES) \ |
| $(GLOBAL_LDFLAGS) \ |
| $(PRIVATE_LDFLAGS) \ |
| $(PRIVATE_LDLIBS) \ |
| -o $(call host-path,$(LOCAL_BUILT_MODULE)) |
| endef |
| |
| define cmd-build-static-library |
| $(PRIVATE_AR) $(call host-path,$(LOCAL_BUILT_MODULE)) $(PRIVATE_AR_OBJECTS) |
| endef |
| |
| cmd-strip = $(PRIVATE_STRIP) $(PRIVATE_STRIP_MODE) $(call host-path,$1) |
| |
| # arm32 currently uses a linker script in place of libgcc to ensure that |
| # libunwind is linked in the correct order. --exclude-libs does not propagate to |
| # the contents of the linker script and can't be specified within the linker |
| # script. Hide both regardless of architecture to future-proof us in case we |
| # move other architectures to a linker script (which we may want to do so we |
| # automatically link libclangrt on other architectures). |
| TARGET_LIBATOMIC = -latomic |
| TARGET_LDLIBS := -lc -lm |
| |
| LLVM_TOOLCHAIN_PREFIX := $(TOOLCHAIN_ROOT)/bin/ |
| |
| # IMPORTANT: The following definitions must use lazy assignment because |
| # the value of TOOLCHAIN_NAME or TARGET_CFLAGS can be changed later by |
| # the toolchain's setup.mk script. |
| TOOLCHAIN_PREFIX = $(TOOLCHAIN_ROOT)/bin/$(TOOLCHAIN_NAME)- |
| |
| TARGET_CC = $(LLVM_TOOLCHAIN_PREFIX)clang$(HOST_EXEEXT) |
| TARGET_CXX = $(LLVM_TOOLCHAIN_PREFIX)clang++$(HOST_EXEEXT) |
| |
| CLANG_TIDY = $(LLVM_TOOLCHAIN_PREFIX)clang-tidy$(HOST_EXEEXT) |
| |
| GLOBAL_CFLAGS = \ |
| -target $(LLVM_TRIPLE)$(TARGET_PLATFORM_LEVEL) \ |
| -fdata-sections \ |
| -ffunction-sections \ |
| -fstack-protector-strong \ |
| -funwind-tables \ |
| -no-canonical-prefixes \ |
| |
| # This is unnecessary given the new toolchain layout, but Studio will not |
| # recognize this as an Android build if there is no --sysroot flag. |
| # TODO: Teach Studio to recognize Android builds based on --target. |
| GLOBAL_CFLAGS += --sysroot $(call host-path,$(NDK_UNIFIED_SYSROOT_PATH)) |
| |
| # Always enable debug info. We strip binaries when needed. |
| GLOBAL_CFLAGS += -g |
| |
| # TODO: Remove. |
| GLOBAL_CFLAGS += \ |
| -Wno-invalid-command-line-argument \ |
| -Wno-unused-command-line-argument \ |
| |
| GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=2 |
| |
| |
| ifeq ($(APP_WEAK_API_DEFS), true) |
| GLOBAL_CFLAGS += \ |
| -D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__ \ |
| -Werror=unguarded-availability \ |
| |
| endif |
| |
| GLOBAL_LDFLAGS = \ |
| -target $(LLVM_TRIPLE)$(TARGET_PLATFORM_LEVEL) \ |
| -no-canonical-prefixes \ |
| |
| ifeq ($(APP_OPTIM),release) |
| GLOBAL_LDFLAGS += -Wl,--gc-sections |
| endif |
| |
| GLOBAL_CXXFLAGS = $(GLOBAL_CFLAGS) -fno-exceptions -fno-rtti |
| |
| TARGET_CFLAGS = |
| TARGET_CONLYFLAGS = |
| TARGET_CXXFLAGS = $(TARGET_CFLAGS) |
| |
| TARGET_ASM = $(TOOLCHAIN_ROOT)/bin/yasm |
| TARGET_ASMFLAGS = |
| |
| TARGET_LD = $(TOOLCHAIN_ROOT)/bin/ld |
| TARGET_LDFLAGS := |
| |
| TARGET_AR = $(LLVM_TOOLCHAIN_PREFIX)llvm-ar$(HOST_EXEEXT) |
| TARGET_ARFLAGS := crsD |
| |
| TARGET_STRIP = $(LLVM_TOOLCHAIN_PREFIX)llvm-strip$(HOST_EXEEXT) |
| |
| TARGET_OBJ_EXTENSION := .o |
| TARGET_LIB_EXTENSION := .a |
| TARGET_SONAME_EXTENSION := .so |