# Common Makefile configuration
#

# The following variables must be set
# MOD_NAME - module name. Depending on MOD_TYPE can be encapsulated (e.g., MOD_NAME=os --> libos.a)
# MOD_TYPE - module type. Supported types currently are "lib", "app", "linux_module", "linux_lib", "shared_lib"
#			 Note: 
#				For library module it is possible to specify "unitest" target in 
#				mk/$(SUBSYSTEM)/modules.core / .apps
#				In this case unitest.c is compiled and linked with its module library.
#				However, MOD_TYPE remains a "lib".  
#
# The following variables are optional
# srcs     - list of .c source files relative to SRC_DIR
# as_srcs  - list of .s (lower case s)   source files relative to SRC_DIR
# AS_srcs  - list of .S (upper case .S) source files relative to SRC_DIR 
# gen_bal_srcs - list of .c that have to be generated as part of the build from bal.objset
# gen_bal_hdrs - list of .h that have to be generated as part of the build from bal.objset
# gen_omci_srcs - list of .c that have to be generated as part of the build from omci.objset
# gen_omci_hdrs - list of .h that have to be generated as part of the build from omci.objset
# gen_omci_stack_srcs - list of .c that have to be generated as part of the build from omci_me_datamodel.csv
# gen_omci_stack_hdrs - list of .h that have to be generated as part of the build from omci_me_datamodel.csv
# MOD_DEPS - list of modules the "current" module depends on. OS abstraction layer dependency
#			 (module "os") is always present implicitly. For example, api_cli module's Makefile 
#			 includes the following line:
#			 MOD_DEPS = cli api utils model
# MOD_DEPS_OPT - similar to MOD_DEPS, but dependencies are optional and might not be present in the source tree.
# MOD_INC_DIRS - used when module exports includes in directory(s) other than the module directory 
# MOD_DEFS - additional defines, including -D. the defines are added when compiling "this" module
#			 and all modules depending on it
# MOD_LIBS - additional libraries required by the module, including -l and -L
# MOD_CUSTOM - if set "y", default rule for building the module is NOT provided.
#			 In this case the rule for building $(MOD_TARGET) must be provided in module's Makefile
# MOD_POST_BUILD - optional commands that should be executed after successful module build
# 
# The following variables are not required in most cases, but supported nonetheless
# EXTRA_CFLAGS - extra CFLAGS the module requires for compilation
# EXTRA_INCLUDES - extra include directories the module requires for compilation (with -I)
# EXTRA_LIBS_PATH - additional library search paths
# EXTRA_LIBS additional libraries to link with
#
# The following variables are pre-set and can be used in module-specific Makefile
# TOP_DIR - fully qualified top directory
# MOD_DIR - module directory relative to the top directory
# OUT_DIR_BASE - output directory base
# ALL_MODULES - list of all modules in the current subsystem (core/apps)
# ALL_LIB_MODULES - list of all lib modules in the current subsystem (core/apps)
# ALL_APP_MODULES - list of all app modules in the current subsystem (core/apps)
# SIMULATION_BUILD - set "y" for simulation build (CROSS_COMPILE is empty) 
# OS - OS
# ENABLE_EPON - set "y" if EPON mode is included
# ENABLE_GPON - set "y" if GPON mode is included
# ENABLE_XGPON - set "y" if XGPON mode is included
# ENABLE_GPON_OR_XGPON - set "y" if GPON or XGPON mode is included
# ENABLE_CLI - set "n" if CLI support is not required
# ENABLE_LOG - set "n" if logger support is not required
#
# USE_CLANG - set "y" to enable CLANG code pass for improved diagnostic
#
# The following variables are pre-set and can be used and/or overwritten in module-specific Makefile
# SRC_DIR - fully-qualified source directory
# OUT_DIR - module output directory
# TARGET_LIB - library name for "lib" or "shared_lib" module. By default it is $(MOD_NAME)
# TARGET_LIB_FNAME - module library file name including path. 
#		By default it is $(OUT_DIR)/lib$(TARGET_LIB).a for "lib" module and 
#		$(OUT_DIR)/lib$(TARGET_LIB).so for "shared_lib"
# MOD_TARGET - module target name, including path. By default it is 
#	$(OUT_DIR)/$(MOD_NAME) for "app" modules
#	$(TARGET_LIB_FNAME) for "lib" and "shared_lib" modules
# CODEGEN_OUTPUT_DIR - output directory containing generated files

TOOLCHAIN    ?= gcc
OS           ?= posix
DEBUG        ?= y
BLD_DEP      ?= gcc
USE_CLANG 	 ?= n

export SHELL := /bin/bash

export BOARD
export TOOLCHAIN
export OS
export DEBUG
export BLD_DEP
export OS_KERNEL

V ?= 0
ifeq (x"$(V)", x"0")
    SILENT_BUILD = @
endif

SRC_DIR		     = $(TOP_DIR)/$(MOD_DIR)
OUT_DIR_BASE 	?= $(TOP_DIR)/build/$(SUBSYSTEM)
OUT_DIR      	:= $(OUT_DIR_BASE)/$(MOD_DIR)

#
# Compiler warning configuration
# Some extra warnings are always enabled. Others must be opted in on the module level
#
ENABLE_EXTRA_WARNINGS ?= y
export ENABLE_EXTRA_WARNINGS

ifneq ("$(BUILD_NC_AGENT)", "y")
    override NC_AGENT := none
endif

# Include optional subsystem-specific configuration
-include mk/$(SUBSYSTEM)/Makefile.$(SUBSYSTEM).config

ENABLE_EPON	 ?= y
ENABLE_GPON	 ?= y
ENABLE_XGPON ?= y

ENABLE_GPON_OR_XGPON = n
ifeq ("$(ENABLE_GPON)", "y")
    ENABLE_GPON_OR_XGPON = y
endif
ifeq ("$(ENABLE_XGPON)", "y")
    ENABLE_GPON_OR_XGPON = y
endif
export ENABLE_EPON
export ENABLE_GPON
export ENABLE_XGPON
export ENABLE_GPON_OR_XGPON

CONFIG_DIR      = src/common/config
OS_PLATFORM_DIR = src/$(SUBSYSTEM)/platform

# CLI and logger support
ENABLE_CLI ?= y
ENABLE_LOG ?= y
BAL_MONOLITHIC ?= y

export ENABLE_CLI
export ENABLE_LOG
export BAL_MONOLITHIC

#
### Include module Makefile
# For MOD_CUSTOM only will be included in Makefile.rules second time for propagate custom rules 
#
include $(SRC_DIR)/Makefile

# Code-generator - related parameters
CODEGEN_INPUT_DIR	 = $(SRC_DIR)/codegen_templates
CODEGEN_OUTPUT_DIR	 = $(OUT_DIR)
CODEGEN_DIR			 = $(TOP_DIR)/src/datamodel/bin/codegen
CODEGEN_EXE          = $(CODEGEN_DIR)/Teknovus.MetaStructure.CodeGenerator.exe

OMCI_STACK_CODEGEN_INPUT_DIR = $(SRC_DIR)/me_codegen
OMCI_STACK_CODEGEN_EXE = $(OUT_DIR)/omci_me_codegen

BAL_MODEL_FILE		 = $(TOP_DIR)/src/datamodel/bal.objset
OMCI_MODEL_FILE		 = $(TOP_DIR)/src/datamodel/omci.objset
OMCI_STACK_MODEL_FILE = $(TOP_DIR)/src/datamodel/omci_me_datamodel.csv
MONO_VER            ?= 4.3.2.467
MONO_PATH           ?= /opt/mono-$(MONO_VER)/bin/mono

export SRC_DIR
export OUT_DIR_BASE
export OUT_DIR
export MODEL_OUT_DIR

ifeq ("$(wildcard $(MONO_PATH))", "")
    # If we can't find Mono installed in the correct path, default to the current PATH version.
    # In the future, we should always use Mono from a common tools directory.
    # TODO: change this once the compiler/toolchain paths are better defined.
    MONO_PATH        = mono
endif

# Treat "yes" and "y" the same
ifeq ("$(USE_CLANG)", "yes")
    USE_CLANG := y
endif
ifeq ("$(USE_CLANG)", "y")
    include $(MAKE_DIR)/clang.opts
endif

# Disable code generation in release build
ifeq ("$(RELEASE_BUILD)", "y")
    srcs := $(srcs) $(gen_bal_srcs) $(gen_omci_srcs)
    gen_bal_hdrs := 
    gen_bal_srcs := 
    gen_omci_hdrs := 
    gen_omci_srcs := 
    # Disable LINT and CLANG
    USE_LINT = n
    USE_CLANG = n
endif

SRCS = $(strip $(srcs:%=$(SRC_DIR)/%))

# In COMPILE_ALL_IN_ONE_GO mode all .c files of a module are compiled in 
# a single invocation of BLD_CC compiler. In result, objects files are created
# in OUT_DIR even if module's .c files are spread in sub-directories
ifeq ("$(COMPILE_ALL_IN_ONE_GO)", "y")
    srcs_no_dir = $(notdir $(srcs))  
    _OBJS = $(srcs_no_dir:%.c=$(OUT_DIR)/%.o)
else
    _OBJS = $(srcs:%.c=$(OUT_DIR)/%.o)
endif

as_SRCS = $(strip $(as_srcs:%=$(SRC_DIR)/%))
as_OBJS = $(as_srcs:%.s=$(OUT_DIR)/%.o)
_OBJS  += $(as_OBJS)

AS_SRCS = $(strip $(AS_srcs:%=$(SRC_DIR)/%))
AS_OBJS = $(AS_srcs:%.S=$(OUT_DIR)/%.o)
_OBJS  += $(AS_OBJS)

ifneq ("$(gen_bal_srcs)", "")
    GEN_BAL_SRCS = $(strip $(gen_bal_srcs:%=$(CODEGEN_OUTPUT_DIR)/%))
    _OBJS += $(GEN_BAL_SRCS:%.c=%.o)
endif
ifneq ("$(gen_bal_hdrs)", "")
    GEN_BAL_HDRS = $(strip $(gen_bal_hdrs:%=$(CODEGEN_OUTPUT_DIR)/%))
endif

ifneq ("$(gen_omci_srcs)", "")
    GEN_OMCI_SRCS = $(strip $(gen_omci_srcs:%=$(CODEGEN_OUTPUT_DIR)/%))
    _OBJS += $(GEN_OMCI_SRCS:%.c=%.o)
endif
ifneq ("$(gen_omci_hdrs)", "")
    GEN_OMCI_HDRS = $(strip $(gen_omci_hdrs:%=$(CODEGEN_OUTPUT_DIR)/%))
endif

ifneq ("$(gen_omci_stack_srcs)", "")
    GEN_OMCI_STACK_SRCS = $(strip $(gen_omci_stack_srcs:%=$(CODEGEN_OUTPUT_DIR)/%))
    _OBJS += $(GEN_OMCI_STACK_SRCS:%.c=%.o)
endif
ifneq ("$(gen_omci_stack_hdrs)", "")
    GEN_OMCI_STACK_HDRS = $(strip $(gen_omci_stack_hdrs:%=$(CODEGEN_OUTPUT_DIR)/%))
endif

OBJS = $(strip $(_OBJS))

GEN_SRCS = $(GEN_BAL_SRCS) $(GEN_OMCI_SRCS) $(GEN_OMCI_STACK_SRCS)
GEN_HDRS = $(GEN_BAL_HDRS) $(GEN_OMCI_HDRS) $(GEN_OMCI_STACK_HDRS)

# Add default dependency on OS abstraction
ifeq ("$(MOD_NAME)", "")
    ifneq (x"$(V)", x"0")
        $(info MOD_NAME is not set for $(SRC_DIR)/Makefile. Skipping..)
    endif
    MOD_TYPE = _skip_
endif

# Add default dependency on OS abstraction
ifneq ("$(MOD_SUPPRESS_OS_DEP), "y)
    ifeq ("$(MOD_TYPE)", "linux_module")
        _kernel = y
    endif
    ifeq ("$(MOD_TYPE)", "linux_lib")
        _kernel = y
    endif
    ifeq ("$(_kernel)", "y")
         MOD_DEPS := os_linux $(MOD_DEPS)
    else    
         MOD_DEPS := os $(MOD_DEPS)
    endif
endif

# Extra types filter
ifneq ("$(EXTRA_TYPES)", "")
    EXTRA_TYPES := $(shell echo -n $(EXTRA_TYPES) | sed -e 's/ /\\|/g')
    GEN_EXTRA_TYPES := -typeNameFilter=\^\($(EXTRA_TYPES)\)\$$ 
endif

OS_KERNEL ?= $(OS)
UC_PLATFORM = $(shell echo $(PLATFORM) | tr a-z A-Z)
UC_SUBSYSTEM = $(shell echo $(SUBSYSTEM) | tr a-z A-Z)
UC_OS = $(shell echo $(OS) | tr a-z A-Z)
UC_OS_KERNEL = $(shell echo $(OS_KERNEL) | tr a-z A-Z)

EXTRA_DEFINES   += -DBCM_SUBSYSTEM_$(UC_SUBSYSTEM) -DBCM_PLATFORM_$(UC_PLATFORM) -DBCM_OS_$(UC_OS)
EXTRA_DEFINES   += -DBCM_SUBSYSTEM_HOST
EXTRA_DEFINES   += -D$(UC_OS_KERNEL)_KERNEL_SPACE
ifeq ("$(ENABLE_EPON)", "y")
    EXTRA_DEFINES	+= -DBCM_EPON
endif
ifeq ("$(ENABLE_GPON)", "y")
    EXTRA_DEFINES	+= -DBCM_GPON
endif
ifeq ("$(ENABLE_XGPON)", "y")
    EXTRA_DEFINES	+= -DBCM_XGPON
endif

ifneq ("$(CONFIG_MAC_RPC)", "n")
EXTRA_DEFINES += -DCONFIG_MAC_RPC
endif

ifneq ("$(CONFIG_SWITCH_RPC)", "n")
EXTRA_DEFINES += -DCONFIG_SWITCH_RPC
endif

ifneq ("$(BOARD)", "")
EXTRA_DEFINES	+= -DBOARD=$(BOARD)
endif

ifeq ("$(BOARD)", "wrx")
EXTRA_DEFINES	+= -DWRX_BUILD
endif

ifeq ("$(BUILD_OF_AGENT)", "y")
EXTRA_DEFINES   += -DBUILD_OF_AGENT
endif

ifeq ("$(FORCE_PKTIN_SND)", "y")
EXTRA_DEFINES   += -DFORCE_PKTIN_SND
endif

# Build unitests for simulation and from Jenkins jobs
UNITEST ?= n

ifeq ("$(SIMULATION_BUILD)", "y")
	EXTRA_DEFINES += -DSIMULATION_BUILD
	UNITEST = y
endif

ifeq ("$(JENKINS_BUILD)", "y")
	UNITEST = y
endif

ifeq ("$(BAL_MONOLITHIC)", "y")
    EXTRA_DEFINES += -DBAL_MONOLITHIC
endif

EXTRA_INCLUDES  += -I$(SRC_DIR)
EXTRA_INCLUDES  += -I$(TOP_SRC_DIR)/common/include -I$(OUT_DIR_BASE)/src/common/include

OPT_DISABLE_$(UC_SUBSYSTEM) ?=n
OPT_DISABLE := $(OPT_DISABLE_$(UC_SUBSYSTEM))

ARCH_CFLAGS = $(ARCH_FLAGS)
ifeq ("$(OPT_DISABLE)", "y")
    ARCH_CFLAGS		+= $(DEBUG_O_CFLAGS)
	EXTRA_LFLAGS	+= $(DEBUG_O_LFLAGS)
    EXTRA_ASFLAGS   += $(DEBUG_O_ASFLAGS)
    EXTRA_asFLAGS   += $(DEBUG_O_asLAGS)
else
    ARCH_CFLAGS     += $(RELEASE_O_CFLAGS)
	EXTRA_LFLAGS	+= $(RELEASE_O_LFLAGS)
    EXTRA_ASFLAGS   += $(RELEASE_O_ASFLAGS)
    EXTRA_asFLAGS   += $(RELEASE_O_asFLAGS)
endif

# 3rd party packages install location
INSTALL_DIR ?= $(OUT_DIR_BASE)
export INSTALL_DIR
EXTRA_INCLUDES += -I$(INSTALL_DIR)/include

PATH := $(INSTALL_DIR)/bin:$(PATH)
export PATH

# Shared library location
SHARED_LIB_DIR ?= $(INSTALL_DIR)/lib
export SHARED_LIB_DIR

# Treat lib as shared lib if BUILD_SHARED_LIBS is y
ifeq  ("$(BUILD_SHARED_LIBS)", "y")
   export BUILD_SHARED_LIBS
   ifeq  ("$(MOD_TYPE)", "lib")
      MOD_TYPE = shared_lib
   endif
   EXTRA_LIBS_PATH += -L$(TOP_DIR)/$(LOCAL_MAPLE_SDK_DIR)/build/shared_libs
endif
EXTRA_LIBS_PATH += -L$(SHARED_LIB_DIR)

# Calculate MOD_TARGET based on MOD_TYPE
ifeq  ("$(MOD_TYPE)", "lib")
	ifneq ("$(OBJS)", "")
		TARGET_LIB ?= $(MOD_NAME)
		TARGET_LIB_FNAME ?= $(OUT_DIR)/lib$(TARGET_LIB).a
	endif
	MOD_TARGET ?= $(TARGET_LIB_FNAME)
else ifeq  ("$(MOD_TYPE)", "shared_lib")
	ifneq ("$(OBJS)", "")
		TARGET_LIB ?= $(MOD_NAME)
		TARGET_LIB_FNAME ?= $(OUT_DIR)/lib$(TARGET_LIB).so
	endif
	MOD_TARGET ?= $(TARGET_LIB_FNAME)
else ifeq  ("$(MOD_TYPE)", "app")
	MOD_TARGET ?= $(OUT_DIR)/$(MOD_NAME)
else ifeq  ("$(MOD_TYPE)", "linux_module")
    ifeq ("$(KERNELDIR)", "")
        $(error KERNELDIR must be set in board profile)
    endif
    ifeq ("$(KERNEL_ARCH)", "")
        $(error KERNEL_ARCH must be set in board profile)
    endif
    ifeq ("$(KERNEL_OUTDIR)", "")
        KERNEL_OUTDIR := $(KERNELDIR)
    endif
	MOD_TARGET ?= $(SRC_DIR)/$(MOD_NAME).ko
else ifeq ("$(MOD_TYPE)", "linux_lib") 
    MOD_TARGET ?= $(OUT_DIR_BASE)/$(MOD_NAME).linuxlib
else ifeq ("$(MOD_TYPE)", "_skip_")
    MOD_TARGET = .dummy
else        	
    $(error MOD_TYPE $(MOD_TYPE) is incorrect for module $(MOD_NAME). Must be lib or app)
endif

ifeq ("$(MOD_TARGET)", "")
   MOD_TARGET = $(MOD_NAME)
endif

ifeq ("$(OS)", "posix")
	EXTRA_DEFINES += -D_XOPEN_SOURCE=600
    LIBS   = -lrt -lpthread -lm
endif

# Make sure that paths in EXTRA_INCLUDES are absolute
ifneq ("$(EXTRA_INCLUDES)", "")
    # Make sure that each directory is an absolute path
    EXTRA_INCS = $(addprefix -I, $(abspath $(subst -I,,$(subst $(TOP_DIR)/,,$(EXTRA_INCLUDES)))))
endif
ifneq ("$(EXTRA_ASINCLUDES)", "")
    # Make sure that each directory is an absolute path
    EXTRA_ASINCS = $(addprefix -I, $(abspath $(subst -I,,$(subst $(TOP_DIR)/,,$(EXTRA_ASINCLUDES)))))
endif
ifneq ("$(EXTRA_asINCLUDES)", "")
    # Make sure that each directory is an absolute path
    EXTRA_asINCS = $(addprefix -I, $(abspath $(subst -I,,$(subst $(TOP_DIR)/,,$(EXTRA_asINCLUDES)))))
endif
ifeq ("$(USE_LINT)", "y")
    USE_LINT := yes
endif    
ifeq ("$(USE_LINT)", "yes")
    EXTRA_DEFINES += -DUSE_LINT
endif

EXTRA_DEFINES += $(USER_EXTRA_DEFINES) $(USER_EXTRA_$(UC_SUBSYSTEM)_DEFINES)
EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS) $(USER_EXTRA_$(UC_SUBSYSTEM)_CFLAGS)
CFLAGS  += $(ARCH_CFLAGS) $(EXTRA_CFLAGS)  $(EXTRA_INCS) $(EXTRA_DEFINES)
ASFLAGS += $(ARCH_FLAGS) $(EXTRA_ASFLAGS) $(EXTRA_ASINCS) $(EXTRA_ASDEFINES)
asFLAGS += $(ARCH_FLAGS) $(EXTRA_asFLAGS) $(EXTRA_asINCS) $(EXTRA_asDEFINES)
LFLAGS  += $(ARCH_FLAGS) $(EXTRA_LFLAGS)
DEP_FLAGS += $(EXTRA_CFLAGS) $(EXTRA_INCS) $(EXTRA_DEFINES)
CLANG_FLAGS += $(EXTRA_CFLAGS) $(EXTRA_INCS) $(EXTRA_DEFINES) $(CLANG_OPTS)
