blob: 8c328eafa6b56af63cf33ac6f792736e94160b46 [file] [log] [blame]
#
# Copyright (c) 2020 Project CHIP Authors
# Copyright (c) 2014-2017 Nest Labs, Inc.
#
# 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.
#
#
# Description:
# This file implements a glue makefile for building the CHIP SDK
# for Android devices and simulators for multiple architectures.
#
# This was largely directed and inspired by two Android NDK
# documents:
#
# * Android NDK Programmer's Guide: Standalone Toolchain
# * Android NDK Programmer's Guide: C++ Support
#
#
# Command-line Configurable Options
#
ANDROID_ROOT ?= /usr/local/android
ANDROID_HOME ?= $(ANDROID_ROOT)/android-sdk-linux-r23.0.2
ANDROID_NDK_HOME ?= $(ANDROID_ROOT)/android-ndk-r10
ANDROID_API ?= $(ANDROID_RELEASE)
ANDROID_ABI ?= armeabi-v7a arm64-v8a x86 x86_64
ANDROID_STL ?= $(ANDROID_CXX)
DEBUG ?= 0
ENABLE_TARGETED_LISTEN ?= 0
# Deprecated -- Use ANDROID_API
ANDROID_RELEASE ?= 22
# Deprecated -- Use ANDROID_STL
ANDROID_CXX ?= system
#
# Android C++ Runtime (STL) Selection
#
ANDROID_STLROOT = $(ANDROID_NDK_HOME)/sources/cxx-stl
ANDROID_STL_INCLUDE_DIRS_libc++ = $(ANDROID_STLROOT)/llvm-libc++/include \
$(ANDROID_STLROOT)/llvm-libc++abi/include \
$(ANDROID_NDK_HOME)/sources/android/support/include
ANDROID_STL_INCLUDE_DIRS_gnustl = $(ANDROID_STLROOT)/gnu-libstdc++/4.9/include
ANDROID_STL_INCLUDE_DIRS_system = $(ANDROID_STLROOT)/system/include
ANDROID_STL_INCLUDES = $(foreach dir,$(ANDROID_STL_INCLUDE_DIRS_$(ANDROID_STL)),-isystem $(dir))
#
# Tools and Executables
#
android-ndk-which = $(shell $(AbsTopSourceDir)/scripts/android-ndk-which --ndk-home $(ANDROID_NDK_HOME) $(1) $(TARGET_ABI))
AR = $(call android-ndk-which,ar)
AS = $(call android-ndk-which,as)
CPP = $(call android-ndk-which,cpp)
CC = $(call android-ndk-which,gcc)
CXX = $(call android-ndk-which,g++)
LD = $(call android-ndk-which,ld)
STRIP = $(call android-ndk-which,strip)
NM = $(call android-ndk-which,nm)
RANLIB = $(call android-ndk-which,ranlib)
OBJCOPY = $(call android-ndk-which,objcopy)
ECHO = @echo
MAKE = make
MKDIR_P = mkdir -p
LN_S = ln -s
RM_F = rm -f
INSTALL = /usr/bin/install
#
# Common C/C++ Defines
#
DEFINES += -D__ANDROID_API__=$(ANDROID_API) \
-DCHIP_CONFIG_ENABLE_TARGETED_LISTEN=$(ENABLE_TARGETED_LISTEN) \
-DCHIP_PROGRESS_LOGGING=$(DEBUG) \
-DCHIP_ERROR_LOGGING=$(DEBUG) \
-DCHIP_DETAIL_LOGGING=$(DEBUG)
ifeq ($(DEBUG),1)
DEFINES = -DDEBUG=$(DEBUG) -UNDEBUG
else
DEFINES = -DNDEBUG=1 -UDEBUG
endif
#
# Common C/C++ Includes
#
INCLUDES += -isystem $(ANDROID_NDK_HOME)/sysroot/usr/include \
$(ANDROID_STL_INCLUDES)
#
# Compilation/Build Flags
#
CPPFLAGS = --sysroot=$(ABI_SYSROOT) $(DEFINES) $(INCLUDES) $(ABI_CPPFLAGS)
CFLAGS = $(CPPFLAGS) -ffunction-sections -funwind-tables $(ABI_CFLAGS)
CXXFLAGS = $(CPPFLAGS) -fno-rtti $(ABI_CXXFLAGS)
LDFLAGS = --sysroot=$(ABI_SYSROOT) -Wl,--gc-sections $(ABI_LDFLAGS)
INSTALLFLAGS = -p
ifndef BuildJobs
BuildJobs := $(shell getconf _NPROCESSORS_ONLN)
endif
JOBSFLAG := -j$(BuildJobs)
#
# Common CHIP configure options
#
CONFIGURE_OPTIONS = --disable-cocoa \
--disable-docs \
--enable-java \
--disable-python \
--enable-shared \
--disable-tests \
--disable-tools
ifeq ($(DEBUG),1)
CONFIGURE_OPTIONS += --enable-debug --enable-optimization=no
else
CONFIGURE_OPTIONS +=
endif
#
# Directories
#
TopSourceDir := $(dir $(shell readlink $(firstword $(MAKEFILE_LIST))))
AbsTopSourceDir := $(dir $(realpath $(firstword $(MAKEFILE_LIST))))
BuildPath = build
TopBuildDir = $(BuildPath)
AbsTopBuildDir = $(PWD)/$(TopBuildDir)
ResultPath = output
TopResultDir = $(ResultPath)
AbsTopResultDir = $(PWD)/$(TopResultDir)
# NB: Regardless of where JAVA_HOME points, always use the JNI headers from the Android NDK,
# and only include the top-most directory (include), not the system directory (include/linux).
# Because the NDK mixes the JNI headers in with the linux headers, listing the system
# directory in the -I flags will result in strange compilation errors. And unlike the standard
# Java jni.h, the jni.h that comes with the Android NDK does not depend on any system-specific
# JNI header files (e.g. jni_md.h). Thus only the top-level include directory is needed.
JNI_INCLUDE_DIRS = $(ABI_SYSROOT)/usr/include
#
# ABI-specific Configurations
#
ABI_CONFIG_TUPLE_armeabi = arm-unknown-linux-android
ABI_SYSROOT_armeabi = $(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-arm
ABI_CPPFLAGS_armeabi = -march=armv5te -mtune=xscale -msoft-float -isystem $(ANDROID_NDK_HOME)/sysroot/usr/include/arm-linux-androideabi
ABI_CFLAGS_armeabi = -fstack-protector
ABI_CXXFLAGS_armeabi = -I$(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-arm/usr/include
ABI_LDFLAGS_armeabi = -march=armv5te -mtune=xscale -msoft-float
ABI_CONFIG_TUPLE_armeabi-v7a = armv7-unknown-linux-android
ABI_SYSROOT_armeabi-v7a = $(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-arm
ABI_CPPFLAGS_armeabi-v7a = -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -isystem $(ANDROID_NDK_HOME)/sysroot/usr/include/arm-linux-androideabi
ABI_CFLAGS_armeabi-v7a = -fstack-protector
ABI_CXXFLAGS_armeabi-v7a = -I$(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-arm/usr/include
ABI_LDFLAGS_armeabi-v7a = -march=armv7-a -Wl,--fix-cortex-a8
ABI_CONFIG_TUPLE_arm64-v8a = arm64-unknown-linux-android
ABI_SYSROOT_arm64-v8a = $(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-arm64
ABI_CPPFLAGS_arm64-v8a = -march=armv8-a -isystem $(ANDROID_NDK_HOME)/sysroot/usr/include/aarch64-linux-android
ABI_CFLAGS_arm64-v8a = -fstack-protector
ABI_CXXFLAGS_arm64-v8a = -I$(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-arm64/usr/include
ABI_LDFLAGS_arm64-v8a = -march=armv8-a
ABI_CONFIG_TUPLE_x86 = x86-unknown-linux-android
ABI_SYSROOT_x86 = $(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-x86
ABI_CPPFLAGS_x86 = -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -isystem $(ANDROID_NDK_HOME)/sysroot/usr/include/i686-linux-android
ABI_CFLAGS_x86 =
ABI_CXXFLAGS_x86 = -I$(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-x86/usr/include
ABI_LDFLAGS_x86 = -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32
ABI_CONFIG_TUPLE_x86_64 = x86_64-unknown-linux-android
ABI_SYSROOT_x86_64 = $(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-x86_64
ABI_CPPFLAGS_x86_64 = -march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel -isystem $(ANDROID_NDK_HOME)/sysroot/usr/include/x86_64-linux-android
ABI_CFLAGS_x86_64 =
ABI_CXXFLAGS_x86_64 = -I$(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)/arch-x86_64/usr/include
ABI_LDFLAGS_x86_64 = -march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel
#
# automake files
#
AMFILES = \
src/system/SystemLayer.am \
src/system/Makefile.am \
src/include/Makefile.am \
src/lib/core/CoreLayer.am \
src/lib/support/SupportLayer.am \
src/lib/Makefile.am \
src/inet/InetLayer.am \
src/inet/Makefile.am \
src/ble/BleLayer.am \
src/ble/Makefile.am \
src/lwip/Makefile.am \
src/Makefile.am \
third_party/Makefile.am \
Makefile.am \
configure.ac \
$(NULL)
#
# configure-action <abi>
#
# Steps to configure the CHIP SDK for a specific Android ABI.
#
# abi - The target ABI.
#
define configure-action
$(ECHO) " CONFIG $(ABI_CONFIG_TUPLE_$(1))..."
(cd $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1)) && $(AbsTopSourceDir)/configure -C \
CPP="$(CPP)" CC="$(CC)" CXX="$(CXX)" OBJC="$(OBJC)" OBJCXX="$(OBJCXX)" AR="$(AR)" RANLIB="$(RANLIB)" NM="$(NM)" STRIP="$(STRIP)" \
INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
CPPFLAGS="$(CPPFLAGS)" \
CFLAGS="$(CFLAGS)" \
CXXFLAGS="$(CXXFLAGS)" \
OBJCFLAGS="$(OBJCFLAGS)" \
OBJCXXFLAGS="$(OBJCXXFLAGS)" \
LDFLAGS="$(LDFLAGS)" \
JAVA_HOME="$(JAVA_HOME)" \
JNI_INCLUDE_DIRS="$(JNI_INCLUDE_DIRS)" \
--build=$(shell $(AbsTopSourceDir)/third_party/nlbuild-autotools/repo/autoconf/config.guess) \
--host=$(ABI_CONFIG_TUPLE_$(1)) \
--with-sysroot=$(ABI_SYSROOT) \
--with-libtool-sysroot=$(ABI_SYSROOT) \
--with-chip-project-includes=$(AbsTopSourceDir)/config/android \
--prefix=/ \
--exec-prefix=/$(ABI_CONFIG_TUPLE_$(1)) \
$(CONFIGURE_OPTIONS))
endef # configure-action
#
# build-action <abi>
#
# Steps to generate the CHIP SDK intermediate build products for the specified Android ABI.
#
# abi - The target ABI.
#
define build-action
$(ECHO) " BUILD $(ABI_CONFIG_TUPLE_$(1))"
$(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1)) --no-print-directory all
endef # build-action
#
# stage-action <abi>
#
# Steps to stage (install) the CHIP SDK final build products for the specified
# specified Android ABI.
#
# abi - The target ABI.
#
define stage-action
$(ECHO) " STAGE $(ABI_CONFIG_TUPLE_$(1))"
$(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1)) --no-print-directory DESTDIR=$(AbsTopResultDir) install
endef # stage-action
#
# pretty-action <abi>
#
# Steps to pretty-ify the CHIP SDK source code for the specified Android ABI.
#
# abi - The target ABI.
#
define pretty-action
$(ECHO) " PRETTY $(1)"
$(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1)) --no-print-directory pretty
endef # pretty-action
#
# pretty-check-action <abi>
#
# Steps to pretty-check (lint) the CHIP SDK source code for the specified
# Android ABI.
#
# abi - The target ABI.
#
define pretty-check-action
$(ECHO) " PRETTY $(1)"
$(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1)) --no-print-directory pretty-check
endef # pretty-check-action
#
# clean-action <abi>
#
# Steps to clean (delete) the CHIP SDK final build products for the specified
# specified Android ABI.
#
# abi - The target ABI.
#
define clean-action
$(ECHO) " CLEAN $(1)"
@$(RM_F) -r $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1))
endef # clean-action
#
# ABI_template <abi>
#
# Define macros, targets and rules to configure, build, and stage the
# CHIP SDK for a single Android ABI.
#
# abi - The architecture to instantiate the template for.
#
define ABI_template
CONFIGURE_TARGETS += configure-$(1)
BUILD_TARGETS += do-build-$(1)
STAGE_TARGETS += stage-$(1)
PRETTY_TARGETS += pretty-$(1)
PRETTY_CHECK_TARGETS += pretty-check-$(1)
CLEAN_TARGETS += clean-$(1)
BUILD_DIRS += $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1))
.PHONY: configure-$(1) do-build-$(1) stage-$(1) pretty-$(1) lint-$(1) pretty-check-$(1) clean-$(1)
configure-$(1): TARGET_ABI=$(1)
configure-$(1): ABI_SYSROOT=$(ABI_SYSROOT_$(1))
configure-$(1): ABI_CPPFLAGS=$(ABI_CPPFLAGS_$(1))
configure-$(1): ABI_CFLAGS=$(ABI_CFLAGS_$(1))
configure-$(1): ABI_CXXFLAGS=$(ABI_CXXFLAGS_$(1))
configure-$(1): ABI_LDFLAGS=$(ABI_LDFLAGS_$(1))
configure-$(1): env-check $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1))/config.status
$(BuildPath)/$(ABI_CONFIG_TUPLE_$(1))/config.status: | $(BuildPath)/$(ABI_CONFIG_TUPLE_$(1))
$$(call configure-action,$(1))
do-build-$(1): configure-$(1)
do-build-$(1):
$$(call build-action,$(1))
stage-$(1): do-build-$(1)
stage-$(1): | $(TopResultDir)
$$(call stage-action,$(1))
pretty-$(1): configure-$(1)
$$(call pretty-action,$(1))
lint-$(1) pretty-check-$(1): configure-$(1)
$$(call pretty-check-action,$(1))
clean-$(1):
$$(call clean-action,$(1))
endef # ABI_template
#
# Rules
#
# Don't allow this top-level makefile's targets to be built in parallel.
.NOTPARALLEL:
.DEFAULT_GOAL := all
.PHONY : all configure build stage check pretty lint pretty-check clean env-check help
# Instantiate an ABI-specific set of rules to build CHIP for each target ABI.
$(foreach abi,$(ANDROID_ABI),$(eval $(call ABI_template,$(abi))))
all: stage
Makefile.in: $(AMFILES)
$(ECHO) "BOOTSTRAP"
@./bootstrap
configure: Makefile.in $(CONFIGURE_TARGETS)
build: $(BUILD_TARGETS)
stage: $(STAGE_TARGETS)
pretty: $(PRETTY_TARGETS)
lint pretty-check: $(PRETTY_CHECK_TARGETS)
clean: $(CLEAN_TARGETS)
env-check:
@if [ -z "$(JAVA_HOME)" ]; then \
echo "JAVA_HOME not set"; \
false; \
fi
@if [ \! -d "$(ANDROID_HOME)" ]; then \
echo "ERROR: Android SDK not found at $(ANDROID_HOME)"; \
echo "Override the ANDROID_HOME variable to specify an alternate location for the Android SDK"; \
false; \
fi
@if [ \! -d "$(ANDROID_NDK_HOME)" ]; then \
echo "ERROR: Android NDK not found at $(ANDROID_NDK_HOME)"; \
echo "Override the ANDROID_NDK_HOME variable to specify an alternate location for the Android NDK"; \
false; \
fi
@if [ \! -d "$(ANDROID_NDK_HOME)/platforms/android-$(ANDROID_API)" ]; then \
echo "ERROR: Android API level $(ANDROID_API) not supported by NDK at $(ANDROID_NDK_HOME)"; \
echo "Override the ANDROID_API variable to select another API level"; \
false; \
fi
$(ECHO) "NOTE: JAVA_HOME is '$(JAVA_HOME)' (source: $(origin JAVA_HOME))"
$(ECHO) "NOTE: ANDROID_HOME is '$(ANDROID_HOME)' (source: $(origin ANDROID_HOME))"
$(ECHO) "NOTE: ANDROID_NDK_HOME is '$(ANDROID_NDK_HOME)' (source: $(origin ANDROID_NDK_HOME))"
$(ECHO) "NOTE: ANDROID_API is $(ANDROID_API) (source: $(origin ANDROID_API))"
$(ECHO) "NOTE: ANDROID_ABI is '$(ANDROID_ABI)' (source: $(origin ANDROID_ABI))"
$(ECHO) "NOTE: ANDROID_STL is '$(ANDROID_STL)' (source: $(origin ANDROID_STL))"
$(TopResultDir) $(BUILD_DIRS):
$(ECHO) " MKDIR $@"
@$(MKDIR_P) "$@"
help:
$(ECHO) ""
$(ECHO) "Type 'make -f $(firstword $(MAKEFILE_LIST))' to build CHIP for Android for the following"
$(ECHO) "API level and ABIs: "
$(ECHO) ""
$(ECHO) " API Level $(ANDROID_API)"
$(ECHO) " $(ANDROID_ABI)"
$(ECHO) ""
$(ECHO) "To build for a particular API or ABI, override the ANDROID_API and ANDROID_ABI"
$(ECHO) "variables as follows:"
$(ECHO) ""
$(ECHO) " make -f $(firstword $(MAKEFILE_LIST)) ANDROID_API=24 ANDROID_ABI='armv7 x86'"
$(ECHO) ""
$(ECHO) "You may want or need to override the following make variables either on the "
$(ECHO) "command line or in the environment: "
$(ECHO) ""
$(ECHO) " DEBUG Enable CHIP debug code and logging (default: $(DEBUG))."
$(ECHO) ""
$(ECHO) " ENABLE_TARGETED_LISTEN Enable CHIP support for listening on particular "
$(ECHO) " addresses or interfaces. This allows testing multiple "
$(ECHO) " instances of the CHIP stack running on a single host "
$(ECHO) " (default: $(ENABLE_TARGETED_LISTEN))."
$(ECHO) ""
$(ECHO) " JAVA_HOME Directory in which the Java runtime is located."
$(ECHO) ""
$(ECHO) " ANDROID_ROOT Directory where Android NDK and SDK are installed (if "
$(ECHO) " the same) (default: $(ANDROID_ROOT))."
$(ECHO) ""
$(ECHO) " ANDROID_NDK_HOME Directory where Android NDK is installed (default: "
$(ECHO) " $(ANDROID_NDK_HOME))."
$(ECHO) ""
$(ECHO) " ANDROID_HOME Directory where Android SDK is installed (default: "
$(ECHO) " $(ANDROID_HOME))."
$(ECHO) ""
$(ECHO) " ANDROID_API Android NDK API level to build against (default: $(ANDROID_API))."
$(ECHO) ""
$(ECHO) " ANDROID_ABI List of Android ABIs to build for. Choices are: armeabi,"
$(ECHO) " armeabi-v7a, arm64-v8a, x86 and x86_64 (default: "
$(ECHO) " $(ANDROID_ABI))."
$(ECHO) ""
$(ECHO) " NOTE: Support for armeabi is deprecated in later SDKs/NDKs."
$(ECHO) ""
$(ECHO) " ANDROID_STL Android NDK C++ runtime to build against. Choices"
$(ECHO) " are libc++, gnustl and system (default: $(ANDROID_CXX))."