| # Path to base directory for installed Xtensa SDK. This should be |
| # the parent directory of all the individual toolchain versions. |
| ifndef XTENSA_SDK |
| XTENSA_SDK := /opt/xtensa |
| endif |
| ifeq ($(wildcard $(XTENSA_SDK)),) |
| $(error Please set XTENSA_SDK to correct location of SDK path, not found in $(XTENSA_SDK)) |
| endif |
| |
| # List of paths to base directories for xtensa builds. Can have multiple paths |
| # here; for example the base path for the installed xtensa SDK plus paths to |
| # vendor-supplied builds. It's expected that each of these paths is a base |
| # directory with children of the form <toolchain version>/<build name>/ where |
| # the build name corresponds to CONFIG_SOC. By default, we append all the |
| # builds included in the SDK |
| XTENSA_BUILD_PATHS += $(XTENSA_SDK)/XtDevTools/install/builds |
| |
| # Legacy; make sure this is un-set. The compiler actually uses this value |
| # if set to find command line tools, and we would rather it automatically |
| # derive this. |
| ifneq ($(XTENSA_TOOLS_PATH),) |
| $(error Please leave XTENSA_TOOLS_PATH unset) |
| endif |
| |
| ifeq (${CONFIG_XTENSA},y) |
| |
| # Every Zephyr Xtensa SOC configuration should have CONFIG_SOC match the name |
| # of the build, and have CONFIG_TOOLCHAIN_VARIANT match the intended |
| # toolchain release. |
| TOOLCHAIN_VER = $(call unquote,$(CONFIG_TOOLCHAIN_VARIANT)) |
| BUILD_NAME = $(call unquote,$(CONFIG_SOC)) |
| |
| # Attempt to find the canonical build directory using $(wildcard ..) to filter |
| # out potential build directories that don't exist |
| XCC_BUILD := $(strip $(foreach builddir,$(XTENSA_BUILD_PATHS),$(wildcard $(builddir)/$(TOOLCHAIN_VER)/$(BUILD_NAME)))) |
| |
| ifeq ($(XCC_BUILD),) |
| $(error Unable to find build $(BUILD_NAME) for $(TOOLCHAIN_VER) in $(XTENSA_BUILD_PATHS), you may need to set XTENSA_BUILD_PATHS) |
| endif |
| |
| ifneq ($(words $(XCC_BUILD)),1) |
| $(error Multiple build matches for $(BUILD_NAME) on $(TOOLCHAIN_VER) in $(XCC_BUILD)) |
| endif |
| |
| # Strip quotes from cross compiler anme prefix |
| CROSS_COMPILE_xtensa = $(call unquote,$(CONFIG_CROSS_COMPILE)) |
| |
| ifeq (${CROSS_COMPILE_xtensa},) |
| # Use default name prefix if no cross compiler name prefix is set |
| CROSS_COMPILE_xtensa=xt- |
| endif |
| |
| |
| XCC_TOOLS := $(XTENSA_SDK)/XtDevTools/install/tools/$(TOOLCHAIN_VER)/XtensaTools |
| CROSS_COMPILE = ${XCC_TOOLS}/bin/$(CROSS_COMPILE_$(ARCH)) |
| |
| ifeq ($(KBUILD_VERBOSE),1) |
| $(info Using Xtensa tools located in $(XCC_TOOLS)) |
| $(info Using Xtensa core build in $(XCC_BUILD)) |
| endif |
| |
| XCC_FLAGS := --xtensa-core=$(CONFIG_SOC) |
| |
| ifeq ($(USE_CCACHE),1) |
| CC = $(CCACHE) ${CROSS_COMPILE}xcc $(XCC_FLAGS) |
| CXX = $(CCACHE) ${CROSS_COMPILE}xc++ $(XCC_FLAGS) |
| else |
| CC = ${CROSS_COMPILE}xcc $(XCC_FLAGS) |
| CXX = ${CROSS_COMPILE}xc++ $(XCC_FLAGS) |
| endif |
| AS = ${CROSS_COMPILE}as $(XCC_FLAGS) |
| LD = ${CROSS_COMPILE}ld $(XCC_FLAGS) |
| CROSS_COMPILE_TARGET = ${CROSS_COMPILE_TARGET_${ARCH}} |
| |
| # Can either pass --xtensa-system to every single tool in the toolchain (and |
| # force redefinition of OBJCOPY, READELF, etc) or just export to environment |
| # (simpler) |
| XTENSA_SYSTEM := $(XCC_BUILD)/config |
| |
| XTSC_INC = $(realpath $(call unquote,${CONFIG_XTENSA_XTSC_INC})) |
| ifeq (${XTSC_INC},) |
| XTSC_INC = $(realpath ../$(call unquote,${CONFIG_XTENSA_XTSC_INC})) |
| endif |
| XTSC_WORK_DIR = $(dir ${XTSC_INC}) |
| XTSC_INC_FILE = $(notdir ${XTSC_INC}) |
| |
| # Include XCC standard libraries so that users used to Xplorer IDE can port |
| # their code easily |
| TOOLCHAIN_LIBS += gcc hal |
| LIB_INCLUDE_DIR += -L${XCC_BUILD}/xtensa-elf/lib/xcc \ |
| -L${XCC_BUILD}/xtensa-elf/lib \ |
| -L${XCC_BUILD}/xtensa-elf/arch/lib |
| |
| KBUILD_CPPFLAGS += -I$(XCC_TOOLS)/lib/xcc/include \ |
| -I$(XCC_TOOLS)/xtensa-elf/include \ |
| -I${XCC_BUILD}/xtensa-elf/arch/include \ |
| -I${XCC_BUILD}/xtensa-elf/include \ |
| -D'__builtin_unreachable()=while(1);' |
| |
| # xt-xcc does not support -Og, replace with -O0 |
| KBUILD_CFLAGS_OPTIMIZE:=$(patsubst -Og,-O0,${KBUILD_CFLAGS_OPTIMIZE}) |
| KBUILD_CXXFLAGS:=$(filter-out \ |
| -std=c++11 \ |
| -fno-reorder-functions \ |
| -fno-asynchronous-unwind-tables \ |
| -fno-defer-pop \ |
| -Wno-unused-but-set-variable \ |
| -fno-omit-frame-pointer \ |
| ,${KBUILD_CXXFLAGS}) |
| |
| # Support for Xtensa simulator from Cadence Design Systems, Inc. |
| XTRUN = ${CROSS_COMPILE}run |
| XTRUN_FLAGS += --turbo --cc_none |
| |
| export CROSS_COMPILE XTENSA_SYSTEM LIB_INCLUDE_DIR XCC_TOOLS |
| endif # CONFIG_XTENSA |
| |