blob: 3bb0e0689fa1ec9a7fa60adb7c63445d4c5a36d9 [file] [log] [blame]
#
# Copyright (c) 2019 Google LLC.
# All rights reserved.
#
# 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.
#
#
# @file
# Component makefile for incorporating OpenThread into an nRF5
# application.
#
#
# This makefile is intended to work in conjunction with the nrf5-app.mk
# makefile to build the OpenWeave example applications on Nordic platforms.
# nRF5 applications should include this file in their top level Makefile
# after including nrf5-app.mk and nrf5-openweave.mk. E.g.:
#
# PROJECT_ROOT = $(realpath .)
#
# BUILD_SUPPORT_DIR = $(PROJECT_ROOT)/third_party/openweave-core/build/nrf5
#
# include $(BUILD_SUPPORT_DIR)/nrf5-app.mk
# include $(BUILD_SUPPORT_DIR)/nrf5-openweave.mk
# include $(BUILD_SUPPORT_DIR)/nrf5-openthread.mk
#
# PROJECT_ROOT := $(realpath .)
#
# APP := openweave-nrf52840-bringup
#
# SRCS = \
# $(PROJECT_ROOT)/main.cpp \
# ...
#
# $(call GenerateBuildRules)
#
# ==================================================
# General settings
# ==================================================
# OpenThread source root directory
OPENTHREAD_ROOT ?= $(PROJECT_ROOT)/third_party/openthread
# Target for which OpenThread will be built.
OPENTHREAD_TARGET = nrf52840
# Archtecture for which OpenThread will be built.
OPENTHREAD_HOST_ARCH = arm-none-eabi
# Directory into which the OpenThread build system will place its output.
OPENTHREAD_OUTPUT_DIR = $(OUTPUT_DIR)/openthread
# Directory containing OpenThread libraries.
OPENTHREAD_LIB_DIR = $(if $(filter-out 0, $(USE_PREBUILT_OPENTHREAD)), \
$(NRF5_SDK_ROOT)/external/openthread/lib/$(OPENTHREAD_TARGET)/gcc/mtls_ts, \
$(OPENTHREAD_OUTPUT_DIR)/lib)
# Prerequisite target for anything that depends on the output of the OpenThread
# build process.
OPENTHREAD_PREREQUISITE = $(if $(filter-out 0, $(USE_PREBUILT_OPENTHREAD)),,install-thread)
# Name of OpenThread's platform config file. By default, this is set to
# the nRF5-specific file found in OpenThread's examples directory.
# Applications can override this to force inclusion of their own configuration
# file. However, in most cases, the application-specified file should include
# the Nordic file to ensure that OpenThread is configured properly for the
# for nRF5 platforms.
OPENTHREAD_PROJECT_CONFIG = openthread-core-$(OPENTHREAD_TARGET)-config.h
# Additional header files needed by the Nordic port of OpenThread
# but not installed automatically by OpenThread's build system.
OPENTHREAD_PLATFORM_HEADERS = \
$(OPENTHREAD_ROOT)/examples/platforms/$(OPENTHREAD_TARGET)/platform-fem.h \
$(OPENTHREAD_ROOT)/examples/platforms/$(OPENTHREAD_TARGET)/platform-softdevice.h \
$(OPENTHREAD_ROOT)/examples/platforms/$(OPENTHREAD_TARGET)/openthread-core-$(OPENTHREAD_TARGET)-config.h \
$(OPENTHREAD_ROOT)/examples/platforms/openthread-system.h
# ==================================================
# Build options
# ==================================================
# Use the prebuilt OpenThread libraries included in the Nordic nRF5 SDK instead of
# building OpenThread from source.
#
# NOTE: Due to the lack of multi-threading support in Nordic's port of OpenThread
# (in particular, in the crypto code) it is currently not possible to build a working
# OpenWeave application that uses the prebuilt OpenThread libraries.
#
USE_PREBUILT_OPENTHREAD ?= 0
# ==================================================
# Compilation flags / settings specific to building
# OpenThread itself.
# ==================================================
OPENTHREAD_CPPFLAGS = $(STD_CFLAGS) $(DEBUG_FLAGS) $(OPT_FLAGS) -Wno-expansion-to-defined $(OPENTHREAD_DEFINE_FLAGS) $(OPENTHREAD_INC_FLAGS)
OPENTHREAD_CXXFLAGS = $(STD_CXXFLAGS) -Wno-expansion-to-defined
OPENTHREAD_CCASFLAGS = $(STD_ASFLAGS)
OPENTHREAD_DEFINE_FLAGS = $(foreach def,$(OPENTHREAD_DEFINES),-D$(def))
OPENTHREAD_INC_FLAGS = $(foreach dir,$(OPENTHREAD_INC_DIRS),-I$(dir))
# NOTE: Due to the lack of multi-threading support in Nordic's port, OpenThread
# must be build with CC310 support DISABLED in order to work with OpenWeave.
# This enables various software implementations that are inherently thread-safe.
OPENTHREAD_DEFINES = \
NRF52840_XXAA \
DISABLE_CC310=1 \
MBEDTLS_THREADING=1 \
MBEDTLS_CONFIG_FILE='"mbedtls-config.h"' \
MBEDTLS_USER_CONFIG_FILE='"nrf52840-mbedtls-config.h"' \
OPENTHREAD_PROJECT_CORE_CONFIG_FILE='"$(OPENTHREAD_PROJECT_CONFIG)"'
OPENTHREAD_INC_DIRS = \
$(PROJECT_ROOT) \
$(OPENTHREAD_ROOT)/examples/platforms \
$(OPENTHREAD_ROOT)/examples/platforms/$(OPENTHREAD_TARGET) \
$(OPENTHREAD_ROOT)/third_party/NordicSemiconductor/libraries/crypto \
$(OPENTHREAD_ROOT)/third_party/NordicSemiconductor/libraries/nrf_cc310/include \
$(NRF5_SDK_ROOT)/modules/nrfx/mdk
# ==================================================
# Utility Functions
# ==================================================
QuoteChar = "
DoubleQuoteStr = $(QuoteChar)$(subst $(QuoteChar),\$(QuoteChar),$(subst \,\\,$(1)))$(QuoteChar)
# ==================================================
# OpenThread configuration options
# ==================================================
OPENTHREAD_CONFIGURE_OPTIONS = \
CPP="$(CPP)" CC="$(CCACHE) $(CC)" CXX="$(CCACHE) $(CXX)" \
CCAS="$(CCACHE) $(CC)" AS="${AS}" AR="$(AR)" RANLIB="$(RANLIB)" \
NM="$(NM)" STRIP="$(STRIP)" OBJDUMP="$(OBJCOPY)" OBJCOPY="$(OBJCOPY)" \
SIZE="$(SIZE)" RANLIB="$(RANLIB)" INSTALL="$(INSTALL) $(INSTALLFLAGS) -m644" \
CPPFLAGS=$(call DoubleQuoteStr, $(OPENTHREAD_CPPFLAGS)) \
CXXFLAGS=$(call DoubleQuoteStr, $(OPENTHREAD_CXXFLAGS)) \
CCASFLAGS=$(call DoubleQuoteStr, $(OPENTHREAD_CCASFLAGS)) \
LDFLAGS="" \
--prefix=$(OPENTHREAD_OUTPUT_DIR) \
--exec-prefix=$(OPENTHREAD_OUTPUT_DIR) \
--host=$(OPENTHREAD_HOST_ARCH) \
--srcdir="$(OPENTHREAD_ROOT)" \
--enable-ftd \
--enable-mtd \
--enable-diag \
--enable-linker-map \
--with-examples=nrf52840 \
--disable-tools \
--disable-tests \
--disable-docs
# Enable / disable optimization.
ifeq ($(OPT),1)
OPENTHREAD_CONFIGURE_OPTIONS += --enable-optimization=yes
else
OPENTHREAD_CONFIGURE_OPTIONS += --enable-optimization=no
endif
# ==================================================
# Adjustments to standard build settings to
# incorporate OpenThread into the application.
# ==================================================
STD_DEFINES += \
DISABLE_CC310=1 \
MBEDTLS_THREADING=1 \
MBEDTLS_CONFIG_FILE='"mbedtls-config.h"' \
MBEDTLS_USER_CONFIG_FILE='"nrf52840-mbedtls-config.h"'
# Add the appropriate path to the public OpenThread headers to the application's
# compile actions.
STD_INC_DIRS_PREBUILT = \
$(NRF5_SDK_ROOT)/external/openthread/include \
$(NRF5_SDK_ROOT)/external/openthread/project/$(OPENTHREAD_TARGET) \
$(NRF5_SDK_ROOT)/external/openthread/include/openthread/platform/mbedtls
# $(NRF5_SDK_ROOT)/external/nrf_cc310/include
STD_INC_DIRS_BUILT = \
$(OPENTHREAD_OUTPUT_DIR)/include \
$(OPENTHREAD_ROOT)/third_party/mbedtls \
$(OPENTHREAD_ROOT)/third_party/mbedtls/repo/include \
$(OPENTHREAD_ROOT)/third_party/NordicSemiconductor/libraries/crypto
# $(OPENTHREAD_ROOT)/third_party/NordicSemiconductor/libraries/nrf_cc310/include
STD_INC_DIRS += $(if $(filter-out 0, $(USE_PREBUILT_OPENTHREAD)), \
$(STD_INC_DIRS_PREBUILT), \
$(STD_INC_DIRS_BUILT))
# Add the location of OpenThread libraries to application link action.
# Also add the location of the cc310 library, in case it is needed.
STD_LDFLAGS += \
-L$(OPENTHREAD_LIB_DIR) \
-L$(NRF5_SDK_ROOT)/external/nrf_cc310/lib
# Add OpenThread libraries to standard libraries list.
STD_LIBS += \
-lopenthread-diag \
-lopenthread-ftd \
-lopenthread-platform-utils \
-lopenthread-nrf52840-softdevice-sdk \
-lnordicsemi-nrf52840-radio-driver-softdevice \
-lmbedcrypto
# Add the appropriate OpenThread target as a prerequisite to all application
# compilation targets to ensure that OpenThread gets built and its header
# files installed prior to compiling any dependent source files.
STD_COMPILE_PREREQUISITES += $(OPENTHREAD_PREREQUISITE)
# Add the OpenThread libraries as prerequisites for linking the application.
STD_LINK_PREREQUISITES += \
$(OPENTHREAD_LIB_DIR)/libopenthread-diag.a \
$(OPENTHREAD_LIB_DIR)/libopenthread-ftd.a \
$(OPENTHREAD_LIB_DIR)/libopenthread-platform-utils.a \
$(OPENTHREAD_LIB_DIR)/libmbedcrypto.a \
$(OPENTHREAD_LIB_DIR)/libopenthread-nrf52840-softdevice-sdk.a \
$(OPENTHREAD_LIB_DIR)/libnordicsemi-nrf52840-radio-driver-softdevice.a
# ==================================================
# Late-bound build rules for OpenThread
# ==================================================
ifneq ($(USE_PREBUILT_OPENTHREAD),1)
# Add OpenThreadBuildRules to the list of late-bound build rules that
# will be evaluated when GenerateBuildRules is called.
LATE_BOUND_RULES += OpenThreadBuildRules
# Rules for configuring, building and installing OpenThread from source.
define OpenThreadBuildRules
.PHONY : bootstrap-thread config-thread .check-config-thread build-thread install-thread clean-thread
bootstrap-thread $(OPENTHREAD_ROOT)/configure : $(OPENTHREAD_ROOT)/configure.ac
@echo "$(HDR_PREFIX)BOOTSTRAPPING OPENTHREAD..."
$(NO_ECHO)(cd $(OPENTHREAD_ROOT); ./bootstrap)
.check-config-thread : | $(OPENTHREAD_OUTPUT_DIR)
@echo $(OPENTHREAD_ROOT)/configure $(OPENTHREAD_CONFIGURE_OPTIONS) > $(OPENTHREAD_OUTPUT_DIR)/config.args.tmp; \
(test -r $(OPENTHREAD_OUTPUT_DIR)/config.args && cmp -s $(OPENTHREAD_OUTPUT_DIR)/config.args.tmp $(OPENTHREAD_OUTPUT_DIR)/config.args) || \
mv $(OPENTHREAD_OUTPUT_DIR)/config.args.tmp $(OPENTHREAD_OUTPUT_DIR)/config.args; \
rm -f $(OPENTHREAD_OUTPUT_DIR)/config.args.tmp;
$(OPENTHREAD_OUTPUT_DIR)/config.args : .check-config-thread
@: # Null action required to work around make's crazy timestamp caching behavior.
$(OPENTHREAD_OUTPUT_DIR)/config.status : $(OPENTHREAD_ROOT)/configure $(OPENTHREAD_OUTPUT_DIR)/config.args
@echo "$(HDR_PREFIX)CONFIGURE OPENTHREAD..."
$(NO_ECHO)(cd $(OPENTHREAD_OUTPUT_DIR) && $(OPENTHREAD_ROOT)/configure $(OPENTHREAD_CONFIGURE_OPTIONS))
config-thread : $(OPENTHREAD_OUTPUT_DIR)/config.status
build-thread : config-thread
@echo "$(HDR_PREFIX)BUILD OPENTHREAD..."
MAKEFLAGS= make -C $(OPENTHREAD_OUTPUT_DIR) --no-print-directory all V=$(VERBOSE)
install-thread : | build-thread
@echo "$(HDR_PREFIX)INSTALL OPENTHREAD..."
$(NO_ECHO)MAKEFLAGS= make -C $(OPENTHREAD_OUTPUT_DIR) --no-print-directory install V=$(VERBOSE)
$(NO_ECHO)$(INSTALL) $(INSTALLFLAGS) $(OPENTHREAD_PLATFORM_HEADERS) $(OPENTHREAD_OUTPUT_DIR)/include/openthread/platform
clean-thread:
@echo "$(HDR_PREFIX)RM $(OPENTHREAD_OUTPUT_DIR)"
$(NO_ECHO)rm -rf $(OPENTHREAD_OUTPUT_DIR)
$(OPENTHREAD_OUTPUT_DIR) :
@echo "$(HDR_PREFIX)MKDIR $$@"
$(NO_ECHO)mkdir -p "$$@"
endef
endif
# ==================================================
# OpenThread-specific help definitions
# ==================================================
define TargetHelp +=
bootstrap-thread Run the OpenThread bootstrap script.
config-thread Run the OpenThread configure script.
build-thread Build the OpenThread libraries.
install-thread Install OpenThread libraries and headers in
build output directory for use by application.
clean-thread Clean all build outputs produced by the OpenThread
build process.
endef
define OptionHelp +=
USE_PREBUILT_OPENTHREAD=[1|0]
Use the prebuilt OpenThread libraries included in
the Nordic nRF5 SDK instead of building OpenThread
from source.
endef