################################################################################
# Embtoolkit
# Copyright(C) 2009-2014 Abdoulaye Walsimou GAYE.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
################################################################################
#
# \file core.mk
# \brief Toolchain core part
# \author Abdoulaye Walsimou GAYE
# \date September 2014
################################################################################
TOOLCHAIN_NAME := toolchain
TOOLCHAIN_VERSION := $(HOST_ARCH)-target-$(__xtools_archos)-$(__xtools_bins)-$(__xtools_env)
TOOLCHAIN_PACKAGE := toolchain-$(TOOLCHAIN_VERSION).tar.bz2
TOOLCHAIN_SRC_DIR := $(TOOLCHAIN_DIR)/.embtk-toolchain
TOOLCHAIN_BUILD_DIR := $(TOOLCHAIN_DIR)/.embtk-toolchain
# Include .kconfig symbols if any
-include $(call __embtk_pkg_dotkconfig_f,toolchain)
__embtk_toolchain_installed := $(__embtk_toolchain_runrecipe-y)
__embtk_xtool_gcc3-$(CONFIG_EMBTK_GCC_ONLY_TOOLCHAIN) := gcc3_install
__embtk_xtool_gcc3-$(CONFIG_EMBTK_GCC_DEFAULT_TOOLCHAIN) := gcc3_install
# FIXME: When libc++ will be used with clang/llvm toolchain, remove this
__embtk_xtool_gcc3-$(CONFIG_EMBTK_GCC_LANGUAGE_CPP) := gcc3_install
__embtk_xtool_gcc3-$(CONFIG_EMBTK_GCC_LANGUAGE_OBJECTIVEC) := gcc3_install
__embtk_xtool_gcc3-$(CONFIG_EMBTK_GCC_LANGUAGE_OBJECTIVECPP) := gcc3_install
#
# FIXME:
# 1- Handle clang/llvm/uClibc based toolchain where linuxthread.old is used or
# no threading is used at all.
# 2- Handle clang/llvm/musl MIPS based toolchain
#
ifeq ($(CONFIG_EMBTK_HAVE_COMPILER-RT)$(CONFIG_KEMBTK_UCLIBC_LINUXTHREADS_OLD),yy)
else ifeq ($(CONFIG_EMBTK_HAVE_COMPILER-RT)$(CONFIG_KEMBTK_UCLIBC_LINUXTHREADS_OLD),yy)
else ifeq ($(CONFIG_EMBTK_HAVE_COMPILER-RT)$(CONFIG_EMBTK_CLIB_MUSL)$(CONFIG_EMBTK_ARCH_MIPS),yyy)
else
__embtk_xtool_compiler-rt-$(CONFIG_EMBTK_HAVE_COMPILER-RT) := compiler-rt_install
endif
#
# Toolchain core build recipe
#
__embtk_toolchain_deps-y = $(patsubst %_install,%,$(EMBTK_TOOLCHAIN_DEPS-y))
__embtk_toolchain_built_msg = $(call embtk_pinfo,"New $(GNU_TARGET)/$(EMBTK_MCU_FLAG) toolchain successfully built!")
define __embtk_toolchain_core_build
$(__embtk_toolchain_building_msg)
$(call __embtk_unsetinstalled_pkg,toolchain)
$(call __embtk_unsetdecompressed_pkg,toolchain)
$(foreach dep,$(__embtk_toolchain_deps-y),
$(call embtk_cleanup_pkg,$(dep)))
$(foreach pkg,$(__embtk_rootfs_pkgs-y),
$(call embtk_cleanup_pkg,$(pkg)))
$(foreach pkgn,$(__embtk_rootfs_pkgs-n),
$(call embtk_cleanup_pkg,$(pkgn)))
rm -rf $(embtk_sysroot) $(embtk_tools)
$(__embtk_toolchain_mkinitdirs)
$(foreach dep,$(__embtk_toolchain_deps-y),
$(call embtk_install_xpkg,$(dep)))
$(call __embtk_setinstalled_pkg,toolchain)
$(call __embtk_pkg_gen_dotkconfig_f,toolchain)
endef
#
# Toolchain core dependencies
#
embtk_pkgincdir := packages/htools
# gmp
$(call embtk_include_xtoolpkg,gmp_host,toolchain_deps)
# mpfr
$(call embtk_include_xtoolpkg,mpfr_host,toolchain_deps)
# mpc
$(call embtk_include_xtoolpkg,mpc_host,toolchain_deps)
# gperf
$(call embtk_include_xtoolpkg,gperf_host,toolchain_deps)
EMBTK_TOOLCHAIN_DEPS-y += linux_headers_install binutils_install
EMBTK_TOOLCHAIN_DEPS-$(CONFIG_EMBTK_HOST_HAVE_LLVM) += llvm_host_install
EMBTK_TOOLCHAIN_DEPS-y += gcc1_install
EMBTK_TOOLCHAIN_DEPS-$(CONFIG_EMBTK_CLIB_UCLIBC) += $(embtk_clib)_headers_install gcc2_install
EMBTK_TOOLCHAIN_DEPS-y += $(embtk_clib)_install
EMBTK_TOOLCHAIN_DEPS-y += $(__embtk_xtool_gcc3-y)
EMBTK_TOOLCHAIN_DEPS-y += $(__embtk_xtool_compiler-rt-y)
TOOLCHAIN_DEPS := $(EMBTK_TOOLCHAIN_DEPS-y)
#
# binutils
#
include core/toolchain/binutils/binutils.mk
#
# GCC
#
include core/toolchain/gcc/gcc.mk
#
# llvm/clang compiler infrastructure
#
include core/toolchain/llvm/clang/clang.mk
include core/toolchain/llvm/llvm/llvm.mk
include core/toolchain/llvm/compiler-rt/compiler-rt.mk
include core/toolchain/libcxxrt/libcxxrt.mk
include core/toolchain/llvm/libc++/libcxx.mk
#
# linux kernel
#
include core/toolchain/linux/common.mk
include core/toolchain/linux/headers.mk
ifeq ($(CONFIG_EMBTK_BUILD_LINUX_KERNEL),y)
include core/toolchain/linux/linux.mk
endif
#
# C library
#
-include core/mk/$(embtk_clib).mk