#
#    <COPYRIGHT>
#
#    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.
#

#    Description:
#      This file implements a glue makefile for building the CHIP SDK
#      for standalone desktop or server build host systems.
#
#      This is strictly a convenience makefile. Such systems can
#      otherwise be built using the usual GNU autotools convention of:
#
#        % ./configure
#        % make
#

# Don't allow this top-level makefile's targets to be built in parallel.

.NOTPARALLEL:

COVERAGE                       ?= 0
DEBUG                          ?= 0
TIMESTAMP                      ?= 0
TUNNEL_FAILOVER                ?= 0
USE_LWIP                       ?= 0
NO_OPENSSL                     ?= 0
BLUEZ                          ?= 0
USE_FUZZING                    ?= 0
TESTS                          ?= 1

HOSTOS                          = $(shell uname -s |tr [:upper:] [:lower:])
ARCH                            = $(shell uname -m |tr [:upper:] [:lower:])

ECHO                           := @echo
MAKE                           := make
MKDIR_P                        := mkdir -p
LN_S                           := ln -s
RM_F                           := rm -f

INSTALL                        := /usr/bin/install
INSTALLFLAGS                   := -p

TopSourceDir                   := $(dir $(shell readlink $(firstword $(MAKEFILE_LIST))))
AbsTopSourceDir                := $(dir $(realpath $(firstword $(MAKEFILE_LIST))))

BuildPath                       = build
TopBuildDir                     = $(BuildPath)
AbsTopBuildDir                  = $(CURDIR)/$(TopBuildDir)

ResultPath                      = output
TopResultDir                    = $(ResultPath)
AbsTopResultDir                 = $(CURDIR)/$(TopResultDir)

TargetTuple                     = $(shell ${AbsTopSourceDir}/third_party/nlbuild-autotools/repo/third_party/autoconf/config.guess | sed -e 's/[[:digit:].]*$$//g')

ifeq ($(HOSTOS),darwin)
ProjectConfigDir               ?= $(AbsTopSourceDir)/build/config/standalone/darwin
else
ProjectConfigDir               ?= $(AbsTopSourceDir)/build/config/standalone
endif

ifeq ($(ARCH),x86_64)
configure_OPTIONS               = CPPFLAGS="-maes"
endif

# NOTE: Mac OS SDKs generated on OS X Sierra (or higher) seem to have trouble
#       running on El Capitan (or earlier) due to issues with clock_gettime: 
#       declaring the interface in time.h but not making the symbol 
#       available in libSystem.dylib, resulting in a runtime crash. For 
#       now, suppress use of clock_getttime on OS X by overriding 
#       configure and asserting:
#
#         ac_cv_func_clock_gettime=no
#         ac_cv_have_decl_clock_gettime=no
#
#       below.
#

ifeq ($(HOSTOS),darwin)
configure_OPTIONS              += ac_cv_func_clock_gettime=no  ac_cv_have_decl_clock_gettime=no
endif

# By default, attempt use the system's OpenSSL library, falling back to building the internal
# copy of OpenSSL (in third_party/openssl) when necessary.
#
# On Linux, the logic uses pkg-config to determine if the OpenSSL development package (libssl-dev)
# has been installed.  If not, the internal copy of OpenSSL is built.
#
# On OS X, the logic uses homebrew to determine if OpenSSL has been installed.  If not, the
# internal copy of OpenSSL will be built.
#
# The variable OPENSSL can be used to override the above logic and specify a particular root
# directory in which to find the OpenSSL headers and libraries.
#
# Setting OPENSSL=no or NO_OPENSSL=1 will cause CHIP to be built without OpenSSL.  Note that
# building without OpenSSL automatically suppresses the building of various command line tools that
# have a hard dependency on OpenSSL (e.g. the CHIP tool).

ifeq ($(NO_OPENSSL),1)
OPENSSL                         = no
else
ifeq ($(HOSTOS),darwin)
OPENSSL                        ?= $(shell if which brew > /dev/null && brew ls --versions openssl > /dev/null; then brew --prefix openssl; else echo "internal"; fi)
else
OPENSSL                        ?= $(shell if which pkg-config > /dev/null && pkg-config --exists openssl; then echo ""; else echo "internal"; fi)
endif
endif
configure_OPTIONS              += --with-openssl=$(OPENSSL)
ifeq ($(OPENSSL),no)
configure_OPTIONS              += --disable-tools
ProjectConfigDir                = $(AbsTopSourceDir)/build/config/standalone/no-openssl
endif

# If the user has asserted USE_FUZZING enable fuzzing build
ifeq ($(USE_FUZZING),1)
configure_OPTIONS              += --enable-fuzzing
endif

# If the user has asserted COVERAGE, alter the configuration options
# accordingly.

ifeq ($(COVERAGE),1)
# no point in enabling docs generation for a coverage build
configure_OPTIONS              += --enable-coverage --enable-coverage-reports --disable-docs
# Happy checks are time consuming, but on average less processor intensive than
# compiling and running unit-tests.
# Bump the number of builds, it primarily has an effect on the make check
# phase of the build.
BuildJobs                      ?= $(shell echo $$(( `getconf _NPROCESSORS_ONLN` * 2 )) )
endif

# On properly configured 64-bit Linux machines, recognize the
# I686TARGET flag and build the 32-bit image.

ifeq ($(HOSTOS),linux)
ifeq ($(ARCH),x86_64)
ifeq ($(I686TARGET),1)
TargetTuple                     = i686-pc-linux-gnu
configure_OPTIONS              += --build=$(TargetTuple) CFLAGS="-m32 -g -O2"  CXXFLAGS="-m32 -g -O2" LDFLAGS="-m32 -L/usr/lib/i386-linux-gnu/"
endif
endif
endif

# If the user has asserted DEBUG, alter the configuration options
# accordingly.

ifeq ($(DEBUG),1)
configure_OPTIONS              += --enable-debug --enable-optimization=no
else
configure_OPTIONS              += 
endif

# Disable docs generation
ifeq ($(DOCS),0)
configure_OPTIONS              += --disable-docs
else
configure_OPTIONS              +=
endif

# If the user has asserted TIMESTAMP, alter the configuration options
# accordingly.
ifeq ($(TIMESTAMP),1)
configure_OPTIONS              += --enable-stdio-logging-timestamps
else
configure_OPTIONS              +=
endif

# If the user has used tunnel failover, alter the configuration options
# accordingly.
ifeq ($(TUNNEL_FAILOVER),1)
configure_OPTIONS              += --enable-tunnel-failover
else
configure_OPTIONS              +=
endif

# If the user has chipoble over bluez peripheral, alter the configuration options
# accordingly.
ifeq ($(BLUEZ),1)
configure_OPTIONS              += --enable-experimental --enable-deprecated --enable-testing --enable-tools --disable-systemd --enable-debug
else
configure_OPTIONS              += --with-bluez=no
endif

# Disable tests generation
ifeq ($(TESTS),0)
configure_OPTIONS              += --disable-tests
else
configure_OPTIONS              +=
endif

# If the user has asserted USE_LWIP, alter the configuration and
# target tuple to use LwIP rather than the expected BSD sockets.

ifeq ($(USE_LWIP),1)
configure_OPTIONS               += --with-target-network=lwip --with-lwip=internal --disable-java
TargetTuple                     := $(TargetTuple)-lwip
endif

ifeq ($(LONG_TESTS),1)
configure_OPTIONS               += --enable-long-tests=yes
endif

ifeq ($(ENABLE_CHIPOBLE_TEST),1)
configure_OPTIONS               += --enable-chipoble-test=yes
endif

ifndef BuildJobs
BuildJobs := $(shell getconf _NPROCESSORS_ONLN)
endif
JOBSFLAG := -j$(BuildJobs)

#
# automake files
#
AMFILES =                               \
	src/system/Makefile.am              \
	src/lib/Makefile.am                 \
	src/inet/Makefile.am                \
	src/ble/Makefile.am                 \
	src/lwip/Makefile.am                \
	src/Makefile.am                     \
	third_party/Makefile.am             \
	Makefile.am                         \
	configure.ac                        \
	$(NULL)

#
# configure-arch <target>
#
# Configure the CHIP SDK for the specified target.
#
#   target - The target to configure.
#
define configure-target
$(ECHO) "  CONFIG   $(1)..."
(cd $(BuildPath)/$(1) && $(AbsTopSourceDir)/configure \
INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
--prefix=/ \
--exec-prefix=/$(1) \
--with-chip-project-includes=$(ProjectConfigDir) \
$(configure_OPTIONS))
endef # configure-target

#
# build-target <target>
#
# Build the CHIP SDK 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 <target>
#
# Check (run unit tests) the CHIP SDK 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 <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 <target>
#
# Generate code coverage from unit tests for the CHIP SDK 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 <target>
#
# Stage (install) the CHIP SDK 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

#
# pretty-target <target>
#
# Prettyify the CHIP SDK source code for the specified target.
#
#   target - The target to prettify.
#
define pretty-target
$(ECHO) "  PRETTY   $(1)"
$(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(1) --no-print-directory \
pretty
endef # pretty-target

#
# pretty-check-target <target>
#
# Pretty-check (lint) the CHIP SDK source code for the specified
# target.
#
#   target - The target to pretty-check (lint).
#
define pretty-check-target
$(ECHO) "  PRETTY   $(1)"
$(MAKE) $(JOBSFLAG) -C $(BuildPath)/$(1) --no-print-directory \
pretty-check
endef # pretty-check-target

#
# TARGET_template <target>
#
# Define macros, targets and rules to configure, build, and stage the
# CHIP SDK 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)
PRETTY_TARGETS       += pretty-$(1)
PRETTY_CHECK_TARGETS += pretty-check-$(1)
BUILD_DIRS           += $(BuildPath)/$(1)
DIRECTORIES          += $(BuildPath)/$(1)

configure-$(1): Makefile.in $(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))

pretty-$(1): configure-$(1)
	$$(call pretty-target,$(1))

lint-$(1) pretty-check-$(1): configure-$(1)
	$$(call pretty-check-target,$(1))

$(1): stage-$(1)
endef # TARGET_template

.PHONY : configure build check coverage stage pretty lint pretty-check clean ensure-sudo help

ensure-sudo:
	$(ECHO) "Selected target will require sudo access."
	@sudo echo "Sudo access granted"

.DEFAULT_GOAL := all

all: stage

# Instantiate an target-specific build template for the target.

$(eval $(call TARGET_template,$(TargetTuple)))

#
# Common / Finalization
#

Makefile.in: $(AMFILES)
	$(ECHO) "BOOTSTRAP"
	@./bootstrap

configure: $(CONFIGURE_TARGETS)

build: $(BUILD_TARGETS)

check: ensure-sudo $(CHECK_TARGETS)

distcheck: ensure-sudo $(DISTCHECK_TARGETS)

coverage: ensure-sudo $(COVERAGE_TARGETS)

stage: $(STAGE_TARGETS)

pretty: $(PRETTY_TARGETS)

lint pretty-check: $(PRETTY_CHECK_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 "$${HelpText}"

export HelpText
define HelpText
Simply type 'make -f $(firstword $(MAKEFILE_LIST))' to build CHIP for the following
target:

    $(TargetTuple)

You may want or need to override the following make variables either on the 
command line or in the environment: 

  DEBUG=[1|0]             Enable/disable CHIP debug code and logging (default: '$(DEBUG)').

  COVERAGE=[1|0]          Enable/disable generation of code coverage information 
                          (default: '$(COVERAGE)').

  TIMESTAMP=[1|0]         Enable/disable logging module timestamp output (default: '$(TIMESTAMP)').

  USE_LWIP=[1|0]          Build the standalone configuration against the LwIP 
                          library rather than against sockets (default '$(USE_LWIP)').

  BLUEZ=[1|0]             Enable support for BLE peripheral using BlueZ bindings 

  OPENSSL=<dir>           Use the prebuilt version of OpenSSL located in the given 
                          directory. Note that the directory is expected to contain 
                          include and lib subdirectories containing the necessary header 
                          and libraries. 

  OPENSSL=internal        Build the internal copy of OpenSSL as part of the CHIP
                          build.

  OPENSSL=no              Build an alternate configuration that does not depend
  NO_OPENSSL=1            on the use of OpenSSL (default: '$(NO_OPENSSL)'.  Note
                          that the various command line tools that depend on
                          OpenSSL (e.g., the CHIP tool) will not be built in
                          this configuration.

  TUNNEL_FAILOVER=[1|0]   Enable/disabled support for redundant VPN to the CHIP service
                          (default: '$(TUNNEL_FAILOVER)').

  I686TARGET=[1|0]        Enable/disable building a 32-bit target.  Requires a properly
                          configured 64-bit Linux with multilib support (default: '$(I686TARGET)').

  DOCS=[1|0]              Enable/disable Doxygen-generated documentation (default: '$(DOCS)').
                          Note this flag only has an effect when Doxygen is
                          installed.

  HAPPY=[1|0]             When set to 0, skip the functional tests that require
                          Happy orchestration tool.  When set to 1, pick the
                          default location to the Happy tool.  When set to any
                          other value, the value is treated as the location of
                          the Happy tool.

  TESTS=[1|0]             Enable/disable tests (default: '$(TESTS)').

endef
