blob: 169a6492e1155edda32779aad288dbf13eb48d1f [file] [log] [blame]
# 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)