FTPM_FLAGS = -DGCC -DUSE_WOLFCRYPT -DSIMULATION=NO -DUSE_PLATFORM_EPS -DVTPM
FTPM_DEBUG =  -DCOMPILER_CHECKS=YES -DfTPMDebug -DRUNTIME_SIZE_CHECKS -DLIBRARY_COMPATIBILITY_CHECK
FTPM_RELEASE = -DCOMPILER_CHECKS=NO -DRUNTIME_SIZE_CHECKS=NO -DLIBRARY_COMPATIBILITY_CHECK=NO

#
# The fTPM needs to overwrite some of the header files used in the reference implementation. The search order GCC
# uses is dependent on the order the '-I/include/path' arguments are passed in. This is depended on the optee_os build
# system which makes it brittle. Force including these files here will make sure the correct files are used first.
#

FTPM_INCLUDES = -include ./reference/include/VendorString.h -include ./reference/include/Implementation.h

#
# The TPM causes a few warnings when compiled with GCC which are not critical.
#

FTPM_WARNING_SUPPRESS = -Wno-cast-align -Wno-switch-default -Wno-suggest-attribute=noreturn -Wno-missing-braces -Wno-sign-compare

cflags-y += $(FTPM_FLAGS) $(WOLF_SSL_FLAGS) $(FTPM_INCLUDES) $(FTPM_WARNING_SUPPRESS)

ifeq ($(CFG_TA_DEBUG),y)
cflags-y += $(FTPM_DEBUG)
else
cflags-y += $(FTPM_RELEASE)
endif

#
# For the purposes of this command the current working directory is the makefile root (/fTPM) folder,
# but the symlink will be created relative to THIS directory so the source requires an extra '../../'.
#
# Symlinks are needed since all build output is placed relative to the root. External libraries would result in
# binaries located outside the ouptut folder.
#
./lib/tpm/tpm_symlink:
	@echo Checking symlink to the TPM folder: $(abspath $(TPM_ROOT))
	@if [ -L ./lib/tpm/tpm_symlink ] ; \
	then \
	echo Symlink already established ; \
	else \
	echo Establishing symlink. ; \
	ln -s ../../$(TPM_ROOT) ./lib/tpm/tpm_symlink; \
	fi

.PHONY: remove_tpm_symlink
remove_tpm_symlink:
	@if [ -e ./lib/tpm/tpm_symlink ] ; \
	then \
	unlink ./lib/tpm/tpm_symlink ; \
	echo Clearing symlink to the TPM folder: $(abspath $(TPM_ROOT)) ; \
	fi

global-incdirs-y += tpm_symlink/TPMCmd/tpm/include
global-incdirs-y += tpm_symlink/TPMCmd/tpm/include/ltc
global-incdirs-y += tpm_symlink/TPMCmd/tpm/include/prototypes
global-incdirs-y += tpm_symlink/TPMCmd/tpm/include/wolf

#
# Generated in WSL using:
# find -name *.c | while read line; do echo XXXX$line; done | sed -e 's/XXXX.\//srcs-y += tpm_symlink/TPMCmd/tpm/src//g'
# This may need to be updated if there are any changes to the reference implementation.
#

srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Asymmetric/ECC_Parameters.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Asymmetric/ECDH_KeyGen.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Asymmetric/ECDH_ZGen.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Asymmetric/EC_Ephemeral.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Asymmetric/RSA_Decrypt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Asymmetric/RSA_Encrypt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Asymmetric/ZGen_2Phase.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/AttachedComponent/AC_GetCapability.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/AttachedComponent/AC_Send.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/AttachedComponent/AC_spt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/AttachedComponent/Policy_AC_SendSelect.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Attestation/Attest_spt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Attestation/Certify.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Attestation/CertifyCreation.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Attestation/GetCommandAuditDigest.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Attestation/GetSessionAuditDigest.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Attestation/GetTime.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Attestation/Quote.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Capability/GetCapability.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Capability/TestParms.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/ClockTimer/ClockRateAdjust.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/ClockTimer/ClockSet.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/ClockTimer/ReadClock.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/CommandAudit/SetCommandCodeAuditStatus.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Context/ContextLoad.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Context/ContextSave.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Context/Context_spt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Context/EvictControl.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Context/FlushContext.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/DA/DictionaryAttackLockReset.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/DA/DictionaryAttackParameters.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Duplication/Duplicate.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Duplication/Import.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Duplication/Rewrap.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyAuthorize.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyAuthorizeNV.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyAuthValue.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyCommandCode.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyCounterTimer.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyCpHash.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyDuplicationSelect.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyGetDigest.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyLocality.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyNameHash.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyNV.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyNvWritten.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyOR.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyPassword.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyPCR.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyPhysicalPresence.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicySecret.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicySigned.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyTemplate.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/PolicyTicket.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/EA/Policy_spt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Ecdaa/Commit.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/FieldUpgrade/FieldUpgradeData.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/FieldUpgrade/FieldUpgradeStart.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/FieldUpgrade/FirmwareRead.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/HashHMAC/EventSequenceComplete.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/HashHMAC/HashSequenceStart.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/HashHMAC/HMAC_Start.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/HashHMAC/MAC_Start.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/HashHMAC/SequenceComplete.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/HashHMAC/SequenceUpdate.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Hierarchy/ChangeEPS.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Hierarchy/ChangePPS.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Hierarchy/Clear.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Hierarchy/ClearControl.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Hierarchy/CreatePrimary.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Hierarchy/HierarchyChangeAuth.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Hierarchy/HierarchyControl.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Hierarchy/SetPrimaryPolicy.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Misc/PP_Commands.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Misc/SetAlgorithmSet.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_Certify.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_ChangeAuth.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_DefineSpace.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_Extend.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_GlobalWriteLock.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_Increment.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_Read.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_ReadLock.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_ReadPublic.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_SetBits.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_spt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_UndefineSpace.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_UndefineSpaceSpecial.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_Write.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/NVStorage/NV_WriteLock.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/ActivateCredential.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/Create.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/CreateLoaded.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/Load.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/LoadExternal.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/MakeCredential.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/ObjectChangeAuth.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/Object_spt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/ReadPublic.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Object/Unseal.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/PCR/PCR_Allocate.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/PCR/PCR_Event.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/PCR/PCR_Extend.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/PCR/PCR_Read.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/PCR/PCR_Reset.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/PCR/PCR_SetAuthPolicy.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/PCR/PCR_SetAuthValue.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Random/GetRandom.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Random/StirRandom.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Session/PolicyRestart.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Session/StartAuthSession.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Signature/Sign.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Signature/VerifySignature.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Startup/Shutdown.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Startup/Startup.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Symmetric/EncryptDecrypt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Symmetric/EncryptDecrypt2.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Symmetric/EncryptDecrypt_spt.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Symmetric/Hash.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Symmetric/HMAC.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Symmetric/MAC.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Testing/GetTestResult.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Testing/IncrementalSelfTest.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Testing/SelfTest.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/command/Vendor/Vendor_TCG_Test.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/AlgorithmTests.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/BnConvert.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/BnMath.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/BnMemory.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptCmac.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptDes.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptEccData.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptEccKeyExchange.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptEccMain.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptEccSignature.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptHash.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptHashData.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptPrime.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptPrimeSieve.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptRand.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptRsa.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptSelfTest.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptSmac.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptSym.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/CryptUtil.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/ltc/TpmToLtcDesSupport.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/ltc/TpmToLtcMath.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/ltc/TpmToLtcSupport.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/ossl/TpmToOsslDesSupport.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/ossl/TpmToOsslMath.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/ossl/TpmToOsslSupport.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/PrimeData.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/RsaKeyCache.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/Ticket.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/wolf/TpmToWolfDesSupport.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/wolf/TpmToWolfMath.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/crypt/wolf/TpmToWolfSupport.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/events/_TPM_Hash_Data.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/events/_TPM_Hash_End.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/events/_TPM_Hash_Start.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/events/_TPM_Init.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/main/CommandDispatcher.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/main/ExecCommand.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/main/SessionProcess.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/CommandAudit.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/DA.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/Hierarchy.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/NvDynamic.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/NvReserved.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/Object.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/PCR.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/PP.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/Session.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/subsystem/Time.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/AlgorithmCap.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Bits.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/CommandCodeAttributes.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Entity.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Global.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Handle.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/IoBuffers.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Locality.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Manufacture.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Marshal.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/MathOnByteBuffers.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Memory.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Power.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/PropertyCap.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/Response.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/ResponseCodeProcessing.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/TpmFail.c
srcs-y += tpm_symlink/TPMCmd/tpm/src/support/TpmSizeChecks.c