# Copyright (C) 2009 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.
#

# this script is included repeatedly by main.mk to add a new toolchain
# definition to the NDK build system.
#
# '_config_mk' must be defined as the path of a toolchain
# configuration file (config.mk) that will be included here.
#
$(call assert-defined, _config_mk)

# The list of variables that must or may be defined
# by the toolchain configuration file
#
NDK_TOOLCHAIN_VARS_REQUIRED := TOOLCHAIN_ABIS TOOLCHAIN_ARCH
NDK_TOOLCHAIN_VARS_OPTIONAL :=

# Clear variables that are supposed to be defined by the config file
$(call clear-vars,$(NDK_TOOLCHAIN_VARS_REQUIRED))
$(call clear-vars,$(NDK_TOOLCHAIN_VARS_OPTIONAL))

# Include the config file
include $(_config_mk)

# Plug in the undefined
ifeq ($(TOOLCHAIN_ABIS)$(TOOLCHAIN_ARCH),)
ifeq (1,$(words $(filter-out $(NDK_KNOWN_ARCHS),$(NDK_FOUND_ARCHS))))
TOOLCHAIN_ARCH := $(filter-out $(NDK_KNOWN_ARCHS),$(NDK_FOUND_ARCHS))
TOOLCHAIN_ABIS := $(TOOLCHAIN_ARCH) $(NDK_KNOWN_ABIS:%=$(TOOLCHAIN_ARCH)%) $(NDK_KNOWN_ABIS:%=$(TOOLCHAIN_ARCH)bc%)
endif
endif

ifeq ($(TOOLCHAIN_ABIS)$(TOOLCHAIN_ARCH),)
# Ignore if both TOOLCHAIN_ABIS and TOOLCHAIN_ARCH are not defined
else

# Check that the proper variables were defined
$(call check-required-vars,$(NDK_TOOLCHAIN_VARS_REQUIRED),$(_config_mk))

# Check that the file didn't do something stupid
$(call assert-defined, _config_mk)

# Now record the toolchain-specific information
_dir  := $(patsubst %/,%,$(dir $(_config_mk)))
_name := $(notdir $(_dir))
_arch := $(TOOLCHAIN_ARCH)
_abis := $(TOOLCHAIN_ABIS)

_toolchain := NDK_TOOLCHAIN.$(_name)

# check that the toolchain name is unique
$(if $(strip $($(_toolchain).defined)),\
  $(call __ndk_error,Toolchain $(_name) defined in $(_parent) is\
                     already defined in $(NDK_TOOLCHAIN.$(_name).defined)))

$(_toolchain).defined := $(_toolchain_config)
$(_toolchain).arch    := $(_arch)
$(_toolchain).abis    := $(_abis)
$(_toolchain).setup   := $(wildcard $(_dir)/setup.mk)

$(if $(strip $($(_toolchain).setup)),,\
  $(call __ndk_error, Toolchain $(_name) lacks a setup.mk in $(_dir)))

NDK_ALL_TOOLCHAINS += $(_name)
NDK_ALL_ARCHS      += $(_arch)
NDK_ALL_ABIS       += $(_abis)

# NDK_ABI.<abi>.toolchains records the list of toolchains that support
# a given ABI
#
$(foreach _abi,$(_abis),\
    $(eval NDK_ABI.$(_abi).toolchains += $(_name)) \
    $(eval NDK_ABI.$(_abi).arch := $(sort $(NDK_ABI.$(_abi).arch) $(_arch)))\
)

NDK_ARCH.$(_arch).toolchains += $(_name)
NDK_ARCH.$(_arch).abis := $(sort $(NDK_ARCH.$(_arch).abis) $(_abis))

endif

# done
