# # Copyright (c) 2016, 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. # # Don't allow this top-level makefile's targets to be built in parallel. .NOTPARALLEL: COVERAGE ?= 0 DEBUG ?= 0 ECHO := @echo MAKE := make MKDIR_P := mkdir -p LN_S := ln -s RM_F := rm -f BuildJobs ?= 10 # If the user has asserted COVERAGE, alter the configuration options # accordingly. configure_OPTIONS = \ --enable-application-coap \ --enable-application-coap-secure \ --enable-border-agent \ --enable-border-router \ --enable-cert-log \ --enable-child-supervision \ --enable-cli \ --enable-commissioner \ --enable-dhcp6-client \ --enable-dhcp6-server \ --enable-diag \ --enable-dns-client \ --enable-ftd \ --enable-jam-detection \ --enable-joiner \ --enable-legacy \ --enable-mac-filter \ --enable-mtd \ --enable-mtd-network-diagnostic \ --enable-ncp \ --with-ncp-bus=uart \ --enable-radio-only \ --enable-raw-link-api \ --enable-service \ --enable-udp-proxy \ --with-examples=posix \ $(NULL) TopSourceDir := $(dir $(shell readlink $(firstword $(MAKEFILE_LIST)))).. AbsTopSourceDir := $(dir $(realpath $(firstword $(MAKEFILE_LIST)))).. CONFIG_FILE = OPENTHREAD_PROJECT_CORE_CONFIG_FILE='\"openthread-core-posix-config.h\"' CONFIG_FILE_PATH = $(AbsTopSourceDir)/examples/platforms/posix/ COMMONCFLAGS := \ -O1 \ -g \ -D$(CONFIG_FILE) \ -I$(CONFIG_FILE_PATH) \ $(NULL) include $(dir $(abspath $(lastword $(MAKEFILE_LIST))))/common-switches.mk ifeq ($(VIRTUAL_TIME),1) COMMONCFLAGS += -DOPENTHREAD_POSIX_VIRTUAL_TIME=1 endif ifeq ($(VIRTUAL_TIME_UART),1) COMMONCFLAGS += -DOPENTHREAD_POSIX_VIRTUAL_TIME_UART=1 endif CPPFLAGS += \ $(COMMONCFLAGS) \ $(NULL) CFLAGS += \ $(COMMONCFLAGS) \ $(NULL) CXXFLAGS += \ $(COMMONCFLAGS) \ $(NULL) LDFLAGS += \ $(COMMONCFLAGS) \ $(NULL) INSTALL := /usr/bin/install INSTALLFLAGS := -p BuildPath = build TopBuildDir = $(BuildPath) AbsTopBuildDir = $(PWD)/$(TopBuildDir) ResultPath = output TopResultDir = $(ResultPath) AbsTopResultDir = $(PWD)/$(TopResultDir) TargetTuple = $(shell ${AbsTopSourceDir}/third_party/nlbuild-autotools/repo/third_party/autoconf/config.guess | sed -e 's/[[:digit:].]*$$//g') ifndef BuildJobs BuildJobs := $(shell getconf _NPROCESSORS_ONLN) endif JOBSFLAG := -j$(BuildJobs) # # configure-arch # # Configure OpenThread for the specified target. # # target - The target to configure. # define configure-target $(ECHO) " CONFIG $(1)..." (cd $(BuildPath)/$(1) && $(AbsTopSourceDir)/configure \ INSTALL="$(INSTALL) $(INSTALLFLAGS)" \ CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" \ --prefix=/ \ --exec-prefix=/$(1) \ $(configure_OPTIONS)) endef # configure-target # # build-target # # Build the OpenThread intermediate build products for the specified # target. # # target - The target to build. # define build-target $(ECHO) " BUILD $(1)" $(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(1) --no-print-directory \ all endef # build-target # # check-target # # Check (run unit tests) OpenThread for the specified target. # # target - The target to check. # define check-target $(ECHO) " CHECK $(1)" $(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(1) --no-print-directory \ check endef # check-target # # distcheck-target # # Check (run unit tests) OpenThread for the specified target. # # target - The target to distcheck. # define distcheck-target $(ECHO) " DISTCHECK $(1)" $(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(1) --no-print-directory \ distcheck endef # distcheck-target # # coverage-target # # Generate code coverage from unit tests for OpenThread for the # specified target. # # target - The target to generate code coverage for. # define coverage-target $(ECHO) " COVERAGE $(1)" $(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(1) --no-print-directory \ coverage endef # coverage-target # # stage-target # # Stage (install) the OpenThread final build products for the specified # target. # # target - The target to stage. # define stage-target $(ECHO) " STAGE $(1)" $(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(1) --no-print-directory \ DESTDIR=$(AbsTopResultDir) \ install endef # stage-target # # TARGET_template # # Define macros, targets and rules to configure, build, and stage # OpenThread for a single target. # # target - The target to instantiate the template for. # define TARGET_template CONFIGURE_TARGETS += configure-$(1) BUILD_TARGETS += do-build-$(1) CHECK_TARGETS += check-$(1) DISTCHECK_TARGETS += distcheck-$(1) COVERAGE_TARGETS += coverage-$(1) STAGE_TARGETS += stage-$(1) BUILD_DIRS += $(BuildPath)/$(1) DIRECTORIES += $(BuildPath)/$(1) configure-$(1): $(BuildPath)/$(1)/config.status $(BuildPath)/$(1)/config.status: | $(BuildPath)/$(1) $$(call configure-target,$(1)) do-build-$(1): configure-$(1) do-build-$(1): +$$(call build-target,$(1)) check-$(1): do-build-$(1) check-$(1): +$$(call check-target,$(1)) distcheck-$(1): do-build-$(1) distcheck-$(1): +$$(call distcheck-target,$(1)) coverage-$(1): do-build-$(1) coverage-$(1): +$$(call coverage-target,$(1)) stage-$(1): do-build-$(1) stage-$(1): | $(TopResultDir) $$(call stage-target,$(1)) $(1): stage-$(1) endef # TARGET_template .DEFAULT_GOAL := all all: stage # Instantiate an target-specific build template for the target. $(eval $(call TARGET_template,$(TargetTuple))) # # Common / Finalization # configure: $(CONFIGURE_TARGETS) build: $(BUILD_TARGETS) check: $(CHECK_TARGETS) distcheck: $(DISTCHECK_TARGETS) coverage: $(COVERAGE_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) "target:" $(ECHO) "" $(ECHO) " $(TargetTuple)" $(ECHO) ""