#- * - mode : CMAKE; - * -

include_directories(.)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/")

################################################################################
## BISON/FLEX
################################################################################

#note that we check - in the generated FLEX / BISON files, therefore they are
#generate inside the source tree

if (USE_MAINTAINER_MODE AND NOT MSVC)
  set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM "On")

  add_custom_command(
    OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/Aql/tokens.cpp
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMAND ${FLEX_EXECUTABLE} -L -oAql/tokens.cpp Aql/tokens.ll
    MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/Aql/tokens.ll
    VERBATIM
  )

  add_custom_command(
    OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/Aql/grammar.cpp
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMAND ${CMAKE_SOURCE_DIR}/utils/bison-c.sh
      ${BISON_EXECUTABLE} Aql/grammar.cpp Aql/grammar.y
    MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/Aql/grammar.y
    VERBATIM
  )

  add_custom_target(clean_aql_autogenerated
    COMMAND rm -f Aql/tokens.cpp Aql/tokens.h Aql/grammar.cpp Aql/grammar.h
  )

  list(APPEND CLEAN_AUTOGENERATED_FILES clean_aql_autogenerated)
  set(CLEAN_AUTOGENERATED_FILES ${CLEAN_AUTOGENERATED_FILES} PARENT_SCOPE)
endif ()

if (CMAKE_COMPILER_IS_GNUCC)
  set_source_files_properties(Aql/tokens.cpp PROPERTIES COMPILE_FLAGS -Wno-sign-compare)
endif ()

################################################################################
## IResearch
################################################################################

find_package(IResearch REQUIRED)

add_library(arango_iresearch
  STATIC
  IResearch/ApplicationServerHelper.h IResearch/ApplicationServerHelper.cpp
  IResearch/AqlHelper.cpp IResearch/AqlHelper.h
  IResearch/Containers.cpp IResearch/Containers.h
  IResearch/ExpressionFilter.cpp IResearch/ExpressionFilter.h
  IResearch/Geo.cpp IResearch/Geo.h
  IResearch/GeoAnalyzer.cpp IResearch/GeoAnalyzer.h
  IResearch/GeoFilter.cpp IResearch/GeoFilter.h
  IResearch/IResearchAnalyzerFeature.cpp IResearch/IResearchAnalyzerFeature.h
  IResearch/IResearchAqlAnalyzer.cpp IResearch/IResearchAqlAnalyzer.h
  IResearch/IResearchCommon.cpp IResearch/IResearchCommon.h
  IResearch/IResearchCompression.cpp IResearch/IResearchCompression.h
  IResearch/IResearchDocument.cpp IResearch/IResearchDocument.h
  IResearch/IResearchExpressionContext.cpp IResearch/IResearchExpressionContext.h
  IResearch/IResearchFeature.cpp IResearch/IResearchFeature.h
  IResearch/IResearchFilterFactory.cpp IResearch/IResearchFilterFactory.h
  IResearch/IResearchIdentityAnalyzer.cpp IResearch/IResearchIdentityAnalyzer.h
  IResearch/IResearchKludge.cpp IResearch/IResearchKludge.h
  IResearch/IResearchLink.cpp IResearch/IResearchLink.h
  IResearch/IResearchLinkCoordinator.cpp IResearch/IResearchLinkCoordinator.h
  IResearch/IResearchLinkHelper.cpp IResearch/IResearchLinkHelper.h
  IResearch/IResearchLinkMeta.cpp IResearch/IResearchLinkMeta.h
  IResearch/IResearchOrderFactory.cpp IResearch/IResearchOrderFactory.h
  IResearch/IResearchPDP.cpp IResearch/IResearchPDP.h
  IResearch/IResearchPrimaryKeyFilter.cpp IResearch/IResearchPrimaryKeyFilter.h
  IResearch/IResearchRocksDBLink.cpp IResearch/IResearchRocksDBLink.h
  IResearch/IResearchRocksDBRecoveryHelper.cpp
  IResearch/IResearchRocksDBRecoveryHelper.h
  IResearch/IResearchVPackComparer.cpp IResearch/IResearchVPackComparer.h
  IResearch/IResearchView.cpp IResearch/IResearchView.h
  IResearch/IResearchViewCoordinator.cpp IResearch/IResearchViewCoordinator.h
  IResearch/IResearchViewMeta.cpp IResearch/IResearchViewMeta.h
  IResearch/IResearchViewSort.cpp IResearch/IResearchViewSort.h
  IResearch/IResearchViewStoredValues.cpp IResearch/IResearchViewStoredValues.h
  IResearch/VelocyPackHelper.cpp IResearch/VelocyPackHelper.h
  RestHandler/RestAnalyzerHandler.cpp RestHandler/RestAnalyzerHandler.h
)

target_compile_definitions(arango_iresearch
  PUBLIC "$<$<CONFIG:Debug>:IRESEARCH_DEBUG=1>"
)

set(IRESEARCH_TARGET_DEPENDENCY iresearch-static) # use static to match ArangoDB


get_target_property(IRESEARCH_INCLUDE
  ${IRESEARCH_TARGET_DEPENDENCY} INCLUDE_DIRECTORIES)

target_include_directories(arango_iresearch
  PUBLIC ${IRESEARCH_INCLUDE}
)

if (USE_ENTERPRISE)
  target_include_directories(arango_iresearch
    PUBLIC "${PROJECT_SOURCE_DIR}/${ENTERPRISE_INCLUDE_DIR}"
  )
endif()

target_link_libraries(arango_iresearch
  ${IRESEARCH_TARGET_DEPENDENCY}
  s2 # needed for some includes
  boost_locale # required by iResearch
)

add_dependencies(arango_iresearch
  ${IRESEARCH_TARGET_DEPENDENCY}
  v8_build # for ICU required by iResearch
)

################################################################################
# llhttp
################################################################################


SET(LLHTTP_SOURCES
  ${PROJECT_SOURCE_DIR}/3rdParty/llhttp/src/api.c
  ${PROJECT_SOURCE_DIR}/3rdParty/llhttp/src/http.c
  ${PROJECT_SOURCE_DIR}/3rdParty/llhttp/src/llhttp.c
)


################################################################################
## arangod
################################################################################

if (MSVC AND NOT(SKIP_PACKAGING))
  generate_product_version(ProductVersionFiles
    NAME arangod
    FILE_DESCRIPTION ${ARANGODB_FRIENDLY_STRING}
    ICON ${ARANGO_ICON}
    VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR}
    VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR}
    VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH}
    VERSION_REVISION ${BUILD_ID}
  )
endif ()

if (USE_ENTERPRISE)
  set(ENTERPRISE_FILES "")
else ()
  set(ENTERPRISE_FILES
    Utils/Events.cpp
  )
endif ()

set(LIB_ARANGO_GRAPH_SOURCES
  Aql/PruneExpressionEvaluator.cpp
  Cluster/CallbackGuard.cpp
  Cluster/ClusterEdgeCursor.cpp
  Cluster/ClusterTraverser.cpp
  Cluster/ServerDefaults.cpp
  Cluster/TraverserEngine.cpp
  Graph/AttributeWeightShortestPathFinder.cpp
  Graph/BaseOptions.cpp
  Graph/BreadthFirstEnumerator.cpp
  Graph/ClusterGraphDatalake.cpp
  Graph/ClusterTraverserCache.cpp
  Graph/ConstantWeightShortestPathFinder.cpp
  Graph/Graph.cpp
  Graph/GraphManager.cpp
  Graph/GraphOperations.cpp
  Graph/KShortestPathsFinder.cpp
  Graph/NeighborsEnumerator.cpp
  Graph/PathEnumerator.cpp
  Graph/ShortestPathFinder.cpp
  Graph/ShortestPathOptions.cpp
  Graph/ShortestPathResult.cpp
  Graph/ShortestPathType.cpp
  Graph/SingleServerEdgeCursor.cpp
  Graph/SingleServerTraverser.cpp
  Graph/Traverser.cpp
  Graph/TraverserCache.cpp
  Graph/TraverserCacheFactory.cpp
  Graph/TraverserDocumentCache.cpp
  Graph/TraverserOptions.cpp
  Graph/WeightedEnumerator.cpp
  Graph/Cursors/RefactoredSingleServerEdgeCursor.cpp
  Graph/Cache/RefactoredTraverserCache.cpp
  Graph/Cache/RefactoredClusterTraverserCache.cpp
  Graph/Enumerators/TwoSidedEnumerator.cpp
  Graph/Helpers/TraceEntry.cpp
  Graph/Queues/QueueTracer.cpp
  Graph/PathManagement/PathResult.cpp
  Graph/PathManagement/PathStore.cpp
  Graph/PathManagement/PathStoreTracer.cpp
  Graph/PathManagement/PathValidator.cpp
  Graph/Options/TwoSidedEnumeratorOptions.cpp
  Graph/Providers/ClusterProvider.cpp
  Graph/Providers/SingleServerProvider.cpp
  Graph/Providers/BaseProviderOptions.cpp
  Graph/Providers/ProviderTracer.cpp
  Graph/Types/UniquenessLevel.cpp
  Graph/Types/ValidationResult.cpp
  InternalRestHandler/InternalRestTraverserHandler.cpp
  RestHandler/RestGraphHandler.cpp
)

set(LIB_ARANGO_PREGEL_AIR_SOURCES
  Pregel/Algos/AIR/AIR.cpp
  Pregel/Algos/AIR/AbstractAccumulator.cpp
  Pregel/Algos/AIR/AccumulatorOptions.cpp
  Pregel/Algos/AIR/Accumulators.cpp
  Pregel/Algos/AIR/EdgeData.cpp
  Pregel/Algos/AIR/GraphFormat.cpp
  Pregel/Algos/AIR/MasterContext.cpp
  Pregel/Algos/AIR/MessageData.cpp
  Pregel/Algos/AIR/MessageFormat.cpp
  Pregel/Algos/AIR/VertexComputation.cpp
  Pregel/Algos/AIR/VertexData.cpp
  Pregel/Algos/AIR/WorkerContext.cpp
)

set(LIB_ARANGO_PREGEL_SOURCES
  Pregel/AggregatorHandler.cpp
  Pregel/AlgoRegistry.cpp
  Pregel/Algos/AsyncSCC.cpp
  Pregel/Algos/ConnectedComponents.cpp
  Pregel/Algos/DMID/DMID.cpp
  Pregel/Algos/EffectiveCloseness/EffectiveCloseness.cpp
  Pregel/Algos/EffectiveCloseness/HLLCounter.cpp
  Pregel/Algos/HITS.cpp
  Pregel/Algos/LabelPropagation.cpp
  Pregel/Algos/LineRank.cpp
  Pregel/Algos/PageRank.cpp
  Pregel/Algos/RecoveringPageRank.cpp
  Pregel/Algos/SCC.cpp
  Pregel/Algos/SLPA.cpp
  Pregel/Algos/SSSP.cpp
  Pregel/Algos/ShortestPath.cpp
  Pregel/Algos/WCC.cpp
  Pregel/Conductor.cpp
  Pregel/GraphStore.cpp
  Pregel/IncomingCache.cpp
  Pregel/IndexHelpers.cpp
  Pregel/OutgoingCache.cpp
  Pregel/PregelFeature.cpp
  Pregel/Recovery.cpp
  Pregel/Reports.cpp
  Pregel/Reports.h
  Pregel/Utils.cpp
  Pregel/Worker-templates-algorithms.cpp
  Pregel/Worker-templates-native-types.cpp
  Pregel/Worker.cpp
  Pregel/WorkerConfig.cpp
  RestHandler/RestControlPregelHandler.cpp
  RestHandler/RestPregelHandler.cpp
)

set(LIB_ARANGO_AQL_SOURCES
  Aql/Aggregator.cpp
  Aql/AllRowsFetcher.cpp
  Aql/AqlCall.cpp
  Aql/AqlCallList.cpp
  Aql/AqlCallSet.cpp
  Aql/AqlCallStack.cpp
  Aql/AqlExecuteResult.cpp
  Aql/AqlFunctionFeature.cpp
  Aql/AqlFunctionsInternalCache.cpp
  Aql/AqlItemBlock.cpp
  Aql/AqlItemBlockInputMatrix.cpp
  Aql/AqlItemBlockInputRange.cpp
  Aql/AqlItemBlockManager.cpp
  Aql/AqlItemBlockUtils.cpp
  Aql/AqlItemMatrix.cpp
  Aql/AqlTransaction.cpp
  Aql/AqlValue.cpp
  Aql/AqlValueGroup.cpp
  Aql/AqlValueMaterializer.cpp
  Aql/Arithmetic.cpp
  Aql/Ast.cpp
  Aql/AstHelper.cpp
  Aql/AstNode.cpp
  Aql/AstResources.cpp
  Aql/AsyncExecutor.cpp
  Aql/AttributeAccessor.cpp
  Aql/AttributeNamePath.cpp
  Aql/BindParameters.cpp
  Aql/BlocksWithClients.cpp
  Aql/CalculationExecutor.cpp
  Aql/CalculationNodeVarFinder.cpp
  Aql/ClusterNodes.cpp
  Aql/CollectNode.cpp
  Aql/CollectOptions.cpp
  Aql/Collection.cpp
  Aql/CollectionAccess.cpp
  Aql/CollectionAccessingNode.cpp
  Aql/Collections.cpp
  Aql/Condition.cpp
  Aql/ConditionFinder.cpp
  Aql/ConstFetcher.cpp
  Aql/ConstrainedSortExecutor.cpp
  Aql/CostEstimate.cpp
  Aql/CountCollectExecutor.cpp
  Aql/DependencyProxy.cpp
  Aql/DistinctCollectExecutor.cpp
  Aql/DistributeClientBlock.cpp
  Aql/DistributeConsumerNode.cpp
  Aql/DistributeExecutor.cpp
  Aql/DocumentExpressionContext.cpp
  Aql/DocumentIndexExpressionContext.cpp
  Aql/DocumentProducingHelper.cpp
  Aql/DocumentProducingNode.cpp
  Aql/ClusterQuery.cpp
  Aql/EngineInfoContainerCoordinator.cpp
  Aql/EngineInfoContainerDBServerServerBased.cpp
  Aql/EnumerateCollectionExecutor.cpp
  Aql/EnumerateListExecutor.cpp
  Aql/ExecutionBlock.cpp
  Aql/ExecutionBlockImpl.cpp
  Aql/ExecutionEngine.cpp
  Aql/ExecutionNode.cpp
  Aql/ExecutionNodeId.cpp
  Aql/ExecutionPlan.cpp
  Aql/ExecutionState.cpp
  Aql/ExecutionStats.cpp
  Aql/ExecutorExpressionContext.cpp
  Aql/Expression.cpp
  Aql/FilterExecutor.cpp
  Aql/FixedVarExpressionContext.cpp
  Aql/Function.cpp
  Aql/Functions.cpp
  Aql/GraphNode.cpp
  Aql/Graphs.cpp
  Aql/HashedCollectExecutor.cpp
  Aql/IResearchViewExecutor.cpp
  Aql/IResearchViewNode.cpp
  Aql/IResearchViewOptimizerRules.cpp
  Aql/IdExecutor.cpp
  Aql/InAndOutRowExpressionContext.cpp
  Aql/IndexExecutor.cpp
  Aql/IndexHint.cpp
  Aql/IndexNode.cpp
  Aql/IndexNodeOptimizerRules.cpp
  Aql/InputAqlItemRow.cpp
  Aql/InsertModifier.cpp
  Aql/KShortestPathsExecutor.cpp
  Aql/KShortestPathsNode.cpp
  Aql/LateMaterializedOptimizerRulesCommon.cpp
  Aql/LimitExecutor.cpp
  Aql/LimitStats.cpp
  Aql/MaterializeExecutor.cpp
  Aql/ModificationExecutor.cpp
  Aql/ModificationExecutorHelpers.cpp
  Aql/ModificationExecutorInfos.cpp
  Aql/ModificationNodes.cpp
  Aql/ModificationOptions.cpp
  Aql/MultiAqlItemBlockInputRange.cpp
  Aql/MultiDependencySingleRowFetcher.cpp
  Aql/MutexExecutor.cpp
  Aql/MutexNode.cpp
  Aql/NodeFinder.cpp
  Aql/NonConstExpression.cpp
  Aql/NonConstExpressionContainer.cpp
  Aql/NoResultsExecutor.cpp
  Aql/Optimizer.cpp
  Aql/OptimizerRules.cpp
  Aql/OptimizerRulesCluster.cpp
  Aql/OptimizerRulesFeature.cpp
  Aql/OptimizerRulesReplaceFunctions.cpp
  Aql/OptimizerUtils.cpp
  Aql/OutputAqlItemRow.cpp
  Aql/ParallelUnsortedGatherExecutor.cpp
  Aql/Parser.cpp
  Aql/Projections.cpp
  Aql/Quantifier.cpp
  Aql/Query.cpp
  Aql/QueryCache.cpp
  Aql/QueryContext.cpp
  Aql/QueryExecutionState.cpp
  Aql/QueryExpressionContext.cpp
  Aql/QueryList.cpp
  Aql/QueryOptions.cpp
  Aql/QueryProfile.cpp
  Aql/QueryRegistry.cpp
  Aql/QuerySnippet.cpp
  Aql/QueryString.cpp
  Aql/QueryWarnings.cpp
  Aql/Range.cpp
  Aql/RegisterId.cpp
  Aql/RegisterInfos.cpp
  Aql/RegisterPlan.cpp
  Aql/RemoteExecutor.cpp
  Aql/RemoveModifier.cpp
  Aql/RestAqlHandler.cpp
  Aql/ReturnExecutor.cpp
  Aql/ScatterExecutor.cpp
  Aql/Scopes.cpp
  Aql/ShadowAqlItemRow.cpp
  Aql/ShardLocking.cpp
  Aql/SharedAqlItemBlockPtr.cpp
  Aql/SharedQueryState.cpp
  Aql/ShortStringStorage.cpp
  Aql/ShortestPathExecutor.cpp
  Aql/ShortestPathNode.cpp
  Aql/SimpleModifier.cpp
  Aql/SingleRemoteModificationExecutor.cpp
  Aql/SingleRowFetcher.cpp
  Aql/SkipResult.cpp
  Aql/SortCondition.cpp
  Aql/SortExecutor.cpp
  Aql/SortNode.cpp
  Aql/SortRegister.cpp
  Aql/SortedCollectExecutor.cpp
  Aql/SortingGatherExecutor.cpp
  Aql/SubqueryEndExecutionNode.cpp
  Aql/SubqueryEndExecutor.cpp
  Aql/SubqueryExecutor.cpp
  Aql/SubqueryStartExecutionNode.cpp
  Aql/SubqueryStartExecutor.cpp
  Aql/Timing.cpp
  Aql/TraversalConditionFinder.cpp
  Aql/TraversalExecutor.cpp
  Aql/TraversalNode.cpp
  Aql/UnsortedGatherExecutor.cpp
  Aql/UpdateReplaceModifier.cpp
  Aql/UpsertModifier.cpp
  Aql/V8Executor.cpp
  Aql/VarUsageFinder.cpp
  Aql/Variable.cpp
  Aql/VariableGenerator.cpp
  Aql/WindowNode.cpp
  Aql/WindowExecutor.cpp
  Aql/grammar.cpp
  Aql/tokens.cpp
)

set(LIB_ARANGO_VOCBASE_SOURCES
  Aql/PlanCache.cpp
  Aql/QueryCursor.cpp
  Replication/DatabaseReplicationApplier.cpp
  Utils/CollectionNameResolver.cpp
  Utils/CursorRepository.cpp
  Utils/DatabaseGuard.cpp
  Utils/SingleCollectionTransaction.cpp
  VocBase/Identifiers/DataSourceId.cpp
  VocBase/Identifiers/IndexId.cpp
  VocBase/Identifiers/LocalDocumentId.cpp
  VocBase/Identifiers/RevisionId.cpp
  VocBase/Identifiers/ServerId.cpp
  VocBase/Identifiers/TransactionId.cpp
  VocBase/KeyGenerator.cpp
  VocBase/LogicalCollection.cpp
  VocBase/LogicalDataSource.cpp
  VocBase/LogicalView.cpp
  VocBase/ManagedDocumentResult.cpp
  VocBase/Methods/AqlUserFunctions.cpp
  VocBase/Methods/Collections.cpp
  VocBase/Methods/Databases.cpp
  VocBase/Methods/Indexes.cpp
  VocBase/Methods/Queries.cpp
  VocBase/Methods/Tasks.cpp
  VocBase/Methods/Transactions.cpp
  VocBase/Methods/Ttl.cpp
  VocBase/Methods/Upgrade.cpp
  VocBase/Methods/UpgradeTasks.cpp
  VocBase/Methods/Version.cpp
  VocBase/Validators.cpp
  VocBase/VocbaseInfo.cpp
  VocBase/ticks.cpp
  VocBase/vocbase.cpp
)

set(LIB_ARANGO_UTILS_SOURCES
  Utils/ExecContext.cpp
  Utils/FlushThread.cpp
  Utils/OperationOptions.cpp
  Utils/UrlHelper.cpp
  ${ENTERPRISE_FILES}
)

set(LIB_ARANGO_HEALTH_SOURCES
  StorageEngine/HealthData.cpp
)

set(LIB_ARANGO_STORAGE_ENGINE_SOURCES
  StorageEngine/EngineSelectorFeature.cpp
  StorageEngine/HotBackup.cpp
  StorageEngine/PhysicalCollection.cpp
  StorageEngine/TransactionCollection.cpp
  StorageEngine/TransactionState.cpp
)

set(LIB_ARANGO_STORAGE_ENGINE_COMMON_SOURCES
  StorageEngine/ReplicationIterator.cpp
  StorageEngine/WalAccess.cpp
)

set(LIB_ARANGO_INDEXES_SOURCES
  GeoIndex/Index.cpp
  GeoIndex/Near.cpp
  Indexes/Index.cpp
  Indexes/IndexFactory.cpp
  Indexes/IndexIterator.cpp
  Indexes/SimpleAttributeEqualityMatcher.cpp
  Indexes/SortedIndexAttributeMatcher.cpp
)

set(LIB_ARANGO_CACHE_SOURCES
  Cache/BucketState.cpp
  Cache/Cache.cpp
  Cache/CacheManagerFeature.cpp
  Cache/CacheManagerFeatureThreads.cpp
  Cache/CachedValue.cpp
  Cache/Finding.cpp
  Cache/Manager.cpp
  Cache/ManagerTasks.cpp
  Cache/Metadata.cpp
  Cache/PlainBucket.cpp
  Cache/PlainCache.cpp
  Cache/Rebalancer.cpp
  Cache/Table.cpp
  Cache/Transaction.cpp
  Cache/TransactionManager.cpp
  Cache/TransactionalBucket.cpp
  Cache/TransactionalCache.cpp
)

set(LIB_ARANGO_REPLICATION_SOURCES
  Replication/DatabaseInitialSyncer.cpp
  Replication/DatabaseTailingSyncer.cpp
  Replication/GlobalInitialSyncer.cpp
  Replication/GlobalReplicationApplier.cpp
  Replication/GlobalTailingSyncer.cpp
  Replication/InitialSyncer.cpp
  Replication/ReplicationApplier.cpp
  Replication/ReplicationApplierConfiguration.cpp
  Replication/ReplicationApplierState.cpp
  Replication/ReplicationClients.cpp
  Replication/ReplicationFeature.cpp
  Replication/ReplicationMetricsFeature.cpp
  Replication/Syncer.cpp
  Replication/SyncerId.cpp
  Replication/TailingSyncer.cpp
  Replication/common-defines.cpp
  Replication/utilities.cpp
  )

set (LIB_ARANGO_METRICS_SOURCES
  RestServer/Metrics.cpp
  RestServer/MetricsFeature.cpp
  RestHandler/RestMetricsHandler.cpp
  )

set(LIB_ARANGO_AGENCY_SOURCES
  Agency/ActiveFailoverJob.cpp
  Agency/AddFollower.cpp
  Agency/AgencyComm.cpp
  Agency/AgencyFeature.cpp
  Agency/AgencyPaths.cpp
  Agency/Agent.cpp
  Agency/AgentCallback.cpp
  Agency/AgentConfiguration.cpp
  Agency/AsyncAgencyComm.cpp
  Agency/CleanOutServer.cpp
  Agency/Compactor.cpp
  Agency/Constituent.cpp
  Agency/FailedFollower.cpp
  Agency/FailedLeader.cpp
  Agency/FailedServer.cpp
  Agency/Inception.cpp
  Agency/Job.cpp
  Agency/JobContext.cpp
  Agency/MoveShard.cpp
  Agency/Node.cpp
  Agency/PathComponent.cpp
  Agency/RemoveFollower.cpp
  Agency/ResignLeadership.cpp
  Agency/RestAgencyHandler.cpp
  Agency/RestAgencyPrivHandler.cpp
  Agency/State.cpp
  Agency/Store.cpp
  Agency/Supervision.cpp
  Agency/v8-agency.cpp
)

set(LIB_ARANGO_V8SERVER_SOURCES
  Cluster/v8-cluster.cpp
  Transaction/V8Context.cpp
  V8Server/FoxxFeature.cpp
  V8Server/V8Context.cpp
  V8Server/V8DealerFeature.cpp
  V8Server/v8-actions.cpp
  V8Server/v8-analyzers.cpp
  V8Server/v8-collection-util.cpp
  V8Server/v8-collection.cpp
  V8Server/v8-dispatcher.cpp
  V8Server/v8-general-graph.cpp
  V8Server/v8-query.cpp
  V8Server/v8-replication.cpp
  V8Server/v8-statistics.cpp
  V8Server/v8-ttl.cpp
  V8Server/v8-user-functions.cpp
  V8Server/v8-user-structures.cpp
  V8Server/v8-users.cpp
  V8Server/v8-util.cpp
  V8Server/v8-views.cpp
  V8Server/v8-vocbase.cpp
  V8Server/v8-voccursor.cpp
  V8Server/v8-vocindex.cpp
)

set(LIB_ARANGO_NETWORK_SOURCES
  Network/ClusterUtils.cpp
  Network/ConnectionPool.cpp
  Network/Methods.cpp
  Network/NetworkFeature.cpp
  Network/Utils.cpp
)

set(LIB_ARANGOSERVER_SOURCES
  Actions/ActionFeature.cpp
  Actions/RestActionHandler.cpp
  Actions/actions.cpp
  Auth/Common.cpp
  Auth/TokenCache.cpp
  Auth/User.cpp
  Auth/UserManager.cpp
  Cluster/Action.cpp
  Cluster/ActionBase.cpp
  Cluster/ActionDescription.cpp
  Cluster/AgencyCache.cpp
  Cluster/AgencyCallback.cpp
  Cluster/AgencyCallbackRegistry.cpp
  Cluster/ClusterCollectionCreationInfo.cpp
  Cluster/ClusterFeature.cpp
  Cluster/ClusterHelpers.cpp
  Cluster/ClusterInfo.cpp
  Cluster/ClusterRepairDistributeShardsLike.cpp
  Cluster/ClusterRepairOperations.cpp
  Cluster/ClusterTrxMethods.cpp
  Cluster/ClusterTypes.cpp
  Cluster/ClusterUpgradeFeature.cpp
  Cluster/CreateCollection.cpp
  Cluster/CreateDatabase.cpp
  Cluster/DBServerAgencySync.cpp
  Cluster/DropCollection.cpp
  Cluster/DropDatabase.cpp
  Cluster/DropIndex.cpp
  Cluster/EnsureIndex.cpp
  Cluster/FollowerInfo.cpp
  Cluster/HeartbeatThread.cpp
  Cluster/Maintenance.cpp
  Cluster/MaintenanceFeature.cpp
  Cluster/MaintenanceRestHandler.cpp
  Cluster/MaintenanceWorker.cpp
  Cluster/RebootTracker.cpp
  Cluster/ReplicationTimeoutFeature.cpp
  Cluster/ResignShardLeadership.cpp
  Cluster/RestAgencyCallbacksHandler.cpp
  Cluster/RestClusterHandler.cpp
  Cluster/ServerDefaults.cpp
  Cluster/ServerState.cpp
  Cluster/SynchronizeShard.cpp
  Cluster/TakeoverShardLeadership.cpp
  Cluster/UpdateCollection.cpp
  FeaturePhases/AgencyFeaturePhase.cpp
  FeaturePhases/AqlFeaturePhase.cpp
  FeaturePhases/BasicFeaturePhaseServer.cpp
  FeaturePhases/ClusterFeaturePhase.cpp
  FeaturePhases/DatabaseFeaturePhase.cpp
  FeaturePhases/FinalFeaturePhase.cpp
  FeaturePhases/FoxxFeaturePhase.cpp
  FeaturePhases/ServerFeaturePhase.cpp
  FeaturePhases/V8FeaturePhase.cpp
  GeneralServer/Acceptor.cpp
  GeneralServer/AcceptorTcp.cpp
  GeneralServer/AsyncJobManager.cpp
  GeneralServer/AuthenticationFeature.cpp
  GeneralServer/CommTask.cpp
  GeneralServer/GeneralCommTask.cpp
  GeneralServer/GeneralServer.cpp
  GeneralServer/GeneralServerFeature.cpp
  GeneralServer/H2CommTask.cpp
  GeneralServer/HttpCommTask.cpp
  GeneralServer/IoContext.cpp
  GeneralServer/RestHandler.cpp
  GeneralServer/RestHandlerFactory.cpp
  GeneralServer/ServerSecurityFeature.cpp
  GeneralServer/SslServerFeature.cpp
  GeneralServer/VstCommTask.cpp
  RestHandler/RestAdminClusterHandler.cpp
  RestHandler/RestAdminDatabaseHandler.cpp
  RestHandler/RestAdminExecuteHandler.cpp
  RestHandler/RestAdminLogHandler.cpp
  RestHandler/RestAdminRoutingHandler.cpp
  RestHandler/RestAdminServerHandler.cpp
  RestHandler/RestAdminStatisticsHandler.cpp
  RestHandler/RestAqlFunctionsHandler.cpp
  RestHandler/RestAqlUserFunctionsHandler.cpp
  RestHandler/RestAuthHandler.cpp
  RestHandler/RestAuthReloadHandler.cpp
  RestHandler/RestBaseHandler.cpp
  RestHandler/RestBatchHandler.cpp
  RestHandler/RestCompactHandler.cpp
  RestHandler/RestCursorHandler.cpp
  RestHandler/RestDatabaseHandler.cpp
  RestHandler/RestDebugHandler.cpp
  RestHandler/RestDocumentHandler.cpp
  RestHandler/RestEdgesHandler.cpp
  RestHandler/RestEndpointHandler.cpp
  RestHandler/RestEngineHandler.cpp
  RestHandler/RestExplainHandler.cpp
  RestHandler/RestImportHandler.cpp
  RestHandler/RestIndexHandler.cpp
  RestHandler/RestJobHandler.cpp
  RestHandler/RestPleaseUpgradeHandler.cpp
  RestHandler/RestQueryCacheHandler.cpp
  RestHandler/RestQueryHandler.cpp
  RestHandler/RestRedirectHandler.cpp
  RestHandler/RestRepairHandler.cpp
  RestHandler/RestShutdownHandler.cpp
  RestHandler/RestSimpleHandler.cpp
  RestHandler/RestSimpleQueryHandler.cpp
  RestHandler/RestStatusHandler.cpp
  RestHandler/RestSupervisionStateHandler.cpp
  RestHandler/RestSystemReportHandler.cpp
  RestHandler/RestTasksHandler.cpp
  RestHandler/RestTimeHandler.cpp
  RestHandler/RestTransactionHandler.cpp
  RestHandler/RestTtlHandler.cpp
  RestHandler/RestUploadHandler.cpp
  RestHandler/RestUsersHandler.cpp
  RestHandler/RestVersionHandler.cpp
  RestHandler/RestViewHandler.cpp
  RestHandler/RestVocbaseBaseHandler.cpp
  RestHandler/RestWalAccessHandler.cpp
  RestServer/AqlFeature.cpp
  RestServer/BootstrapFeature.cpp
  RestServer/CheckVersionFeature.cpp
  RestServer/ConsoleFeature.cpp
  RestServer/ConsoleThread.cpp
  RestServer/DatabaseFeature.cpp
  RestServer/DatabasePathFeature.cpp
  RestServer/EndpointFeature.cpp
  RestServer/FileDescriptorsFeature.cpp
  RestServer/FlushFeature.cpp
  RestServer/FortuneFeature.cpp
  RestServer/FrontendFeature.cpp
  RestServer/InitDatabaseFeature.cpp
  RestServer/LanguageCheckFeature.cpp
  RestServer/LockfileFeature.cpp
  RestServer/QueryRegistryFeature.cpp
  RestServer/ScriptFeature.cpp
  RestServer/ServerFeature.cpp
  RestServer/ServerIdFeature.cpp
  RestServer/SoftShutdownFeature.cpp
  RestServer/SystemDatabaseFeature.cpp
  RestServer/TtlFeature.cpp
  RestServer/UpgradeFeature.cpp
  RestServer/ViewTypesFeature.cpp
  RestServer/VocbaseContext.cpp
  Scheduler/Scheduler.cpp
  Scheduler/SchedulerFeature.cpp
  Scheduler/SupervisedScheduler.cpp
  Sharding/ShardDistributionReporter.cpp
  Sharding/ShardingFeature.cpp
  Sharding/ShardingInfo.cpp
  Sharding/ShardingStrategy.cpp
  Sharding/ShardingStrategyDefault.cpp
  Statistics/ConnectionStatistics.cpp
  Statistics/Descriptions.cpp
  Statistics/RequestStatistics.cpp
  Statistics/ServerStatistics.cpp
  Statistics/StatisticsFeature.cpp
  Statistics/StatisticsWorker.cpp
  Transaction/ClusterUtils.cpp
  Transaction/Context.cpp
  Transaction/CountCache.cpp
  Transaction/Helpers.cpp
  Transaction/Manager.cpp
  Transaction/ManagerFeature.cpp
  Transaction/Methods.cpp
  Transaction/Options.cpp
  Transaction/SmartContext.cpp
  Transaction/StandaloneContext.cpp
  Transaction/Status.cpp
)

set(LIB_ARANGO_COMMON_REST_HANDLER_SOURCES
  RestHandler/RestCollectionHandler.cpp
  RestHandler/RestReplicationHandler.cpp
)

set(LIB_ARANGO_CLUSTER_METHODS_SOURCES
  Cluster/ClusterMethods.cpp
  Cluster/ClusterTtlMethods.cpp
)

if (USE_MAINTAINER_MODE)
  set(LIB_ARANGOSERVER_SOURCES ${LIB_ARANGOSERVER_SOURCES} RestHandler/RestTestHandler.cpp)
endif()

if (NOT MSVC)
  set(LIB_ARANGOSERVER_SOURCES ${LIB_ARANGOSERVER_SOURCES} GeneralServer/AcceptorUnixDomain.cpp)
endif()

include(ClusterEngine/CMakeLists.txt)
include(RocksDBEngine/CMakeLists.txt)

add_library(arango_graph STATIC
  ${LIB_ARANGO_GRAPH_SOURCES}
  ${ADDITIONAL_LIB_ARANGO_GRAPH_SOURCES}
)

add_library(arango_pregel STATIC
  ${LIB_ARANGO_PREGEL_SOURCES}
  ${LIB_ARANGO_PREGEL_AIR_SOURCES}
)

add_library(arango_aql STATIC
  ${LIB_ARANGO_AQL_SOURCES}
  ${ADDITIONAL_LIB_ARANGO_AQL_SOURCES}
)

add_library(arango_health STATIC
  ${LIB_ARANGO_HEALTH_SOURCES}
)

add_library(arango_vocbase STATIC
  ${LIB_ARANGO_VOCBASE_SOURCES}
  ${ADDITIONAL_LIB_ARANGO_VOCBASE_SOURCES}
)

add_library(arango_v8server STATIC
  ${LIB_ARANGO_V8SERVER_SOURCES}
)

add_library(arango_utils STATIC
  ${LIB_ARANGO_UTILS_SOURCES}
)

add_library(arango_storage_engine STATIC
  ${LIB_ARANGO_STORAGE_ENGINE_SOURCES}
)

# arango_storage_engine uses arango_rocksdb.
# In turn, arango_storage_engine_common provides something for both.
add_library(arango_storage_engine_common STATIC
  ${LIB_ARANGO_STORAGE_ENGINE_COMMON_SOURCES}
)

add_library(arango_indexes STATIC
  ${LIB_ARANGO_INDEXES_SOURCES}
)

add_library(arango_cache STATIC
  ${LIB_ARANGO_CACHE_SOURCES}
)

add_library(arango_replication STATIC
  ${LIB_ARANGO_REPLICATION_SOURCES}
)

add_library(arango_metrics STATIC
  ${LIB_ARANGO_METRICS_SOURCES}
)

add_library(arango_agency STATIC
  ${LIB_ARANGO_AGENCY_SOURCES}
)

add_library(arangoserver STATIC
  ${LIB_ARANGOSERVER_SOURCES}
  ${ADDITIONAL_LIB_ARANGOSERVER_SOURCES}
)

add_library(arango_network STATIC
  ${LIB_ARANGO_NETWORK_SOURCES}
)

add_library(arango_rocksdb STATIC
  ${ROCKSDB_SOURCES}
  ${ADDITIONAL_LIB_ARANGO_ROCKSDB_SOURCES}
)

add_dependencies(arango_rocksdb snappy-static)

set(SNAPPY_INCLUDE_DIR "${SNAPPY_SOURCE_DIR};${SNAPPY_BUILD_DIR}" CACHE PATH "relation to snappy")
target_include_directories(arango_rocksdb PUBLIC ${SNAPPY_INCLUDE_DIR})

if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)
  target_compile_options(arango_rocksdb PUBLIC "-maes")
endif ()

add_library(arango_cluster_engine STATIC
  ${CLUSTER_ENGINE_SOURCES}
)

add_library(arango_common_rest_handler STATIC
  ${LIB_ARANGO_COMMON_REST_HANDLER_SOURCES}
)

add_library(arango_cluster_methods STATIC
  ${LIB_ARANGO_CLUSTER_METHODS_SOURCES}
  ${ADDITIONAL_LIB_ARANGO_CLUSTER_METHODS_SOURCES}
)

add_library(llhttp STATIC
  ${LLHTTP_SOURCES}
)

target_include_directories(llhttp PUBLIC "${PROJECT_SOURCE_DIR}/3rdParty/llhttp/include")

# Note that arango_geo publicly exports the /J compile option for MSVC, because
# s2 requires /J to be set on Windows.
# /J makes char unsigned.
# Thus all libraries depending on arango_geo will be compiled with /J (and need
# to, if they include s2 headers).
# I think it would safer to compile everything with /J, so we would not get a
# mixture of signed and unsigned char interpretations in the same binary.
# However, just setting
#   add_compile_options(/J)
# does not work, either, because
# C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\atldef.h(94): fatal error C1189: #error:  ATL does not support compilation with /J or _CHAR_UNSIGNED flag enabled [C:\vm04-windows\oskar\work\ArangoDB\build\lib\arango.vcxproj]
# .

target_link_libraries(arango_agency arango)
target_link_libraries(arango_agency arango_health)
target_link_libraries(arango_agency arango_iresearch)
target_link_libraries(arango_agency arango_metrics)

target_link_libraries(arango_aql arango_geo)
target_link_libraries(arango_aql arango_graph)
target_link_libraries(arango_aql arango_indexes)
target_link_libraries(arango_aql arango_iresearch)
target_link_libraries(arango_aql arango_network)
target_link_libraries(arango_aql immer)

target_link_libraries(arango_cache arango)
target_link_libraries(arango_cache boost_system)
target_link_libraries(arango_cache arango::validation)

target_link_libraries(arango_cluster_engine arango_health)
target_link_libraries(arango_cluster_engine arango_indexes)
target_link_libraries(arango_cluster_engine boost_boost)

target_include_directories(arango_cluster_engine
    PUBLIC ${IRESEARCH_INCLUDE}
)

target_link_libraries(arango_cluster_methods arango)
target_link_libraries(arango_cluster_methods arango_network)

target_link_libraries(arango_common_rest_handler arango_cluster_methods)
target_link_libraries(arango_common_rest_handler arango_utils)
target_link_libraries(arango_common_rest_handler arango_iresearch)

target_link_libraries(arango_graph arango)
target_link_libraries(arango_graph arango_aql)
target_link_libraries(arango_graph arango_cache)
target_link_libraries(arango_graph arango_vocbase)
target_link_libraries(arango_graph boost_boost)

target_link_libraries(arango_indexes arango_geo)
target_link_libraries(arango_indexes boost_boost)
target_link_libraries(arango_indexes arango::validation)

target_link_libraries(arango_iresearch arango_indexes)
target_link_libraries(arango_iresearch arango_cluster_engine)

target_link_libraries(arango_metrics arango)
target_link_libraries(arango_metrics arango::validation)

target_link_libraries(arango_network boost_boost)
target_link_libraries(arango_network fuerte)
target_link_libraries(arango_network llhttp)
target_link_libraries(arango_network nghttp2)
target_link_libraries(arango_network arango::validation)

target_link_libraries(arango_pregel arango)
target_link_libraries(arango_pregel arango_agency)
target_link_libraries(arango_pregel arango_greenspun)
target_link_libraries(arango_pregel boost_boost)
target_link_libraries(arango_pregel boost_system)

target_link_libraries(arango_replication arango_storage_engine)
target_link_libraries(arango_replication arango_utils)
target_link_libraries(arango_replication arango_vocbase)

target_link_libraries(arango_rocksdb ${ROCKSDB_LIBS})
target_link_libraries(arango_rocksdb arango_cache)
target_link_libraries(arango_rocksdb arango_common_rest_handler)
target_link_libraries(arango_rocksdb arango_geo)
target_link_libraries(arango_rocksdb arango_health)
target_link_libraries(arango_rocksdb arango_indexes)
target_link_libraries(arango_rocksdb arango_storage_engine_common)
target_link_libraries(arango_rocksdb boost_boost)
target_link_libraries(arango_rocksdb arango::validation)
target_link_libraries(arango_storage_engine_common arango::validation)

if (USE_ENTERPRISE)
  # this is required for hotbackup. Views need to be flushed.
  target_include_directories(arango_rocksdb
    PUBLIC ${IRESEARCH_INCLUDE}
  )
endif()

target_link_libraries(arango_storage_engine arango_cluster_engine)
target_link_libraries(arango_storage_engine arango_cluster_methods)
target_link_libraries(arango_storage_engine arango_rocksdb)
target_link_libraries(arango_storage_engine arango::validation)

target_link_libraries(arango_utils boost_boost)
target_link_libraries(arango_utils arango::validation)

target_link_libraries(arango_v8server arango_agency)
target_link_libraries(arango_v8server arango_iresearch)
target_link_libraries(arango_v8server arango_replication)
target_link_libraries(arango_v8server arango_v8)
target_link_libraries(arango_v8server arango_v8_no_deadline)
target_link_libraries(arango_v8server ${V8_LIBS})

target_link_libraries(arango_vocbase arango_agency)
target_link_libraries(arango_vocbase arango_cluster_methods)
target_link_libraries(arango_vocbase arango_indexes)
target_link_libraries(arango_vocbase arango_replication)
target_link_libraries(arango_vocbase boost_system)
target_link_libraries(arango_vocbase arango::validation)

target_link_libraries(arangoserver arango_agency)
target_link_libraries(arangoserver arango_aql)
target_link_libraries(arangoserver arango_cluster_engine)
target_link_libraries(arangoserver arango_cluster_methods)
target_link_libraries(arangoserver arango_common_rest_handler)
target_link_libraries(arangoserver arango_geo)
target_link_libraries(arangoserver arango_graph)
target_link_libraries(arangoserver arango_indexes)
target_link_libraries(arangoserver arango_iresearch)
target_link_libraries(arangoserver arango_metrics)
target_link_libraries(arangoserver arango_network)
target_link_libraries(arangoserver arango_pregel)
target_link_libraries(arangoserver arango_replication)
target_link_libraries(arangoserver arango_storage_engine)
target_link_libraries(arangoserver arango_utils)
target_link_libraries(arangoserver arango_v8server)
target_link_libraries(arangoserver arango_vocbase)
target_link_libraries(arangoserver boost_boost)

target_link_libraries(arangoserver
  ${LINENOISE_LIBS} # Is this ever anything but empty?
  ${MSVC_LIBS}
)

if (MSVC)
  target_link_libraries(arangoserver Bcrypt.lib)
endif()

if (USE_ENTERPRISE)
  add_library(arango_rclone STATIC
    ${LIB_RCLONE_SOURCES}
  )

  target_link_libraries(arango_rclone arango)

  target_link_libraries(arango_rocksdb arango_rclone)
endif()

if (USE_ENTERPRISE)
  add_definitions(-DUSE_ENTERPRISE=1)

  if (MSVC)
    target_link_libraries(arangoserver
      Wldap32.lib
    )
  else()
    target_link_libraries(arangoserver
      ${LDAP_LIB}
      ${LBER_LIB}
      ${OPENSSL_LIBRARIES}
    )
  endif()
endif()

add_executable(${BIN_ARANGOD}
  RestServer/arangod.cpp
  ${ProductVersionFiles}
)

target_link_libraries(${BIN_ARANGOD}
  arangoserver
)

target_compile_features(${BIN_ARANGOD} PRIVATE cxx_constexpr)

install(
  TARGETS ${BIN_ARANGOD}
  RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}
)

install_config(arangod)

if (NOT USE_PRECOMPILED_V8)
  add_dependencies(arangod zlibstatic v8_build arango_iresearch)
else ()
  add_dependencies(arangod zlibstatic arango_iresearch)
endif ()

if (USE_JEMALLOC)
  add_dependencies(arangod jemalloc_build)
endif ()

foreach(TARGET
  arango_agency
  arango_aql
  arango_cache
  arango_cluster_engine
  arango_cluster_methods
  arango_common_rest_handler
  arango_graph
  arango_health
  arango_indexes
  arango_metrics
  arango_pregel
  arango_replication
  arango_rocksdb
  arango_storage_engine
  arango_storage_engine_common
  arango_utils
  arango_v8server
  arango_vocbase
  arangod
  arangoserver
)
  target_include_directories(${TARGET} PUBLIC "${PROJECT_SOURCE_DIR}/${ENTERPRISE_INCLUDE_DIR}")

  if (USE_FAIL_ON_WARNINGS)
    if (MSVC)
      target_compile_options(${TARGET} PRIVATE /WX /D_WINSOCK_DEPRECATED_NO_WARNINGS)
    else ()
      target_compile_options(${TARGET} PRIVATE -Werror -Wno-error=deprecated-declarations)
    endif ()
  endif ()
endforeach()

################################################################################
## arango-secure-installation
################################################################################

install_command_alias(${BIN_ARANGOD}
  ${CMAKE_INSTALL_SBINDIR}
  arango-secure-installation
)

install_config(arango-secure-installation)

################################################################################
## arango-init-database
################################################################################

install_command_alias(${BIN_ARANGOD}
  ${CMAKE_INSTALL_SBINDIR}
  arango-init-database
)

install_config(arango-init-database)
