Home | History | Annotate | Download | only in core
      1 variant_list := $(filter AUX-%,$(MAKECMDGOALS))
      2 
      3 ifdef variant_list
      4 AUX_OS_VARIANT_LIST := $(patsubst AUX-%,%,$(variant_list))
      5 else
      6 AUX_OS_VARIANT_LIST := $(TARGET_AUX_OS_VARIANT_LIST)
      7 endif
      8 
      9 # exclude AUX targets from build
     10 ifeq ($(AUX_OS_VARIANT_LIST),none)
     11 AUX_OS_VARIANT_LIST :=
     12 endif
     13 
     14 # temporary workaround to support external toolchain
     15 ifeq ($(NANOHUB_TOOLCHAIN),)
     16 AUX_OS_VARIANT_LIST :=
     17 endif
     18 
     19 # setup toolchain paths for various CPU architectures
     20 # this one will come from android prebuilts eventually
     21 AUX_TOOLCHAIN_cortexm4 := $(NANOHUB_TOOLCHAIN)
     22 ifeq ($(wildcard $(AUX_TOOLCHAIN_cortexm4)gcc),)
     23 AUX_TOOLCHAIN_cortexm4:=
     24 endif
     25 
     26 # there is no MAKE var that defines path to HOST toolchain
     27 # all the interesting paths are hardcoded in soong, and are not available from here
     28 # There is no other way but to hardcode them again, as we may need host x86 toolcain for AUX
     29 ifeq ($(HOST_OS),linux)
     30 AUX_TOOLCHAIN_x86 := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/bin/x86_64-linux-
     31 endif
     32 
     33 # setup AUX globals
     34 AUX_SHLIB_SUFFIX := .so
     35 AUX_GLOBAL_ARFLAGS := cqsD
     36 AUX_STATIC_LIB_SUFFIX := .a
     37 
     38 # Load ever-lasting "indexed" version of AUX variant environment; it is treated as READ-ONLY from this
     39 # moment on.
     40 #
     41 # $(1) - variant
     42 # no return value
     43 define aux-variant-setup-paths
     44 $(eval AUX_OUT_ROOT_$(1) := $(PRODUCT_OUT)/aux/$(1)) \
     45 $(eval AUX_COMMON_OUT_ROOT_$(1) := $(AUX_OUT_ROOT_$(1))/common) \
     46 $(eval AUX_OUT_$(1) := $(AUX_OUT_ROOT_$(1))/$(AUX_OS_$(1))-$(AUX_ARCH_$(1))-$(AUX_CPU_$(1))) \
     47 $(eval AUX_OUT_INTERMEDIATES_$(1) := $(AUX_OUT_$(1))/obj) \
     48 $(eval AUX_OUT_COMMON_INTERMEDIATES_$(1) := $(AUX_COMMON_OUT_ROOT_$(1))/obj) \
     49 $(eval AUX_OUT_HEADERS_$(1) := $(AUX_OUT_INTERMEDIATES_$(1))/include) \
     50 $(eval AUX_OUT_INTERMEDIATE_LIBRARIES_$(1) := $(AUX_OUT_INTERMEDIATES_$(1))/lib) \
     51 $(eval AUX_OUT_NOTICE_FILES_$(1) := $(AUX_OUT_INTERMEDIATES_$(1))/NOTICE_FILES) \
     52 $(eval AUX_OUT_FAKE_$(1) := $(AUX_OUT_$(1))/fake_packages) \
     53 $(eval AUX_OUT_GEN_$(1) := $(AUX_OUT_$(1))/gen) \
     54 $(eval AUX_OUT_COMMON_GEN_$(1) := $(AUX_COMMON_OUT_ROOT_$(1))/gen) \
     55 $(eval AUX_OUT_EXECUTABLES_$(1) := $(AUX_OUT_$(1))/bin) \
     56 $(eval AUX_OUT_UNSTRIPPED_$(1) := $(AUX_OUT_$(1))/symbols)
     57 endef
     58 
     59 # Copy "indexed" AUX environment for given VARIANT into
     60 # volatile not-indexed set of variables for simplicity of access.
     61 # Injection of index support throughout the build system is suboptimal
     62 # hence volatile environment is constructed
     63 # Unlike HOST*, TARGET* variables, AUX* variables are NOT read-only, but their
     64 # indexed versions are.
     65 #
     66 # $(1) - variant
     67 # no return value
     68 define aux-variant-load-env
     69 $(eval AUX_OS_VARIANT:=$(1)) \
     70 $(eval AUX_OS:=$(AUX_OS_$(1))) \
     71 $(eval AUX_ARCH:=$(AUX_ARCH_$(1))) \
     72 $(eval AUX_SUBARCH:=$(AUX_SUBARCH_$(1))) \
     73 $(eval AUX_CPU:=$(AUX_CPU_$(1))) \
     74 $(eval AUX_OS_PATH:=$(AUX_OS_PATH_$(1))) \
     75 $(eval AUX_OUT_ROOT := $(AUX_OUT_ROOT_$(1))) \
     76 $(eval AUX_COMMON_OUT_ROOT := $(AUX_COMMON_OUT_ROOT_$(1))) \
     77 $(eval AUX_OUT := $(AUX_OUT_$(1))) \
     78 $(eval AUX_OUT_INTERMEDIATES := $(AUX_OUT_INTERMEDIATES_$(1))) \
     79 $(eval AUX_OUT_COMMON_INTERMEDIATES := $(AUX_OUT_COMMON_INTERMEDIATES_$(1))) \
     80 $(eval AUX_OUT_HEADERS := $(AUX_OUT_HEADERS_$(1))) \
     81 $(eval AUX_OUT_INTERMEDIATE_LIBRARIES := $(AUX_OUT_INTERMEDIATE_LIBRARIES_$(1))) \
     82 $(eval AUX_OUT_NOTICE_FILES := $(AUX_OUT_NOTICE_FILES_$(1))) \
     83 $(eval AUX_OUT_FAKE := $(AUX_OUT_FAKE_$(1))) \
     84 $(eval AUX_OUT_GEN := $(AUX_OUT_GEN_$(1))) \
     85 $(eval AUX_OUT_COMMON_GEN := $(AUX_OUT_COMMON_GEN_$(1))) \
     86 $(eval AUX_OUT_EXECUTABLES := $(AUX_OUT_EXECUTABLES_$(1))) \
     87 $(eval AUX_OUT_UNSTRIPPED := $(AUX_OUT_UNSTRIPPED_$(1)))
     88 endef
     89 
     90 # given a variant:path pair, load the variant conviguration with aux-variant-setup-paths from file
     91 # this is a build system extension mechainsm, since configuration typically resides in non-build
     92 # project space
     93 #
     94 # $(1) - variant:path pair
     95 # $(2) - file suffix
     96 # no return value
     97 define aux-variant-import-from-pair
     98 $(eval _pair := $(subst :, ,$(1))) \
     99 $(eval _name:=$(word 1,$(_pair))) \
    100 $(eval _path:=$(word 2,$(_pair))) \
    101 $(eval include $(_path)/$(_name)$(2)) \
    102 $(eval AUX_OS_VARIANT_LIST_$(AUX_OS_$(1)):=) \
    103 $(call aux-variant-setup-paths,$(_name)) \
    104 $(eval AUX_ALL_VARIANTS += $(_name)) \
    105 $(eval AUX_ALL_OSES := $(filter-out $(AUX_OS_$(_name)),$(AUX_ALL_OSES)) $(AUX_OS_$(_name))) \
    106 $(eval AUX_ALL_CPUS := $(filter-out $(AUX_CPU_$(_name)),$(AUX_ALL_CPUS)) $(AUX_CPU_$(_name))) \
    107 $(eval AUX_ALL_ARCHS := $(filter-out $(AUX_ARCH_$(_name)),$(AUX_ALL_ARCHS)) $(AUX_ARCH_$(_name))) \
    108 $(eval AUX_ALL_SUBARCHS := $(filter-out $(AUX_SUBARCH_$(_name)),$(AUX_ALL_SUBARCHS)) $(AUX_SUBARCH_$(_name)))
    109 endef
    110 
    111 # Load system configuration referenced by AUX variant config;
    112 # this is a build extension mechanism; typically system config
    113 # resides in a non-build projects;
    114 # system config may define new rules and globally visible BUILD*
    115 # includes to support project-specific build steps and toolchains
    116 # MAintains list of valiants that reference this os config in OS "indexed" var
    117 # this facilitates multivariant build of the OS (or whataver it is the name of common component these variants share)
    118 #
    119 # $(1) - variant
    120 # no return value
    121 define aux-import-os-config
    122 $(eval _aioc_os := $(AUX_OS_$(1))) \
    123 $(eval AUX_OS_PATH_$(1) := $(patsubst $(_aioc_os):%,%,$(filter $(_aioc_os):%,$(AUX_ALL_OS_PATHS)))) \
    124 $(eval _aioc_os_cfg := $(AUX_OS_PATH_$(1))/$(_aioc_os)$(os_sfx)) \
    125 $(if $(wildcard $(_aioc_os_cfg)),,$(error AUX '$(_aioc_os)' OS config file [$(notdir $(_aioc_os_cfg))] required by AUX variant '$(1)' does not exist)) \
    126 $(if $(filter $(_aioc_os),$(_os_list)),,$(eval include $(_aioc_os_cfg))) \
    127 $(eval AUX_OS_VARIANT_LIST_$(_aioc_os) += $(1)) \
    128 $(eval _os_list += $(_aioc_os))
    129 endef
    130 
    131 # make sure that AUX config variables are minimally sane;
    132 # as a bare minimum they must contain the vars described by aux_env
    133 # Generate error if requirement is not met.
    134 #
    135 #$(1) - variant
    136 # no return value
    137 define aux-variant-validate
    138 $(eval _all:=) \
    139 $(eval _req:=$(addsuffix _$(1),$(aux_env))) \
    140 $(foreach var,$(_req),$(eval _all += $(var))) \
    141 $(eval _missing := $(filter-out $(_all),$(_req))) \
    142 $(if $(_missing),$(error AUX variant $(1) must define vars: $(_missing)))
    143 endef
    144 
    145 AUX_ALL_VARIANTS :=
    146 AUX_ALL_OSES :=
    147 AUX_ALL_CPUS :=
    148 AUX_ALL_ARCHS :=
    149 AUX_ALL_SUBARCHS :=
    150 
    151 variant_sfx :=_aux_variant_config.mk
    152 os_sfx :=_aux_os_config.mk
    153 
    154 config_roots := $(wildcard device vendor)
    155 all_configs :=
    156 ifdef config_roots
    157 all_configs := $(sort $(shell find $(config_roots) -maxdepth 4 -name '*$(variant_sfx)' -o -name '*$(os_sfx)'))
    158 endif
    159 all_os_configs := $(filter %$(os_sfx),$(all_configs))
    160 all_variant_configs := $(filter %$(variant_sfx),$(all_configs))
    161 
    162 AUX_ALL_OS_PATHS := $(foreach f,$(all_os_configs),$(patsubst %$(os_sfx),%,$(notdir $(f))):$(patsubst %/,%,$(dir $(f))))
    163 AUX_ALL_OS_VARIANT_PATHS := $(foreach f,$(all_variant_configs),$(patsubst %$(variant_sfx),%,$(notdir $(f))):$(patsubst %/,%,$(dir $(f))))
    164 
    165 my_variant_pairs := $(foreach v,$(AUX_OS_VARIANT_LIST),$(filter $(v):%,$(AUX_ALL_OS_VARIANT_PATHS)))
    166 my_missing_variants := $(foreach v,$(AUX_OS_VARIANT_LIST),$(if $(filter $(v):%,$(AUX_ALL_OS_VARIANT_PATHS)),,$(v)))
    167 
    168 ifneq ($(strip $(my_missing_variants)),)
    169 $(error Don't know how to build variant(s): $(my_missing_variants))
    170 endif
    171 
    172 # mandatory variables
    173 aux_env := AUX_OS AUX_ARCH AUX_SUBARCH AUX_CPU
    174 
    175 $(foreach v,$(my_variant_pairs),$(if $(filter $(v),$(AUX_ALL_VARIANTS)),,$(call aux-variant-import-from-pair,$(v),$(variant_sfx))))
    176 
    177 ifdef AUX_ALL_VARIANTS
    178 _os_list :=
    179 $(foreach v,$(AUX_ALL_VARIANTS),\
    180   $(call aux-import-os-config,$(v)) \
    181   $(call aux-variant-validate,$(v)) \
    182 )
    183 endif
    184 
    185 INSTALLED_AUX_TARGETS :=
    186 
    187 droidcore: auxiliary
    188