# # Copyright (c) 2017, The OpenThread Authors. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the copyright holder nor the # names of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # .NOTPARALLEL: AR = arm-none-eabi-ar CCAS = arm-none-eabi-as CPP = arm-none-eabi-cpp CC = arm-none-eabi-gcc CXX = arm-none-eabi-g++ LD = arm-none-eabi-ld STRIP = arm-none-eabi-strip NM = arm-none-eabi-nm RANLIB = arm-none-eabi-ranlib OBJCOPY = arm-none-eabi-objcopy BuildJobs ?= 10 configure_OPTIONS = \ --enable-cli \ --enable-ftd \ --enable-mtd \ --enable-ncp \ --enable-radio-only \ --enable-linker-map \ --with-examples=efr32mg12 \ MBEDTLS_CPPFLAGS="$(EFR32_MBEDTLS_CPPFLAGS)" \ $(NULL) ifneq ($(DISABLE_BUILTIN_MBEDTLS), 1) configure_OPTIONS += MBEDTLS_CPPFLAGS="$(EFR32_MBEDTLS_CPPFLAGS)" endif TopSourceDir := $(dir $(shell readlink $(firstword $(MAKEFILE_LIST)))).. AbsTopSourceDir := $(dir $(realpath $(firstword $(MAKEFILE_LIST)))).. # # Differentiate between boards # - BRD4304A / SLWSTK6000B / MGM12P Module / 2.4GHz@19dBm # - BRD4161A / SLWSTK6000B / Wireless Starter Kit / 2.4GHz@19dBm # - BRD4166A / SLTB004A / Thunderboard Sense 2 / 2.4GHz@10dBm # - BRD4170A / SLWSTK6000B / Multiband Wireless Starter Kit / 2.4GHz@19dBm, 915MHz@19dBm, 868MHz@19dBm # ifeq ($(BOARD),BRD4304A) MCU = EFR32MG12P432F1024GM48 else ifeq ($(BOARD),BRD4161A) MCU = EFR32MG12P432F1024GL125 else ifeq ($(BOARD),BRD4166A) MCU = EFR32MG12P332F1024GL125 else ifeq ($(BOARD),BRD4170A) MCU = EFR32MG12P433F1024GM68 else $(error Please provide a value for BOARD variable e.g BOARD=BRD4161A (currently supported BRD4304A, BRD4161A, BRD4166A or BRD4170A)) endif endif endif endif EFR32_MBEDTLS_CPPFLAGS = -DMBEDTLS_CONFIG_FILE='\"mbedtls-config.h\"' EFR32_MBEDTLS_CPPFLAGS += -DMBEDTLS_USER_CONFIG_FILE='\"efr32-mbedtls-config.h\"' EFR32_MBEDTLS_CPPFLAGS += -D$(MCU) EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/examples/platforms/efr32mg12/crypto EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/silabs/gecko_sdk_suite/v2.6/util/third_party/mbedtls/configs EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/silabs/gecko_sdk_suite/v2.6/platform/CMSIS/Include EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/silabs/gecko_sdk_suite/v2.6/util/third_party/mbedtls/sl_crypto/include EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/silabs/gecko_sdk_suite/v2.6/platform/Device/SiliconLabs/EFR32MG12P/Include EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/silabs/gecko_sdk_suite/v2.6/platform/emlib/inc EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/silabs/gecko_sdk_suite/v2.6/platform/radio/rail_lib/chip/efr32/efr32xg1x EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/mbedtls EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/mbedtls/repo/include EFR32_MBEDTLS_CPPFLAGS += -I$(AbsTopSourceDir)/third_party/mbedtls/repo/include/mbedtls CONFIG_FILE_PATH = $(AbsTopSourceDir)/examples/platforms/efr32mg12/ HAL_CONF_DIR = $(CONFIG_FILE_PATH)/$(shell echo $(BOARD) | tr A-Z a-z) EFR32MG12_CONFIG_FILE_CPPFLAGS = -DOPENTHREAD_PROJECT_CORE_CONFIG_FILE='\"openthread-core-efr32-config.h\"' EFR32MG12_CONFIG_FILE_CPPFLAGS += -DOPENTHREAD_CORE_CONFIG_PLATFORM_CHECK_FILE='\"openthread-core-efr32-config-check.h\"' EFR32MG12_CONFIG_FILE_CPPFLAGS += -I$(CONFIG_FILE_PATH) COMMONCFLAGS := \ -fdata-sections \ -ffunction-sections \ -Os \ -g \ -I$(HAL_CONF_DIR) \ -D__START=main \ -D$(MCU) \ $(EFR32MG12_CONFIG_FILE_CPPFLAGS) \ $(NULL) include $(dir $(abspath $(lastword $(MAKEFILE_LIST))))/common-switches.mk # # Platform-Specific switches # DMP ?= 0 RADIODEBUG ?= 0 ifeq ($(DMP),1) COMMONCFLAGS += -DRADIO_CONFIG_DMP_SUPPORT=1 endif ifeq ($(RADIODEBUG),1) COMMONCFLAGS += -DRADIO_CONFIG_DEBUG_COUNTERS_SUPPORT=1 endif CPPFLAGS += \ $(COMMONCFLAGS) \ $(target_CPPFLAGS) \ $(NULL) CFLAGS += \ $(COMMONCFLAGS) \ $(target_CFLAGS) \ $(NULL) CXXFLAGS += \ $(COMMONCFLAGS) \ $(target_CXXFLAGS) \ -fno-exceptions \ -fno-rtti \ $(NULL) LDFLAGS += \ $(COMMONCFLAGS) \ $(target_LDFLAGS) \ -nostartfiles \ -specs=nano.specs \ -specs=nosys.specs \ -Wl,--gc-sections \ $(NULL) ECHO := @echo MAKE := make MKDIR_P := mkdir -p LN_S := ln -s RM_F := rm -f INSTALL := /usr/bin/install INSTALLFLAGS := -p BuildPath = build TopBuildDir = $(BuildPath) AbsTopBuildDir = $(PWD)/$(TopBuildDir) ResultPath = output TopResultDir = $(ResultPath) AbsTopResultDir = $(PWD)/$(TopResultDir) TargetTuple = efr32mg12 ARCHS = cortex-m4 TopTargetLibDir = $(TopResultDir)/$(TargetTuple)/lib ifndef BuildJobs BuildJobs := $(shell getconf _NPROCESSORS_ONLN) endif JOBSFLAG := -j$(BuildJobs) # # configure-arch # # Configure OpenThread for the specified architecture. # # arch - The architecture to configure. # define configure-arch $(ECHO) " CONFIG $(TargetTuple)..." (cd $(BuildPath)/$(TargetTuple) && $(AbsTopSourceDir)/configure \ INSTALL="$(INSTALL) $(INSTALLFLAGS)" \ CPP="$(CPP)" CC="$(CC)" CXX="$(CXX)" OBJC="$(OBJC)" OBJCXX="$(OBJCXX)" AR="$(AR)" RANLIB="$(RANLIB)" NM="$(NM)" STRIP="$(STRIP)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" \ --host=arm-none-eabi \ --prefix=/ \ --exec-prefix=/$(TargetTuple) \ $(configure_OPTIONS)) endef # configure-arch # # build-arch # # Build the OpenThread intermediate build products for the specified # architecture. # # arch - The architecture to build. # define build-arch $(ECHO) " BUILD $(TargetTuple)" $(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(TargetTuple) --no-print-directory \ all endef # build-arch # # stage-arch # # Stage (install) the OpenThread final build products for the specified # architecture. # # arch - The architecture to stage. # define stage-arch $(ECHO) " STAGE $(TargetTuple)" $(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(TargetTuple) --no-print-directory \ DESTDIR=$(AbsTopResultDir) \ install endef # stage-arch # # ARCH_template # # Define macros, targets and rules to configure, build, and stage the # OpenThread for a single architecture. # # arch - The architecture to instantiate the template for. # define ARCH_template CONFIGURE_TARGETS += configure-$(1) BUILD_TARGETS += do-build-$(1) STAGE_TARGETS += stage-$(1) BUILD_DIRS += $(BuildPath)/$(TargetTuple) DIRECTORIES += $(BuildPath)/$(TargetTuple) configure-$(1): target_CPPFLAGS=$($(1)_target_CPPFLAGS) configure-$(1): target_CFLAGS=$($(1)_target_CFLAGS) configure-$(1): target_CXXFLAGS=$($(1)_target_CXXFLAGS) configure-$(1): target_LDFLAGS=$($(1)_target_LDFLAGS) configure-$(1): $(BuildPath)/$(TargetTuple)/config.status $(BuildPath)/$(TargetTuple)/config.status: | $(BuildPath)/$(TargetTuple) $$(call configure-arch,$(1)) do-build-$(1): configure-$(1) do-build-$(1): +$$(call build-arch,$(1)) stage-$(1): do-build-$(1) stage-$(1): | $(TopResultDir) $$(call stage-arch,$(1)) $(1): stage-$(1) endef # ARCH_template .DEFAULT_GOAL := all all: stage # # cortex-m4 # cortex-m4_target_ABI = cortex-m4 cortex-m4_target_CPPFLAGS = -mcpu=cortex-m4 -mfloat-abi=soft -mthumb cortex-m4_target_CFLAGS = -mcpu=cortex-m4 -mfloat-abi=soft -mthumb cortex-m4_target_CXXFLAGS = -mcpu=cortex-m4 -mfloat-abi=soft -mthumb cortex-m4_target_LDFLAGS = -mcpu=cortex-m4 -mfloat-abi=soft -mthumb # Instantiate an architecture-specific build template for each target # architecture. $(foreach arch,$(ARCHS),$(eval $(call ARCH_template,$(arch)))) # # Common / Finalization # configure: $(CONFIGURE_TARGETS) build: $(BUILD_TARGETS) stage: $(STAGE_TARGETS) DIRECTORIES = $(TopResultDir) $(TopResultDir)/$(TargetTuple)/lib $(BUILD_DIRS) CLEAN_DIRS = $(TopResultDir) $(BUILD_DIRS) all: stage $(DIRECTORIES): $(ECHO) " MKDIR $@" @$(MKDIR_P) "$@" clean: $(ECHO) " CLEAN" @$(RM_F) -r $(CLEAN_DIRS) help: $(ECHO) "Simply type 'make -f $(firstword $(MAKEFILE_LIST))' to build OpenThread for the following " $(ECHO) "architectures: " $(ECHO) "" $(ECHO) " $(ARCHS)" $(ECHO) "" $(ECHO) "To build only a particular architecture, specify: " $(ECHO) "" $(ECHO) " make -f $(firstword $(MAKEFILE_LIST)) " $(ECHO) ""