############################################################################
# nuttx-configs/Make.defs
#
#   Copyright (C) 2011 Gregory Nutt. All rights reserved.
#   Author: Gregory Nutt <gnutt@nuttx.org>
#
# 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 NuttX 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 OWNER 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.
#
############################################################################

include $(TOPDIR)/.config
include $(TOPDIR)/tools/Config.mk

CINCPATH := $(shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include)
CXXINCPATH := $(shell $(INCDIR) -s "$(CC)" $(TOPDIR)$(DELIM)include$(DELIM)cxx)

ARCHINCLUDES += $(CINCPATH)
ARCHXXINCLUDES += $(CINCPATH) $(CXXINCPATH)

ifeq ($(CONFIG_CYGWIN_WINTOOL),y)
  ARCHSCRIPT = -T "$(shell cygpath -w $(BOARD_DIR)$(DELIM)scripts$(DELIM)flash.ld)"
else
  ARCHSCRIPT = -T$(BOARD_DIR)$(DELIM)scripts$(DELIM)flash.ld
endif

CC = ${CMAKE_C_COMPILER}
CXX = ${CMAKE_CXX_COMPILER}
CPP = ${CMAKE_C_COMPILER} -E
LD = ${CMAKE_LD}
STRIP = ${CMAKE_STRIP} --strip-unneeded
AR = ${CMAKE_AR} rcs
NM = ${CMAKE_NM}
OBJCOPY = ${CMAKE_OBJCOPY}
OBJDUMP = ${CMAKE_OBJDUMP}

ARCHCCVERSION = $(shell $(CC) -v 2>&1 | sed -n '/^gcc version/p' | sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q')
ARCHCCMAJOR = $(shell echo $(ARCHCCVERSION) | cut -d'.' -f1)

ifeq ($(CONFIG_BOARD_USE_PROBES),y)
   ARCHINCLUDES += -I$(TOPDIR)/arch/$(CONFIG_ARCH)/src/$(CONFIG_ARCH_CHIP) -I$(TOPDIR)/arch/$(CONFIG_ARCH)/src/common
   ARCHXXINCLUDES += -I$(TOPDIR)/arch/$(CONFIG_ARCH)/src/$(CONFIG_ARCH_CHIP)  -I$(TOPDIR)/arch/$(CONFIG_ARCH)/src/common
endif

ifeq ($(CONFIG_DEBUG_CUSTOMOPT),y)
   MAXOPTIMIZATION = $(CONFIG_DEBUG_OPTLEVEL)
else
   MAXOPTIMIZATION = -Os
endif

FLAGS = $(MAXOPTIMIZATION) -g2 \
	-fdata-sections \
	-ffunction-sections \
	-fno-builtin-printf \
	-fno-common \
	-fno-strength-reduce \
	-fno-strict-aliasing \
	-fomit-frame-pointer \
	-Wall \
	-Werror \
	-Wextra \
	-Wlogical-op \
	-Wno-cpp \
	-Wno-format-truncation \
	-Wno-maybe-uninitialized \
	-Wno-missing-field-initializers \
	-Wno-sign-compare \
	-Wno-type-limits \
	-Wno-unused-parameter \
	-Wpointer-arith

FLAGS += $(EXTRAFLAGS)

# enable precise stack overflow tracking
ifeq ($(CONFIG_ARMV7M_STACKCHECK),y)
	FLAGS += -finstrument-functions -ffixed-r10
endif

CFLAGS = $(ARCHINCLUDES) \
	-std=gnu11 \
	${CMAKE_C_FLAGS} \
	$(FLAGS) \
	-Wno-bad-function-cast \
	-Wno-float-equal \
	-Wno-implicit-fallthrough \
	-Wno-implicit-function-declaration \
	-Wno-logical-op \
	-Wno-missing-declarations \
	-Wno-missing-field-initializers \
	-Wno-missing-prototypes \
	-Wno-nested-externs \
	-Wno-nonnull-compare \
	-Wno-old-style-declaration \
	-Wno-sign-compare \
	-Wno-type-limits \
	${CMAKE_C_COMP_DEP_FLAGS}

CXXFLAGS = $(ARCHXXINCLUDES) \
	-std=c++14 \
	-nostdinc++ \
	${CMAKE_CXX_FLAGS} \
	$(FLAGS) \
	-fcheck-new \
	-fno-builtin \
	-fno-exceptions \
	-fno-rtti \
	-fno-sized-deallocation \
	-nostdinc++ \
	-Wno-double-promotion \
	-Wno-missing-declarations

CPPFLAGS = $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS)
AFLAGS = $(CFLAGS) -D__ASSEMBLY__

ASMEXT = .S
OBJEXT = .o
LIBEXT = .a
EXEEXT =

define COMPILE
	$(Q) ${CCACHE_PROGRAM} $(CC) -c $(CFLAGS) $($(strip $1)_CFLAGS) $1 -o $2
endef

define COMPILEXX
	$(Q) ${CCACHE_PROGRAM} $(CXX) -c $(CXXFLAGS) $($(strip $1)_CXXFLAGS) $1 -o $2
endef

define ASSEMBLE
	$(Q) ${CCACHE_PROGRAM} $(CC) -c $(AFLAGS) $1 $($(strip $1)_AFLAGS) -o $2
endef

define ARCHIVE
    $(AR) $1 $(2)
endef
