# This file gathers compilation directive shared between lte-softmodem and oaisim
COMMON_UTILS_DIR    = $(OPENAIR_HOME)/common/utils
UE_NAS_DIR          = $(OPENAIR_HOME)/openair-cn/NAS
S1AP_DIR            = $(OPENAIR_HOME)/openair-cn/S1AP
X2AP_DIR            = $(OPENAIR_HOME)/openair2/X2AP
SCTP_DIR            = $(OPENAIR_HOME)/openair-cn/SCTP
UDP_DIR             = $(OPENAIR_HOME)/openair-cn/UDP
GTPV1U_DIR          = $(OPENAIR_HOME)/openair-cn/GTPV1-U
SECU_DIR            = $(OPENAIR_HOME)/openair-cn/SECU

UE_NAS_OBJ_DIR      = $(subst $(OPENAIR_HOME),$(OBJS_DIR),$(UE_NAS_DIR))
SECU_OBJ_DIR        = $(subst $(OPENAIR_HOME),$(OBJS_DIR),$(SECU_DIR))
S1AP_OBJ_DIR        = $(subst $(OPENAIR_HOME),$(OBJS_DIR),$(S1AP_DIR))
X2AP_OBJ_DIR        = $(subst $(OPENAIR_HOME),$(OBJS_DIR),$(X2AP_DIR))
SCTP_OBJ_DIR        = $(subst $(OPENAIR_HOME),$(OBJS_DIR),$(SCTP_DIR))
UDP_OBJ_DIR         = $(subst $(OPENAIR_HOME),$(OBJS_DIR),$(UDP_DIR))
GTPV1U_OBJ_DIR      = $(subst $(OPENAIR_HOME),$(OBJS_DIR),$(GTPV1U_DIR))

export COMMON_UTILS_DIR
export UE_NAS_DIR
export S1AP_DIR
export X2AP_DIR
export SCTP_DIR
export UDP_DIR
export GTPV1U_DIR
export SECU_DIR

#Export common cflags (between softmodem and oaisim)
COMMON_CFLAGS		= \
	-D'FIRMWARE_VERSION="$(SVN_REV) - $(DATE_REV)"' \
	-Wall                       \
	-fno-strict-aliasing        \
	-O2                         \
	-Werror=implicit-function-declaration

ITTI_MESSAGES_H		= messages_xml.h
ITTI_MESSAGES_XML	= messages.xml
ITTI_MESSAGES_FILE	= $(ITTI_DIR)/intertask_interface_types.h

include $(COMMON_UTILS_DIR)/Makefile.inc
include $(OPENAIR_TARGETS)/COMMON/Makefile.inc
include $(OPENAIR2_DIR)/NAS/Makefile.inc

COMMON_CFLAGS           += -DMAX_NUM_CCs=1
ifdef USE_MME
COMMON_CFLAGS		+= -DENABLE_USE_MME
ENABLE_ITTI = 1
ifdef LINK_PDCP_TO_GTPV1U
    COMMON_CFLAGS       += -DLINK_PDCP_TO_GTPV1U
# COMMON_CFLAGS       += -I$(UDP_DIR)
# COMMON_CFLAGS       += -I$(GTPV1U_DIR)
# COMMON_CFLAGS       += -I$(GTPV1U_DIR)/nw-gtpv1u/shared
endif
endif

ifdef ENABLE_ITTI
COMMON_CFLAGS		+= -DENABLE_ITTI
COMMON_CFLAGS		+= -DUSER_MODE
COMMON_CFLAGS		+= -I$(OPENAIR1_DIR)
COMMON_CFLAGS		+= -I$(OPENAIR2_DIR)/NAS
COMMON_CFLAGS 	 	+= $(L2_incl)
COMMON_CFLAGS		+= $(UTILS_incl)
SHARED_DEPENDENCIES += $(ITTI_MESSAGES_H)
endif

ifdef USE_MME
#LIBS				+= $(X2AP_OBJ_DIR)/libx2ap.a
LIBS				+= $(UE_NAS_OBJ_DIR)/libuenas.a $(SECU_OBJ_DIR)/libsecu.a 
LIBS				+= $(S1AP_OBJ_DIR)/libs1ap.a $(SCTP_OBJ_DIR)/libsctp.a -lsctp -lcrypt
LIBS				+= $(UDP_OBJ_DIR)/libudp.a $(GTPV1U_OBJ_DIR)/libgtpv1u.a 
#SHARED_DEPENDENCIES	+= $(UE_NAS_OBJ_DIR)/libuenas.a $(SECU_OBJ_DIR)/libsecu.a $(X2AP_OBJ_DIR)/libx2ap.a $(S1AP_OBJ_DIR)/libs1ap.a $(SCTP_OBJ_DIR)/libsctp.a  $(UDP_OBJ_DIR)/libudp.a $(GTPV1U_OBJ_DIR)/libgtpv1u.a
SHARED_DEPENDENCIES	+= $(UE_NAS_OBJ_DIR)/libuenas.a $(SECU_OBJ_DIR)/libsecu.a $(S1AP_OBJ_DIR)/libs1ap.a $(SCTP_OBJ_DIR)/libsctp.a  $(UDP_OBJ_DIR)/libudp.a $(GTPV1U_OBJ_DIR)/libgtpv1u.a

COMMON_CFLAGS		+= -DLOG_NO_THREAD 
#-DEMIT_ASN_DEBUG

openair_cn_available = $(shell if [ -d "$(UE_NAS_DIR)" ]; then echo "0" ; else  echo "1" ; fi )
ifeq 	($(openair_cn_available), 0)
COMMON_CFLAGS		+= -DENABLE_NAS_UE_LOGGING
COMMON_CFLAGS		+= -I$(OPENAIR_HOME)/openair-cn/NAS/EURECOM-NAS/src/api/network
COMMON_CFLAGS		+= -I$(OPENAIR_HOME)/openair-cn/NAS/EURECOM-NAS/src/include
COMMON_CFLAGS		+= -I$(OPENAIR_HOME)/openair-cn/NAS/EURECOM-NAS/src/ies
COMMON_CFLAGS		+= -I$(OPENAIR_HOME)/openair-cn/NAS/EURECOM-NAS/src/emm/msg
COMMON_CFLAGS		+= -I$(OPENAIR_HOME)/openair-cn/NAS/EURECOM-NAS/src/esm/msg
COMMON_CFLAGS		+= -I$(OPENAIR_HOME)/openair-cn/NAS/EURECOM-NAS/src/util
endif

UENAS_CFLAGS		= $(COMMON_CFLAGS)
UENAS_CFLAGS		+= -I$(SECU_DIR)
export UENAS_CFLAGS

SECU_CFLAGS			= $(COMMON_CFLAGS)
SECU_CFLAGS			+= -I$(OPENAIR_HOME)/openair-cn/COMMON
SECU_CFLAGS			+= -I$(OPENAIR_HOME)/openair-cn/UTILS
SECU_CFLAGS			+= -I$(SECU_DIR)
export SECU_CFLAGS

COMMON_MME_CFLAGS	 = -I$(SECU_DIR)
COMMON_MME_CFLAGS       += -I$(SCTP_DIR)
COMMON_MME_CFLAGS	+= -I$(X2AP_DIR)
COMMON_MME_CFLAGS	+= -I$(S1AP_DIR)
COMMON_MME_CFLAGS	+= -I$(UDP_DIR)
COMMON_MME_CFLAGS	+= -I$(GTPV1U_DIR)

S1AP_CFLAGS          = $(COMMON_CFLAGS) $(COMMON_MME_CFLAGS)
S1AP_CFLAGS         += -DENB_MODE
S1AP_CFLAGS         += -I$(TOP_DIR)
S1AP_CFLAGS         += $(UTIL_incl)
export S1AP_CFLAGS

X2AP_CFLAGS          = $(COMMON_CFLAGS)
X2AP_CFLAGS         += -DENB_MODE
X2AP_CFLAGS         += -I$(TOP_DIR)
X2AP_CFLAGS         += $(UTIL_incl)
export X2AP_CFLAGS

UDP_CFLAGS	 		 = $(COMMON_CFLAGS) $(COMMON_MME_CFLAGS)
UDP_CFLAGS	 		+= -DENB_MODE
UDP_CFLAGS	 		+= -I$(TOP_DIR)
UDP_CFLAGS	 		+= $(UTIL_incl)
UDP_CFLAGS	 		+= -I$(OPENAIR_HOME)/openair2/ENB_APP
export UDP_CFLAGS

GTPV1U_CFLAGS            = $(COMMON_CFLAGS) $(COMMON_MME_CFLAGS)
GTPV1U_CFLAGS           += -DENB_MODE
GTPV1U_CFLAGS           += -I$(TOP_DIR)
GTPV1U_CFLAGS           += -I$(GTPV1U_DIR)/nw-gtpv1u/include
GTPV1U_CFLAGS           += -I$(GTPV1U_DIR)/nw-gtpv1u/shared
GTPV1U_CFLAGS           += -I$(OPENAIR_HOME)/openair2/ENB_APP
GTPV1U_CFLAGS           += $(UTIL_incl) -I$(OPENAIRCN_DIR)/UTILS
export GTPV1U_CFLAGS

GTPV1U_ENB_CFLAGS            = $(COMMON_CFLAGS)
GTPV1U_ENB_CFLAGS           +=  $(OPENAIR_HOME)/openair2/COMMON
GTPV1U_ENB_CFLAGS           += -I$(X2AP_DIR)
GTPV1U_ENB_CFLAGS           += -I$(S1AP_DIR)
GTPV1U_ENB_CFLAGS           += -I$(UDP_DIR)
GTPV1U_ENB_CFLAGS           += -I$(GTPV1U_DIR)
GTPV1U_ENB_CFLAGS           += -DENB_MODE
GTPV1U_ENB_CFLAGS           += -I$(TOP_DIR)
GTPV1U_ENB_CFLAGS           += -I$(GTPV1U_DIR)/nw-gtpv1u/include
GTPV1U_ENB_CFLAGS           += -I$(GTPV1U_DIR)/nw-gtpv1u/shared
GTPV1U_ENB_CFLAGS           += -I$(OPENAIR_HOME)/openair2/ENB_APP
GTPV1U_ENB_CFLAGS           += $(UTIL_incl) -I$(OPENAIRCN_DIR)/UTILS
export GTPV1U_ENB_CFLAGS


$(UE_NAS_OBJ_DIR)/libuenas.a: force_look
	@$(MAKE) -C $(UE_NAS_DIR) -f Makefile.UE $(UE_NAS_OBJ_DIR)/libuenas.a OUTDIR=$(UE_NAS_OBJ_DIR)
$(SECU_OBJ_DIR)/libsecu.a: force_look
	@$(MAKE) -C $(SECU_DIR) -f Makefile.eNB $(SECU_OBJ_DIR)/libsecu.a OUTDIR=$(SECU_OBJ_DIR)
$(X2AP_OBJ_DIR)/libx2ap.a: force_look
	@$(MAKE) -C $(X2AP_DIR) -f Makefile.inc $(X2AP_OBJ_DIR)/libx2ap.a OUTDIR=$(X2AP_OBJ_DIR)
$(S1AP_OBJ_DIR)/libs1ap.a: force_look
	@$(MAKE) -C $(S1AP_DIR) -f Makefile.eNB $(S1AP_OBJ_DIR)/libs1ap.a OUTDIR=$(S1AP_OBJ_DIR)
$(SCTP_OBJ_DIR)/libsctp.a: force_look
	@$(MAKE) -C $(SCTP_DIR) -f Makefile.eNB $(SCTP_OBJ_DIR)/libsctp.a OUTDIR=$(SCTP_OBJ_DIR)
$(UDP_OBJ_DIR)/libudp.a: force_look
	@$(MAKE) -C $(UDP_DIR) -f Makefile.eNB $(UDP_OBJ_DIR)/libudp.a OUTDIR=$(UDP_OBJ_DIR)
$(GTPV1U_OBJ_DIR)/libgtpv1u.a: force_look
	@$(MAKE) -C $(GTPV1U_DIR) -f Makefile.eNB $(GTPV1U_OBJ_DIR)/libgtpv1u.a OUTDIR=$(GTPV1U_OBJ_DIR)

OBJ = $(NAS_UE_OBJS) $(SECU_OBJS)
endif

export COMMON_CFLAGS

ifdef ENABLE_ITTI
CFLAGS += $(COMMON_CFLAGS) $(COMMON_MME_CFLAGS) $(TARGETS_COMMON_incl)

OBJ += $(TARGETS_COMMON_OBJS)
endif

ifdef ENABLE_ITTI
gccxml_available = $(shell if [ `gccxml --version | grep GCC-XML -c` = "0" ]; then  echo "0" ; else  echo "1" ; fi )
ifeq 	($(gccxml_available), 0)
$(error gccxml is missing, please install)
endif
CFLAGS += -I$(OPENAIR2_DIR)/COMMON -DENABLE_ITTI $(UTILS_incl)
endif

$(ITTI_MESSAGES_XML): $(ITTI_MESSAGES_FILE)
	@echo "Generating messages.xml ..."
	@gccxml $(COMMON_CFLAGS) $< -fxml=$@
	@$(CC) -MM $(COMMON_CFLAGS) $< > $(basename $@).d
	@mv -f $(basename $@).d $(basename $@).d.tmp
	@sed -e 's|.*:|$@:|' < $(basename $@).d.tmp > $(basename $@).d
	@sed -e 's/.*://' -e 's/\\$$//' < $(basename $@).d.tmp | fmt -1 | \
	sed -e 's/^ *//' -e 's/$$/:/' >> $(basename $@).d
	@rm -f $(basename $@).d.tmp

$(ITTI_MESSAGES_H): $(ITTI_MESSAGES_XML)
	@echo "Generating messages_xml.h ..."
	@sed -e 's/[ ]*//' -e 's/"/\\"/g' -e 's/^/"/' -e 's/$$/\\n"/' $< > $@

force_look:
	@true

common-clean:
	@$(RM_F_V) $(ITTI_MESSAGES_H) $(ITTI_MESSAGES_XML) $(ITTI_MESSAGES_XML:.xml=.d)
	@$(MAKE) -C $(LFDS_DIR) -f makefile.linux clean OUTDIR=$(LFDS_OBJ_DIR)
	@if [ -d $(UE_NAS_OBJ_DIR) ]; then $(MAKE) -C $(UE_NAS_DIR) -f Makefile.UE clean OUTDIR=$(UE_NAS_OBJ_DIR); fi
	@if [ -d $(SECU_OBJ_DIR) ]; then $(MAKE) -C $(SECU_DIR) -f Makefile.eNB clean OUTDIR=$(SECU_OBJ_DIR); fi
	@if [ -d $(X2AP_OBJ_DIR) ]; then $(MAKE) -C $(X2AP_DIR) -f Makefile.inc clean OUTDIR=$(X2AP_OBJ_DIR); fi
	@if [ -d $(S1AP_OBJ_DIR) ]; then $(MAKE) -C $(S1AP_DIR) -f Makefile.eNB clean OUTDIR=$(S1AP_OBJ_DIR); fi
	@if [ -d $(SCTP_OBJ_DIR) ]; then $(MAKE) -C $(SCTP_DIR) -f Makefile.eNB clean OUTDIR=$(SCTP_OBJ_DIR); fi
	@if [ -d $(UDP_OBJ_DIR) ]; then $(MAKE) -C $(UDP_DIR) -f Makefile.eNB clean OUTDIR=$(UDP_OBJ_DIR); fi
	@if [ -d $(GTPV1U_OBJ_DIR) ]; then $(MAKE) -C $(GTPV1U_DIR) -f Makefile.eNB clean OUTDIR=$(GTPV1U_OBJ_DIR); fi

common-cleanall:
	@if [ -d $(UE_NAS_OBJ_DIR) ]; then $(MAKE) -C $(UE_NAS_DIR) -f Makefile.UE cleanall OUTDIR=$(UE_NAS_OBJ_DIR); fi
	@if [ -d $(SECU_OBJ_DIR) ]; then $(MAKE) -C $(SECU_DIR) -f Makefile.eNB cleanall OUTDIR=$(SECU_OBJ_DIR); fi
	@if [ -d $(X2AP_OBJ_DIR) ]; then $(MAKE) -C $(X2AP_DIR) -f Makefile.inc cleanall OUTDIR=$(X2AP_OBJ_DIR); fi
	@if [ -d $(S1AP_OBJ_DIR) ]; then $(MAKE) -C $(S1AP_DIR) -f Makefile.eNB cleanall OUTDIR=$(S1AP_OBJ_DIR); fi
	@if [ -d $(SCTP_OBJ_DIR) ]; then $(MAKE) -C $(SCTP_DIR) -f Makefile.eNB cleanall OUTDIR=$(SCTP_OBJ_DIR); fi
	@if [ -d $(UDP_OBJ_DIR) ]; then $(MAKE) -C $(UDP_DIR) -f Makefile.eNB cleanall OUTDIR=$(UDP_OBJ_DIR); fi
	@if [ -d $(GTPV1U_OBJ_DIR) ]; then $(MAKE) -C $(GTPV1U_DIR) -f Makefile.eNB cleanall OUTDIR=$(GTPV1U_OBJ_DIR); fi