################################################################################
#   OpenAirInterface
#   Copyright(c) 1999 - 2014 Eurecom
#
#    OpenAirInterface is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#
#    OpenAirInterface is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with OpenAirInterface.The full GNU General Public License is
#    included in this distribution in the file called "COPYING". If not,
#    see <http://www.gnu.org/licenses/>.
#
#  Contact Information
#  OpenAirInterface Admin: openair_admin@eurecom.fr
#  OpenAirInterface Tech : openair_tech@eurecom.fr
#  OpenAirInterface Dev  : openair4g-devel@eurecom.fr
#
#  Address      : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France.
#
################################################################################
PROJDIR = $(UE_NAS_DIR)/EURECOM-NAS

include $(UE_NAS_DIR)/EURECOM-NAS/Makefile.inc

libnas_INCLUDES =								\
	-I$(OPENAIR2_DIR)							\
	-I$(UE_NAS_DIR)								\
	-I$(SRCDIR)									\
	-I$(INCDIR)									\
	-I$(UTILDIR)								\
	-I$(USERAPIDIR)								\
	-I$(NETAPIDIR)								\
	-I$(EMMDIR)									\
	-I$(EMMMSGDIR)								\
	-I$(EMMSAPDIR)								\
	-I$(ESMDIR)									\
	-I$(ESMMSGDIR)								\
	-I$(ESMSAPDIR)								\
	-I$(MMEAPIDIR)								\
	-I$(USIMAPIDIR)								\
	-I$(IESDIR)                                 \
    -I$(SECU_DIR)                               \
    -I$(OPENAIRCN_DIR)/COMMON                   \
    -I$(OPENAIRCN_DIR)/UTILS

OUTDIR = $(UE_NAS_DIR)/ue_objs

libnas_api_OBJS = 								\
    EURECOM-NAS/src/api/mme/mme_api.o   		\
	EURECOM-NAS/src/api/network/nas_message.o   

libnas_emm_OBJS = 								\
    EURECOM-NAS/src/emm/Attach.o        		\
    EURECOM-NAS/src/emm/Authentication.o        \
    EURECOM-NAS/src/emm/Detach.o        		\
    EURECOM-NAS/src/emm/EmmCommon.o     		\
    EURECOM-NAS/src/emm/emm_data_ctx.o  		\
    EURECOM-NAS/src/emm/emm_main.o      		\
    EURECOM-NAS/src/emm/EmmStatusHdl.o     		\
    EURECOM-NAS/src/emm/Identification.o        \
    EURECOM-NAS/src/emm/IdleMode.o      		\
    EURECOM-NAS/src/emm/LowerLayer.o    		\
    EURECOM-NAS/src/emm/SecurityModeControl.o   \
    EURECOM-NAS/src/emm/ServiceRequestHdl.o     \
    EURECOM-NAS/src/emm/TrackingAreaUpdate.o

libnas_emm_msg_OBJS =										\
    EURECOM-NAS/src/emm/msg/AttachAccept.o					\
    EURECOM-NAS/src/emm/msg/AuthenticationFailure.o			\
    EURECOM-NAS/src/emm/msg/CsServiceNotification.o			\
    EURECOM-NAS/src/emm/msg/ExtendedServiceRequest.o		\
    EURECOM-NAS/src/emm/msg/IdentityResponse.o				\
    EURECOM-NAS/src/emm/msg/EmmInformation.o				\
    EURECOM-NAS/src/emm/msg/ServiceReject.o					\
    EURECOM-NAS/src/emm/msg/TrackingAreaUpdateReject.o		\
    EURECOM-NAS/src/emm/msg/AttachComplete.o				\
    EURECOM-NAS/src/emm/msg/AuthenticationReject.o			\
    EURECOM-NAS/src/emm/msg/DetachAccept.o					\
    EURECOM-NAS/src/emm/msg/GutiReallocationCommand.o		\
    EURECOM-NAS/src/emm/msg/emm_msg.o						\
    EURECOM-NAS/src/emm/msg/SecurityModeCommand.o			\
    EURECOM-NAS/src/emm/msg/ServiceRequest.o				\
    EURECOM-NAS/src/emm/msg/TrackingAreaUpdateRequest.o		\
    EURECOM-NAS/src/emm/msg/AttachReject.o					\
    EURECOM-NAS/src/emm/msg/AuthenticationRequest.o			\
    EURECOM-NAS/src/emm/msg/DetachRequest.o					\
    EURECOM-NAS/src/emm/msg/GutiReallocationComplete.o		\
    EURECOM-NAS/src/emm/msg/SecurityModeComplete.o			\
    EURECOM-NAS/src/emm/msg/TrackingAreaUpdateAccept.o		\
    EURECOM-NAS/src/emm/msg/UplinkNasTransport.o			\
    EURECOM-NAS/src/emm/msg/AttachRequest.o					\
    EURECOM-NAS/src/emm/msg/AuthenticationResponse.o		\
    EURECOM-NAS/src/emm/msg/DownlinkNasTransport.o			\
    EURECOM-NAS/src/emm/msg/EmmStatus.o						\
    EURECOM-NAS/src/emm/msg/IdentityRequest.o				\
    EURECOM-NAS/src/emm/msg/SecurityModeReject.o			\
    EURECOM-NAS/src/emm/msg/TrackingAreaUpdateComplete.o

libnas_emm_sap_OBJS =											\
    EURECOM-NAS/src/emm/sap/emm_as.o							\
    EURECOM-NAS/src/emm/sap/emm_cn.o							\
    EURECOM-NAS/src/emm/sap/EmmDeregisteredNoImsi.o				\
    EURECOM-NAS/src/emm/sap/emm_reg.o							\
    EURECOM-NAS/src/emm/sap/EmmRegisteredUpdateNeeded.o			\
    EURECOM-NAS/src/emm/sap/EmmDeregisteredNormalService.o		\
    EURECOM-NAS/src/emm/sap/emm_sap.o							\
    EURECOM-NAS/src/emm/sap/EmmDeregisteredPlmnSearch.o			\
    EURECOM-NAS/src/emm/sap/emm_esm.o							\
    EURECOM-NAS/src/emm/sap/EmmRegisteredAttemptingToUpdate.o	\
    EURECOM-NAS/src/emm/sap/emm_send.o							\
    EURECOM-NAS/src/emm/sap/EmmCommonProcedureInitiated.o		\
    EURECOM-NAS/src/emm/sap/EmmRegistered.o						\
    EURECOM-NAS/src/emm/sap/EmmDeregisteredAttachNeeded.o		\
    EURECOM-NAS/src/emm/sap/EmmRegisteredImsiDetachInitiated.o	\
    EURECOM-NAS/src/emm/sap/EmmServiceRequestInitiated.o		\
    EURECOM-NAS/src/emm/sap/EmmDeregisteredAttemptingToAttach.o	\
    EURECOM-NAS/src/emm/sap/emm_fsm.o							\
    EURECOM-NAS/src/emm/sap/EmmRegisteredInitiated.o			\
    EURECOM-NAS/src/emm/sap/EmmTrackingAreaUpdatingInitiated.o	\
    EURECOM-NAS/src/emm/sap/EmmDeregistered.o					\
    EURECOM-NAS/src/emm/sap/EmmRegisteredLimitedService.o		\
    EURECOM-NAS/src/emm/sap/EmmDeregisteredInitiated.o			\
    EURECOM-NAS/src/emm/sap/EmmNull.o							\
    EURECOM-NAS/src/emm/sap/EmmRegisteredNoCellAvailable.o		\
    EURECOM-NAS/src/emm/sap/EmmDeregisteredLimitedService.o		\
    EURECOM-NAS/src/emm/sap/emm_recv.o							\
    EURECOM-NAS/src/emm/sap/EmmRegisteredNormalService.o		\
    EURECOM-NAS/src/emm/sap/EmmDeregisteredNoCellAvailable.o 	\
    EURECOM-NAS/src/emm/sap/EmmRegisteredPlmnSearch.o

libnas_esm_OBJS =												\
    EURECOM-NAS/src/esm/esm_ebr_context.o						\
    EURECOM-NAS/src/esm/PdnConnectivity.o						\
    EURECOM-NAS/src/esm/esm_ebr.o								\
    EURECOM-NAS/src/esm/EpsBearerContextDeactivation.o			\
    EURECOM-NAS/src/esm/DefaultEpsBearerContextActivation.o		\
    EURECOM-NAS/src/esm/DedicatedEpsBearerContextActivation.o	\
    EURECOM-NAS/src/esm/PdnDisconnect.o							\
    EURECOM-NAS/src/esm/EsmStatusHdl.o							\
    EURECOM-NAS/src/esm/esm_main.o								\
    EURECOM-NAS/src/esm/esm_pt.o								\
    EURECOM-NAS/src/esm/esm_ip.o

libnas_esm_msg_OBJS =													\
    EURECOM-NAS/src/esm/msg/ModifyEpsBearerContextRequest.o				\
    EURECOM-NAS/src/esm/msg/DeactivateEpsBearerContextRequest.o			\
    EURECOM-NAS/src/esm/msg/BearerResourceAllocationReject.o			\
    EURECOM-NAS/src/esm/msg/BearerResourceModificationRequest.o			\
    EURECOM-NAS/src/esm/msg/ActivateDedicatedEpsBearerContextRequest.o	\
    EURECOM-NAS/src/esm/msg/EsmInformationResponse.o					\
    EURECOM-NAS/src/esm/msg/PdnDisconnectReject.o						\
    EURECOM-NAS/src/esm/msg/ActivateDedicatedEpsBearerContextAccept.o	\
    EURECOM-NAS/src/esm/msg/PdnDisconnectRequest.o						\
    EURECOM-NAS/src/esm/msg/BearerResourceModificationReject.o			\
    EURECOM-NAS/src/esm/msg/ActivateDefaultEpsBearerContextAccept.o		\
    EURECOM-NAS/src/esm/msg/ActivateDedicatedEpsBearerContextReject.o	\
    EURECOM-NAS/src/esm/msg/ModifyEpsBearerContextAccept.o				\
    EURECOM-NAS/src/esm/msg/DeactivateEpsBearerContextAccept.o			\
    EURECOM-NAS/src/esm/msg/esm_msg.o									\
    EURECOM-NAS/src/esm/msg/EsmInformationRequest.o						\
    EURECOM-NAS/src/esm/msg/ActivateDefaultEpsBearerContextRequest.o	\
    EURECOM-NAS/src/esm/msg/ModifyEpsBearerContextReject.o				\
    EURECOM-NAS/src/esm/msg/EsmStatus.o									\
    EURECOM-NAS/src/esm/msg/PdnConnectivityReject.o						\
    EURECOM-NAS/src/esm/msg/ActivateDefaultEpsBearerContextReject.o		\
    EURECOM-NAS/src/esm/msg/PdnConnectivityRequest.o					\
    EURECOM-NAS/src/esm/msg/BearerResourceAllocationRequest.o

libnas_esm_sap_OBJS =							\
    EURECOM-NAS/src/esm/sap/esm_recv.o			\
    EURECOM-NAS/src/esm/sap/esm_send.o			\
    EURECOM-NAS/src/esm/sap/esm_sap.o

libnas_ies_OBJS =													\
    EURECOM-NAS/src/ies/UeSecurityCapability.o						\
    EURECOM-NAS/src/ies/SecurityHeaderType.o						\
    EURECOM-NAS/src/ies/RadioPriority.o								\
    EURECOM-NAS/src/ies/EpsAttachResult.o							\
    EURECOM-NAS/src/ies/ImeisvRequest.o								\
    EURECOM-NAS/src/ies/EmergencyNumberList.o						\
    EURECOM-NAS/src/ies/SupportedCodecList.o						\
    EURECOM-NAS/src/ies/EsmCause.o									\
    EURECOM-NAS/src/ies/NetworkName.o								\
    EURECOM-NAS/src/ies/AuthenticationResponseParameter.o			\
    EURECOM-NAS/src/ies/Cli.o										\
    EURECOM-NAS/src/ies/AccessPointName.o							\
    EURECOM-NAS/src/ies/DaylightSavingTime.o						\
    EURECOM-NAS/src/ies/LcsIndicator.o								\
    EURECOM-NAS/src/ies/PagingIdentity.o							\
    EURECOM-NAS/src/ies/EpsMobileIdentity.o							\
    EURECOM-NAS/src/ies/GutiType.o									\
    EURECOM-NAS/src/ies/NasKeySetIdentifier.o						\
    EURECOM-NAS/src/ies/CsfbResponse.o								\
    EURECOM-NAS/src/ies/PacketFlowIdentifier.o						\
    EURECOM-NAS/src/ies/ApnAggregateMaximumBitRate.o				\
    EURECOM-NAS/src/ies/EpsBearerContextStatus.o					\
    EURECOM-NAS/src/ies/MobileIdentity.o							\
    EURECOM-NAS/src/ies/AuthenticationFailureParameter.o			\
    EURECOM-NAS/src/ies/EpsUpdateResult.o							\
    EURECOM-NAS/src/ies/TimeZone.o									\
    EURECOM-NAS/src/ies/MessageType.o								\
    EURECOM-NAS/src/ies/EmmCause.o									\
    EURECOM-NAS/src/ies/MobileStationClassmark2.o					\
    EURECOM-NAS/src/ies/AuthenticationParameterRand.o				\
    EURECOM-NAS/src/ies/PdnAddress.o								\
    EURECOM-NAS/src/ies/MobileStationClassmark3.o					\
    EURECOM-NAS/src/ies/ServiceType.o								\
    EURECOM-NAS/src/ies/NasRequestType.o							\
    EURECOM-NAS/src/ies/PlmnList.o									\
    EURECOM-NAS/src/ies/EpsQualityOfService.o						\
    EURECOM-NAS/src/ies/NasMessageContainer.o						\
    EURECOM-NAS/src/ies/EsmInformationTransferFlag.o				\
    EURECOM-NAS/src/ies/TrafficFlowTemplate.o						\
    EURECOM-NAS/src/ies/LinkedEpsBearerIdentity.o					\
    EURECOM-NAS/src/ies/NasSecurityAlgorithms.o						\
    EURECOM-NAS/src/ies/LlcServiceAccessPointIdentifier.o			\
    EURECOM-NAS/src/ies/ShortMac.o									\
    EURECOM-NAS/src/ies/TrafficFlowAggregateDescription.o			\
    EURECOM-NAS/src/ies/PTmsiSignature.o							\
    EURECOM-NAS/src/ies/ProtocolDiscriminator.o						\
    EURECOM-NAS/src/ies/EpsBearerIdentity.o							\
    EURECOM-NAS/src/ies/TimeZoneAndTime.o							\
    EURECOM-NAS/src/ies/TrackingAreaIdentityList.o					\
    EURECOM-NAS/src/ies/QualityOfService.o							\
    EURECOM-NAS/src/ies/EpsUpdateType.o								\
    EURECOM-NAS/src/ies/PdnType.o									\
    EURECOM-NAS/src/ies/UeRadioCapabilityInformationUpdateNeeded.o	\
    EURECOM-NAS/src/ies/AuthenticationParameterAutn.o				\
    EURECOM-NAS/src/ies/EpsAttachType.o								\
    EURECOM-NAS/src/ies/IdentityType2.o								\
    EURECOM-NAS/src/ies/LcsClientIdentity.o							\
    EURECOM-NAS/src/ies/DetachType.o								\
    EURECOM-NAS/src/ies/LocationAreaIdentification.o				\
    EURECOM-NAS/src/ies/TrackingAreaIdentity.o						\
    EURECOM-NAS/src/ies/CipheringKeySequenceNumber.o				\
    EURECOM-NAS/src/ies/MsNetworkCapability.o						\
    EURECOM-NAS/src/ies/UeNetworkCapability.o						\
    EURECOM-NAS/src/ies/ProtocolConfigurationOptions.o				\
    EURECOM-NAS/src/ies/AdditionalUpdateType.o						\
    EURECOM-NAS/src/ies/TmsiStatus.o								\
    EURECOM-NAS/src/ies/EsmMessageContainer.o						\
    EURECOM-NAS/src/ies/Nonce.o										\
    EURECOM-NAS/src/ies/ProcedureTransactionIdentity.o				\
    EURECOM-NAS/src/ies/TransactionIdentifier.o						\
    EURECOM-NAS/src/ies/AdditionalUpdateResult.o					\
    EURECOM-NAS/src/ies/GprsTimer.o									\
    EURECOM-NAS/src/ies/EpsNetworkFeatureSupport.o					\
    EURECOM-NAS/src/ies/SsCode.o									\
    EURECOM-NAS/src/ies/DrxParameter.o								\
    EURECOM-NAS/src/ies/KsiAndSequenceNumber.o						\
    EURECOM-NAS/src/ies/VoiceDomainPreferenceAndUeUsageSetting.o

libnas_utils_OBJS =								\
    EURECOM-NAS/src/util/device.o				\
    EURECOM-NAS/src/util/memory.o				\
    EURECOM-NAS/src/util/nas_log.o				\
    EURECOM-NAS/src/util/nas_timer.o			\
    EURECOM-NAS/src/util/socket.o				\
    EURECOM-NAS/src/util/stty.o					\
    EURECOM-NAS/src/util/TLVEncoder.o			\
    EURECOM-NAS/src/util/TLVDecoder.o			\
    EURECOM-NAS/src/util/OctetString.o

libnas_user_OBJS =								\
    EURECOM-NAS/src/api/user/user_api.o			\
    EURECOM-NAS/src/api/user/user_indication.o	\
    EURECOM-NAS/src/api/user/at_command.o		\
    EURECOM-NAS/src/api/user/at_error.o			\
    EURECOM-NAS/src/api/user/at_response.o
    
libnas_usim_OBJS =								\
    EURECOM-NAS/src/api/usim/aka_functions.o	\
    EURECOM-NAS/src/api/usim/usim_api.o			

libnas_OBJS =									\
    nas_ue_task.o								\
    nas_itti_messaging.o						\
    EURECOM-NAS/src/nas_parser.o				\
    EURECOM-NAS/src/nas_proc.o					\
    EURECOM-NAS/src/nas_user.o					\
    $(libnas_utils_OBJS)						\
    $(libnas_user_OBJS)							\
    $(libnas_usim_OBJS)							\
    $(libnas_emm_OBJS)							\
    $(libnas_emm_msg_OBJS)						\
    $(libnas_emm_sap_OBJS)						\
    $(libnas_esm_OBJS)							\
    $(libnas_esm_msg_OBJS)						\
    $(libnas_esm_sap_OBJS)						\
    $(libnas_ies_OBJS)							\
    $(libnas_api_OBJS)

NAS_UE_COMPILED_OBJS = $(addprefix $(OUTDIR)/,$(libnas_OBJS))

# pull in dependency info for *existing* .o files
-include $(NAS_UE_COMPILED_OBJS:.o=.d)

CFLAGS =                                       \
    -g                                         \
    -Wall                                      \
	-DNAS_UE                                   \
	-DNAS_BUILT_IN_UE                                 \
	-Wuninitialized                            \
	-Werror=implicit-function-declaration      \
	$(UENAS_CFLAGS)                            \
	$(libnas_INCLUDES)

.SECONDEXPANSION:
$(NAS_UE_COMPILED_OBJS): %.o : $$(subst $(OUTDIR), $(UE_NAS_DIR), $$*.c)
	@echo "Compiling $<"
	@if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi;
	@$(CC) -c $(CFLAGS) -o $@ $<
	@$(CC) -MM $(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

$(OUTDIR)/libuenas.a: $(NAS_UE_COMPILED_OBJS)
	@echo Creating UE_NAS archive
	@$(AR) rcs $@ $(addprefix $(OUTDIR)/,$(libnas_OBJS))

clean:
	@$(RM_F_V) -r $(OUTDIR)/*.o
	@$(RM_F_V) -r $(OUTDIR)/*.d
	@$(RM_F_V) $(OUTDIR)/libuenas.a

cleanall:
	@$(RM_F_V) -r $(OUTDIR)

showcflags:
	@echo uenas cflags: $(CFLAGS)