include_directories(
	source
)

add_library(
	meta STATIC
	./source/toolkit/StorageTkEx.cpp
	./source/toolkit/BuddyCommTk.cpp
	./source/toolkit/BuddyCommTk.h
	./source/toolkit/XAttrTk.h
	./source/toolkit/XAttrTk.cpp
	./source/toolkit/StorageTkEx.h
	./source/net/message/mon/RequestMetaDataMsgEx.h
	./source/net/message/mon/RequestMetaDataMsgEx.cpp
	./source/net/message/control/AckMsgEx.h
	./source/net/message/control/SetChannelDirectMsgEx.cpp
	./source/net/message/control/AckMsgEx.cpp
	./source/net/message/control/SetChannelDirectMsgEx.h
	./source/net/message/NetMessageFactory.h
	./source/net/message/session/opening/OpenFileMsgEx.cpp
	./source/net/message/session/opening/CloseFileMsgEx.h
	./source/net/message/session/opening/OpenFileMsgEx.h
	./source/net/message/session/opening/CloseFileMsgEx.cpp
	./source/net/message/session/BumpFileVersionMsgEx.h
	./source/net/message/session/GetFileVersionMsgEx.h
	./source/net/message/session/locking/FLockEntryMsgEx.h
	./source/net/message/session/locking/FLockRangeMsgEx.h
	./source/net/message/session/locking/FLockRangeMsgEx.cpp
	./source/net/message/session/locking/FLockAppendMsgEx.h
	./source/net/message/session/locking/FLockEntryMsgEx.cpp
	./source/net/message/session/locking/FLockAppendMsgEx.cpp
	./source/net/message/session/GetFileVersionMsgEx.cpp
	./source/net/message/session/BumpFileVersionMsgEx.cpp
	./source/net/message/session/AckNotifyMsgEx.h
	./source/net/message/NetMessageFactory.cpp
	./source/net/message/nodes/SetTargetConsistencyStatesMsgEx.cpp
	./source/net/message/nodes/GetNodesMsgEx.h
	./source/net/message/nodes/GetNodeCapacityPoolsMsgEx.cpp
	./source/net/message/nodes/RefreshCapacityPoolsMsgEx.cpp
	./source/net/message/nodes/GetTargetMappingsMsgEx.h
	./source/net/message/nodes/GetClientStatsMsgEx.h
	./source/net/message/nodes/MapTargetsMsgEx.cpp
	./source/net/message/nodes/RefreshTargetStatesMsgEx.cpp
	./source/net/message/nodes/storagepools/RefreshStoragePoolsMsgEx.h
	./source/net/message/nodes/storagepools/RefreshStoragePoolsMsgEx.cpp
	./source/net/message/nodes/HeartbeatMsgEx.cpp
	./source/net/message/nodes/HeartbeatRequestMsgEx.h
	./source/net/message/nodes/GetClientStatsMsgEx.cpp
	./source/net/message/nodes/GetTargetMappingsMsgEx.cpp
	./source/net/message/nodes/PublishCapacitiesMsgEx.h
	./source/net/message/nodes/GenericDebugMsgEx.cpp
	./source/net/message/nodes/GetNodesMsgEx.cpp
	./source/net/message/nodes/SetMirrorBuddyGroupMsgEx.h
	./source/net/message/nodes/PublishCapacitiesMsgEx.cpp
	./source/net/message/nodes/RemoveNodeMsgEx.cpp
	./source/net/message/nodes/SetTargetConsistencyStatesMsgEx.h
	./source/net/message/nodes/HeartbeatRequestMsgEx.cpp
	./source/net/message/nodes/MapTargetsMsgEx.h
	./source/net/message/nodes/HeartbeatMsgEx.h
	./source/net/message/nodes/GenericDebugMsgEx.h
	./source/net/message/nodes/RemoveNodeMsgEx.h
	./source/net/message/nodes/GetNodeCapacityPoolsMsgEx.h
	./source/net/message/nodes/RefreshTargetStatesMsgEx.h
	./source/net/message/nodes/SetMirrorBuddyGroupMsgEx.cpp
	./source/net/message/nodes/RefreshCapacityPoolsMsgEx.h
	./source/net/message/MirroredMessage.h
	./source/net/message/storage/moving/RenameV2MsgEx.cpp
	./source/net/message/storage/moving/RenameV2MsgEx.h
	./source/net/message/storage/moving/MovingFileInsertMsgEx.cpp
	./source/net/message/storage/moving/MovingDirInsertMsgEx.h
	./source/net/message/storage/moving/MovingFileInsertMsgEx.h
	./source/net/message/storage/moving/MovingDirInsertMsgEx.cpp
	./source/net/message/storage/GetHighResStatsMsgEx.h
	./source/net/message/storage/creating/MkFileWithPatternMsgEx.cpp
	./source/net/message/storage/creating/MkLocalDirMsgEx.cpp
	./source/net/message/storage/creating/MkFileWithPatternMsgEx.h
	./source/net/message/storage/creating/RmDirEntryMsgEx.h
	./source/net/message/storage/creating/UnlinkFileMsgEx.h
	./source/net/message/storage/creating/MkFileMsgEx.cpp
	./source/net/message/storage/creating/RmDirMsgEx.cpp
	./source/net/message/storage/creating/MkLocalDirMsgEx.h
	./source/net/message/storage/creating/MkFileMsgEx.h
	./source/net/message/storage/creating/MkDirMsgEx.cpp
	./source/net/message/storage/creating/UnlinkFileMsgEx.cpp
	./source/net/message/storage/creating/MkDirMsgEx.h
	./source/net/message/storage/creating/HardlinkMsgEx.h
	./source/net/message/storage/creating/HardlinkMsgEx.cpp
	./source/net/message/storage/creating/RmLocalDirMsgEx.cpp
	./source/net/message/storage/creating/RmDirEntryMsgEx.cpp
	./source/net/message/storage/creating/RmLocalDirMsgEx.h
	./source/net/message/storage/creating/RmDirMsgEx.h
	./source/net/message/storage/creating/MoveFileInodeMsgEx.cpp
	./source/net/message/storage/creating/UnlinkLocalFileInodeMsgEx.cpp
	./source/net/message/storage/TruncFileMsgEx.h
	./source/net/message/storage/mirroring/ResyncRawInodesMsgEx.cpp
	./source/net/message/storage/mirroring/StorageResyncStartedMsgEx.cpp
	./source/net/message/storage/mirroring/StorageResyncStartedMsgEx.h
	./source/net/message/storage/mirroring/SetMetadataMirroringMsgEx.h
	./source/net/message/storage/mirroring/ResyncSessionStoreMsgEx.h
	./source/net/message/storage/mirroring/ResyncSessionStoreMsgEx.cpp
	./source/net/message/storage/mirroring/GetMetaResyncStatsMsgEx.h
	./source/net/message/storage/mirroring/SetMetadataMirroringMsgEx.cpp
	./source/net/message/storage/mirroring/GetMetaResyncStatsMsgEx.cpp
	./source/net/message/storage/mirroring/ResyncRawInodesMsgEx.h
	./source/net/message/storage/attribs/RemoveXAttrMsgEx.cpp
	./source/net/message/storage/attribs/UpdateDirParentMsgEx.h
	./source/net/message/storage/attribs/RefreshEntryInfoMsgEx.h
	./source/net/message/storage/attribs/StatMsgEx.h
	./source/net/message/storage/attribs/RemoveXAttrMsgEx.h
	./source/net/message/storage/attribs/ListXAttrMsgEx.h
	./source/net/message/storage/attribs/GetEntryInfoMsgEx.h
	./source/net/message/storage/attribs/SetAttrMsgEx.h
	./source/net/message/storage/attribs/SetXAttrMsgEx.h
	./source/net/message/storage/attribs/SetDirPatternMsgEx.h
	./source/net/message/storage/attribs/ListXAttrMsgEx.cpp
	./source/net/message/storage/attribs/SetDirPatternMsgEx.cpp
	./source/net/message/storage/attribs/GetXAttrMsgEx.cpp
	./source/net/message/storage/attribs/StatMsgEx.cpp
	./source/net/message/storage/attribs/RefreshEntryInfoMsg.cpp
	./source/net/message/storage/attribs/GetEntryInfoMsgEx.cpp
	./source/net/message/storage/attribs/GetXAttrMsgEx.h
	./source/net/message/storage/attribs/UpdateDirParentMsgEx.cpp
	./source/net/message/storage/attribs/SetAttrMsgEx.cpp
	./source/net/message/storage/attribs/SetXAttrMsgEx.cpp
	./source/net/message/storage/attribs/SetFilePatternMsgEx.cpp
	./source/net/message/storage/TruncFileMsgEx.cpp
	./source/net/message/storage/GetHighResStatsMsgEx.cpp
	./source/net/message/storage/lookup/FindOwnerMsgEx.cpp
	./source/net/message/storage/lookup/FindLinkOwnerMsgEx.cpp
	./source/net/message/storage/lookup/FindOwnerMsgEx.h
	./source/net/message/storage/lookup/LookupIntentMsgEx.h
	./source/net/message/storage/lookup/FindLinkOwnerMsgEx.h
	./source/net/message/storage/lookup/LookupIntentMsgEx.cpp
	./source/net/message/storage/chunkbalancing/ChunkBalanceMsgEx.cpp
	./source/net/message/storage/chunkbalancing/StripePatternUpdateMsgEx.cpp
	./source/net/message/storage/StatStoragePathMsgEx.h
	./source/net/message/storage/StatStoragePathMsgEx.cpp
	./source/net/message/storage/listing/ListDirFromOffsetMsgEx.h
	./source/net/message/storage/listing/ListDirFromOffsetMsgEx.cpp
	./source/net/message/storage/quota/SetExceededQuotaMsgEx.cpp
	./source/net/message/storage/quota/SetExceededQuotaMsgEx.h
    ./source/net/message/storage/attribs/SetFilePatternMsgEx.h
    ./source/net/message/storage/attribs/SetFilePatternMsgEx.cpp
    ./source/net/message/storage/creating/UnlinkLocalFileInodeMsgEx.h
	./source/net/message/storage/creating/UnlinkLocalFileInodeMsgEx.cpp
    ./source/net/message/storage/creating/MoveFileInodeMsgEx.h
    ./source/net/message/storage/creating/MoveFileInodeMsgEx.cpp
    ./source/net/message/fsck/UpdateFileAttribsMsgEx.cpp
	./source/net/message/fsck/RemoveInodesMsgEx.h
	./source/net/message/fsck/AdjustChunkPermissionsMsgEx.h
	./source/net/message/fsck/FixInodeOwnersMsgEx.cpp
	./source/net/message/fsck/AdjustChunkPermissionsMsgEx.cpp
	./source/net/message/fsck/FsckSetEventLoggingMsgEx.h
	./source/net/message/fsck/UpdateDirAttribsMsgEx.cpp
	./source/net/message/fsck/FixInodeOwnersMsgEx.h
	./source/net/message/fsck/UpdateFileAttribsMsgEx.h
	./source/net/message/fsck/UpdateDirAttribsMsgEx.h
	./source/net/message/fsck/FixInodeOwnersInDentryMsgEx.cpp
	./source/net/message/fsck/RetrieveDirEntriesMsgEx.cpp
	./source/net/message/fsck/DeleteDirEntriesMsgEx.h
	./source/net/message/fsck/RetrieveFsIDsMsgEx.h
	./source/net/message/fsck/CreateEmptyContDirsMsgEx.h
	./source/net/message/fsck/RetrieveInodesMsgEx.cpp
	./source/net/message/fsck/LinkToLostAndFoundMsgEx.h
	./source/net/message/fsck/RetrieveInodesMsgEx.h
	./source/net/message/fsck/RecreateDentriesMsgEx.cpp
	./source/net/message/fsck/CreateDefDirInodesMsgEx.h
	./source/net/message/fsck/LinkToLostAndFoundMsgEx.cpp
	./source/net/message/fsck/RecreateFsIDsMsgEx.cpp
	./source/net/message/fsck/FixInodeOwnersInDentryMsgEx.h
	./source/net/message/fsck/FsckSetEventLoggingMsgEx.cpp
	./source/net/message/fsck/RetrieveDirEntriesMsgEx.h
	./source/net/message/fsck/DeleteDirEntriesMsgEx.cpp
	./source/net/message/fsck/CreateDefDirInodesMsgEx.cpp
	./source/net/message/fsck/RecreateDentriesMsgEx.h
	./source/net/message/fsck/RecreateFsIDsMsgEx.h
	./source/net/message/fsck/RemoveInodesMsgEx.cpp
	./source/net/message/fsck/RetrieveFsIDsMsgEx.cpp
	./source/net/message/fsck/CreateEmptyContDirsMsgEx.cpp
    ./source/net/message/fsck/CheckAndRepairDupInodeMsgEx.h
    ./source/net/message/fsck/CheckAndRepairDupInodeMsgEx.cpp
	./source/net/msghelpers/MsgHelperMkFile.h
	./source/net/msghelpers/MsgHelperTrunc.cpp
	./source/net/msghelpers/MsgHelperXAttr.cpp
	./source/net/msghelpers/MsgHelperStat.h
	./source/net/msghelpers/MsgHelperLocking.h
	./source/net/msghelpers/MsgHelperUnlink.h
	./source/net/msghelpers/MsgHelperXAttr.h
	./source/net/msghelpers/MsgHelperOpen.cpp
	./source/net/msghelpers/MsgHelperClose.cpp
	./source/net/msghelpers/MsgHelperClose.h
	./source/net/msghelpers/MsgHelperTrunc.h
	./source/net/msghelpers/MsgHelperUnlink.cpp
	./source/net/msghelpers/MsgHelperMkFile.cpp
	./source/net/msghelpers/MsgHelperStat.cpp
	./source/net/msghelpers/MsgHelperOpen.h
	./source/net/msghelpers/MsgHelperLocking.cpp
	./source/components/FileEventLogger.h
	./source/components/DisposalGarbageCollector.h
	./source/components/DatagramListener.h
	./source/components/InternodeSyncer.h
	./source/components/ModificationEventFlusher.cpp
	./source/components/ModificationEventFlusher.h
	./source/components/InternodeSyncer.cpp
	./source/components/DatagramListener.cpp
	./source/components/worker/GetChunkFileAttribsWork.cpp
	./source/components/worker/SetChunkFileAttribsWork.h
	./source/components/worker/SetChunkFileAttribsWork.cpp
	./source/components/worker/UnlinkChunkFileWork.h
	./source/components/worker/BarrierWork.h
	./source/components/worker/CloseChunkFileWork.h
	./source/components/worker/GetChunkFileAttribsWork.h
	./source/components/worker/UnlinkChunkFileWork.cpp
	./source/components/worker/TruncChunkFileWork.cpp
	./source/components/worker/CloseChunkFileWork.cpp
	./source/components/worker/LockEntryNotificationWork.h
	./source/components/worker/LockEntryNotificationWork.cpp
	./source/components/worker/LockRangeNotificationWork.h
	./source/components/worker/LockRangeNotificationWork.cpp
	./source/components/worker/TruncChunkFileWork.h
	./source/components/FileEventLogger.cpp
	./source/components/DisposalGarbageCollector.cpp
	./source/components/buddyresyncer/BuddyResyncer.cpp
	./source/components/buddyresyncer/BuddyResyncJob.h
	./source/components/buddyresyncer/BuddyResyncerBulkSyncSlave.cpp
	./source/components/buddyresyncer/SessionStoreResyncer.cpp
	./source/components/buddyresyncer/BuddyResyncerGatherSlave.cpp
	./source/components/buddyresyncer/BuddyResyncerBulkSyncSlave.h
	./source/components/buddyresyncer/SyncCandidate.h
	./source/components/buddyresyncer/BuddyResyncerGatherSlave.h
	./source/components/buddyresyncer/SessionStoreResyncer.h
	./source/components/buddyresyncer/BuddyResyncJob.cpp
	./source/components/buddyresyncer/SyncSlaveBase.cpp
	./source/components/buddyresyncer/SyncSlaveBase.h
	./source/components/buddyresyncer/BuddyResyncerModSyncSlave.h
	./source/components/buddyresyncer/BuddyResyncerModSyncSlave.cpp
	./source/components/buddyresyncer/BuddyResyncer.h
	./source/session/LockingNotifier.cpp
	./source/session/EntryLock.h
	./source/session/EntryLockStore.cpp
	./source/session/EntryLockStore.h
	./source/session/SessionFile.h
	./source/session/LockingNotifier.h
	./source/session/Session.h
	./source/session/SessionStore.cpp
	./source/session/SessionFileStore.h
	./source/session/SessionFile.cpp
	./source/session/Session.cpp
	./source/session/MirrorMessageResponseState.h
	./source/session/SessionStore.h
	./source/session/SessionFileStore.cpp
	./source/session/MirrorMessageResponseState.cpp
	./source/program/Program.h
	./source/program/Program.cpp
	./source/program/Main.cpp
	./source/app/App.h
	./source/app/App.cpp
	./source/app/config/Config.h
	./source/app/config/Config.cpp
	./source/nodes/MetaNodeOpStats.h
	./source/storage/DirInode.h
	./source/storage/IncompleteInode.cpp
	./source/storage/MetadataEx.h
	./source/storage/Locking.h
	./source/storage/DirEntryStore.cpp
	./source/storage/DentryStoreData.h
	./source/storage/FileInodeStoreData.h
	./source/storage/InodeFileStore.cpp
	./source/storage/PosixACL.cpp
	./source/storage/IncompleteInode.h
	./source/storage/Locking.cpp
	./source/storage/MkFileDetails.h
	./source/storage/MetaStore.cpp
	./source/storage/InodeFileStore.h
	./source/storage/FileInode.cpp
	./source/storage/DiskMetaData.cpp
	./source/storage/FileInode.h
	./source/storage/InodeDirStore.cpp
	./source/storage/DirEntry.cpp
	./source/storage/SyncedDiskAccessPath.h
	./source/storage/DirEntryStore.h
	./source/storage/MetaStore.h
	./source/storage/MetaStoreRename.cpp
	./source/storage/NodeOfflineWait.h
	./source/storage/InodeDirStore.h
	./source/storage/DirInode.cpp
	./source/storage/DiskMetaData.h
	./source/storage/DirEntry.h
	./source/storage/MetaFileHandle.h
	./source/storage/FileInodeStoreData.cpp
	./source/storage/PosixACL.h
)

target_link_libraries(
	meta
	beegfs-common
	dl
	pthread
	blkid
)

add_executable(
	beegfs-meta
	source/program/Main.cpp
)

target_link_libraries(
	beegfs-meta
	meta
)

if(NOT BEEGFS_SKIP_TESTS)
	add_executable(
		test-meta
		./tests/TestConfig.h
		./tests/TestSerialization.h
		./tests/TestSerialization.cpp
		./tests/TestConfig.cpp
		./tests/TestBuddyMirroring.cpp
	)

	target_link_libraries(
		test-meta
		meta
		gtest_main
	)

	# required for a test
	file(
		COPY ${CMAKE_CURRENT_SOURCE_DIR}/build/dist/etc/beegfs-meta.conf
		DESTINATION dist/etc/
	)

	add_test(
		NAME test-meta
		COMMAND test-meta --compiler
	)
endif()

install(
	TARGETS beegfs-meta
	DESTINATION "usr/sbin"
	COMPONENT "meta"
)

install(
	PROGRAMS "build/dist/sbin/beegfs-setup-meta"
	DESTINATION "usr/sbin"
	COMPONENT "meta"
)

install(
	FILES "build/dist/usr/lib/systemd/system/beegfs-meta.service" "build/dist/usr/lib/systemd/system/beegfs-meta@.service"
	DESTINATION "${CMAKE_INSTALL_LIBDIR}/systemd/system"
	COMPONENT "meta"
)

install(
	FILES "build/dist/etc/beegfs-meta.conf"
	DESTINATION "etc/beegfs"
	COMPONENT "meta"
)

install(
	PROGRAMS "build/beegfs-meta.sh"
	RENAME "beegfs-meta"
	DESTINATION "opt/beegfs/sbin"
	COMPONENT "meta"
)
