diff options
author | Alexey Polyudov <apolyudov@google.com> | 2016-08-01 17:41:49 -0700 |
---|---|---|
committer | Alexey Polyudov <apolyudov@google.com> | 2016-08-02 08:06:28 -0700 |
commit | ccdc311b3328166687b2b3098059d50f1e8ff6e9 (patch) | |
tree | e7f0ed0043aa8fac013dc19c3257ce70e666396e /core/aux_config.mk | |
parent | 8b540fd5ba4bf9b9f65437d3c160767500a7c587 (diff) | |
download | build-ccdc311b3328166687b2b3098059d50f1e8ff6e9.tar.gz |
introduce AUX build class of targets
AUX is a new class, similar to TARGET
While TARGET defines toolchain for Application Processors
AUX is defining toolchains for arbitrary utility cores (DSPs, GPUs,
MCUs, etc). This allows building of non-android sources as part
of Android tree and avoid using prebuilts if source code is avaliable
Bug: 29635686
Change-Id: Ie755ea054b16c3e86369f5fb2ba6eb0b384af77f
Signed-off-by: Alexey Polyudov <apolyudov@google.com>
Diffstat (limited to 'core/aux_config.mk')
-rw-r--r-- | core/aux_config.mk | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/core/aux_config.mk b/core/aux_config.mk new file mode 100644 index 0000000000..decff34172 --- /dev/null +++ b/core/aux_config.mk @@ -0,0 +1,183 @@ +variant_list := $(filter AUX-%,$(MAKECMDGOALS)) + +ifdef variant_list +AUX_OS_VARIANT_LIST := $(patsubst AUX-%,%,$(variant_list)) +else +AUX_OS_VARIANT_LIST := $(TARGET_AUX_OS_VARIANT_LIST) +endif + +# exclude AUX targets from build +ifeq ($(AUX_OS_VARIANT_LIST),none) +AUX_OS_VARIANT_LIST := +endif + +# temporary workaround to support external toolchain +ifeq ($(NANOHUB_TOOLCHAIN),) +AUX_OS_VARIANT_LIST := +endif + +# setup toolchain paths for various CPU architectures +# this one will come from android prebuilts eventually +AUX_TOOLCHAIN_cortexm4 := $(NANOHUB_TOOLCHAIN) +ifeq ($(wildcard $(AUX_TOOLCHAIN_cortexm4)gcc),) +AUX_TOOLCHAIN_cortexm4:= +endif + +# there is no MAKE var that defines path to HOST toolchain +# all the interesting paths are hardcoded in soong, and are not available from here +# There is no other way but to hardcode them again, as we may need host x86 toolcain for AUX +ifeq ($(HOST_OS),linux) +AUX_TOOLCHAIN_x86 := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/bin/x86_64-linux- +endif + +# setup AUX globals +AUX_SHLIB_SUFFIX := .so +AUX_GLOBAL_ARFLAGS := crsPD +AUX_STATIC_LIB_SUFFIX := .a + +# Load ever-lasting "indexed" version of AUX variant environment; it is treated as READ-ONLY from this +# moment on. +# +# $(1) - variant +# no return value +define aux-variant-setup-paths +$(eval AUX_OUT_ROOT_$(1) := $(PRODUCT_OUT)/aux/$(1)) \ +$(eval AUX_COMMON_OUT_ROOT_$(1) := $(AUX_OUT_ROOT_$(1))/common) \ +$(eval AUX_OUT_$(1) := $(AUX_OUT_ROOT_$(1))/$(AUX_OS_$(1))-$(AUX_ARCH_$(1))-$(AUX_CPU_$(1))) \ +$(eval AUX_OUT_INTERMEDIATES_$(1) := $(AUX_OUT_$(1))/obj) \ +$(eval AUX_OUT_COMMON_INTERMEDIATES_$(1) := $(AUX_COMMON_OUT_ROOT_$(1))/obj) \ +$(eval AUX_OUT_HEADERS_$(1) := $(AUX_OUT_INTERMEDIATES_$(1))/include) \ +$(eval AUX_OUT_INTERMEDIATE_LIBRARIES_$(1) := $(AUX_OUT_INTERMEDIATES_$(1))/lib) \ +$(eval AUX_OUT_NOTICE_FILES_$(1) := $(AUX_OUT_INTERMEDIATES_$(1))/NOTICE_FILES) \ +$(eval AUX_OUT_FAKE_$(1) := $(AUX_OUT_$(1))/fake_packages) \ +$(eval AUX_OUT_GEN_$(1) := $(AUX_OUT_$(1))/gen) \ +$(eval AUX_OUT_COMMON_GEN_$(1) := $(AUX_COMMON_OUT_ROOT_$(1))/gen) \ +$(eval AUX_OUT_EXECUTABLES_$(1) := $(AUX_OUT_$(1))/bin) \ +$(eval AUX_OUT_UNSTRIPPED_$(1) := $(AUX_OUT_$(1))/symbols) +endef + +# Copy "indexed" AUX environment for given VARIANT into +# volatile not-indexed set of variables for simplicity of access. +# Injection of index support throughout the build system is suboptimal +# hence volatile environment is constructed +# Unlike HOST*, TARGET* variables, AUX* variables are NOT read-only, but their +# indexed versions are. +# +# $(1) - variant +# no return value +define aux-variant-load-env +$(eval AUX_OS_VARIANT:=$(1)) \ +$(eval AUX_OS:=$(AUX_OS_$(1))) \ +$(eval AUX_ARCH:=$(AUX_ARCH_$(1))) \ +$(eval AUX_SUBARCH:=$(AUX_SUBARCH_$(1))) \ +$(eval AUX_CPU:=$(AUX_CPU_$(1))) \ +$(eval AUX_OS_PATH:=$(AUX_OS_PATH_$(1))) \ +$(eval AUX_OUT_ROOT := $(AUX_OUT_ROOT_$(1))) \ +$(eval AUX_COMMON_OUT_ROOT := $(AUX_COMMON_OUT_ROOT_$(1))) \ +$(eval AUX_OUT := $(AUX_OUT_$(1))) \ +$(eval AUX_OUT_INTERMEDIATES := $(AUX_OUT_INTERMEDIATES_$(1))) \ +$(eval AUX_OUT_COMMON_INTERMEDIATES := $(AUX_OUT_COMMON_INTERMEDIATES_$(1))) \ +$(eval AUX_OUT_HEADERS := $(AUX_OUT_HEADERS_$(1))) \ +$(eval AUX_OUT_INTERMEDIATE_LIBRARIES := $(AUX_OUT_INTERMEDIATE_LIBRARIES_$(1))) \ +$(eval AUX_OUT_NOTICE_FILES := $(AUX_OUT_NOTICE_FILES_$(1))) \ +$(eval AUX_OUT_FAKE := $(AUX_OUT_FAKE_$(1))) \ +$(eval AUX_OUT_GEN := $(AUX_OUT_GEN_$(1))) \ +$(eval AUX_OUT_COMMON_GEN := $(AUX_OUT_COMMON_GEN_$(1))) \ +$(eval AUX_OUT_EXECUTABLES := $(AUX_OUT_EXECUTABLES_$(1))) \ +$(eval AUX_OUT_UNSTRIPPED := $(AUX_OUT_UNSTRIPPED_$(1))) +endef + +# given a variant:path pair, load the variant conviguration with aux-variant-setup-paths from file +# this is a build system extension mechainsm, since configuration typically resides in non-build +# project space +# +# $(1) - variant:path pair +# $(2) - file suffix +# no return value +define aux-variant-import-from-pair +$(eval _pair := $(subst :, ,$(1))) \ +$(eval _name:=$(word 1,$(_pair))) \ +$(eval _path:=$(word 2,$(_pair))) \ +$(eval include $(_path)/$(_name)$(2)) \ +$(eval AUX_OS_VARIANT_LIST_$(AUX_OS_$(1)):=) \ +$(call aux-variant-setup-paths,$(_name)) \ +$(eval AUX_ALL_VARIANTS += $(_name)) \ +$(eval AUX_ALL_OSES := $(filterout $(AUX_OS_$(_name)),$(AUX_ALL_OSES)) $(AUX_OS_$(_name))) \ +$(eval AUX_ALL_CPUS := $(filterout $(AUX_CPU_$(_name)),$(AUX_ALL_CPUS)) $(AUX_CPU_$(_name))) \ +$(eval AUX_ALL_ARCHS := $(filterout $(AUX_ARCH_$(_name)),$(AUX_ALL_ARCHS)) $(AUX_ARCH_$(_name))) \ +$(eval AUX_ALL_SUBARCHS := $(filterout $(AUX_SUBARCH_$(_name)),$(AUX_ALL_SUBARCHS)) $(AUX_SUBARCH_$(_name))) +endef + +# Load system configuration referenced by AUX variant config; +# this is a build extension mechanism; typically system config +# resides in a non-build projects; +# system config may define new rules and globally visible BUILD* +# includes to support project-specific build steps and toolchains +# MAintains list of valiants that reference this os config in OS "indexed" var +# this facilitates multivariant build of the OS (or whataver it is the name of common component these variants share) +# +# $(1) - variant +# no return value +define aux-import-os-config +$(eval _aioc_os := $(AUX_OS_$(1))) \ +$(eval AUX_OS_PATH_$(1) := $(patsubst $(_aioc_os):%,%,$(filter $(_aioc_os):%,$(AUX_ALL_OS_PATHS)))) \ +$(eval _aioc_os_cfg := $(AUX_OS_PATH_$(1))/$(_aioc_os)$(os_sfx)) \ +$(if $(wildcard $(_aioc_os_cfg)),,$(error AUX '$(_aioc_os)' OS config file [$(notdir $(_aioc_os_cfg))] required by AUX variant '$(1)' does not exist)) \ +$(if $(filter $(_aioc_os),$(_os_list)),,$(eval include $(_aioc_os_cfg))) \ +$(eval AUX_OS_VARIANT_LIST_$(_aioc_os) += $(1)) \ +$(eval _os_list += $(_aioc_os)) +endef + +# make sure that AUX config variables are minimally sane; +# as a bare minimum they must contain the vars described by aux_env +# Generate error if requirement is not met. +# +#$(1) - variant +# no return value +define aux-variant-validate +$(eval _all:=) \ +$(eval _req:=$(addsuffix _$(1),$(aux_env))) \ +$(foreach var,$(_req),$(eval _all += $(var))) \ +$(eval _missing := $(filterout $(_all),$(_req))) \ +$(if $(_missing),$(error AUX variant $(1) must define vars: $(_missing))) +endef + +AUX_ALL_VARIANTS := +AUX_ALL_OSES := +AUX_ALL_CPUS := +AUX_ALL_ARCHS := +AUX_ALL_SUBARCHS := + +variant_sfx :=_aux_variant_config.mk +os_sfx :=_aux_os_config.mk + +all_configs := $(shell find device vendor -maxdepth 4 -name '*$(variant_sfx)' -o -name '*$(os_sfx)' | sort) +all_os_configs := $(filter %$(os_sfx),$(all_configs)) +all_variant_configs := $(filter %$(variant_sfx),$(all_configs)) + +AUX_ALL_OS_PATHS := $(foreach f,$(all_os_configs),$(patsubst %$(os_sfx),%,$(notdir $(f))):$(patsubst %/,%,$(dir $(f)))) +AUX_ALL_OS_VARIANT_PATHS := $(foreach f,$(all_variant_configs),$(patsubst %$(variant_sfx),%,$(notdir $(f))):$(patsubst %/,%,$(dir $(f)))) + +my_variant_pairs := $(foreach v,$(AUX_OS_VARIANT_LIST),$(filter $(v):%,$(AUX_ALL_OS_VARIANT_PATHS))) +my_missing_variants := $(foreach v,$(AUX_OS_VARIANT_LIST),$(if $(filter $(v):%,$(AUX_ALL_OS_VARIANT_PATHS)),,$(v))) + +ifneq ($(strip $(my_missing_variants)),) +$(error Don't know how to build variant(s): $(my_missing_variants)) +endif + +# mandatory variables +aux_env := AUX_OS AUX_ARCH AUX_SUBARCH AUX_CPU + +$(foreach v,$(my_variant_pairs),$(if $(filter $(v),$(AUX_ALL_VARIANTS)),,$(call aux-variant-import-from-pair,$(v),$(variant_sfx)))) + +ifdef AUX_ALL_VARIANTS +_os_list := +$(foreach v,$(AUX_ALL_VARIANTS),\ + $(call aux-import-os-config,$(v)) \ + $(call aux-variant-validate,$(v)) \ +) +endif + +INSTALLED_AUX_TARGETS := + +droidcore: auxiliary |