# -*- mode: python -*-

Import("env")

env.Library(
    target='bgsync',
    source=[
        'bgsync.cpp',
    ],
    LIBDEPS=[
        'data_replicator_external_state_impl',
        'oplog_interface_local',
        'repl_coordinator_interface',
        'rollback_source_impl',
        'rs_rollback',
        'storage_interface',
        'sync_source_resolver',
        '$BUILD_DIR/mongo/client/connection_pool',
        '$BUILD_DIR/mongo/client/fetcher',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_global',
        '$BUILD_DIR/mongo/db/commands/server_status_core',
        '$BUILD_DIR/mongo/db/concurrency/write_conflict_exception',
        '$BUILD_DIR/mongo/db/service_context',
        '$BUILD_DIR/mongo/executor/network_interface_factory',
        '$BUILD_DIR/mongo/executor/task_executor_interface',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor',
        '$BUILD_DIR/mongo/db/repl/repl_coordinator_global',
        '$BUILD_DIR/mongo/util/concurrency/thread_pool',
        '$BUILD_DIR/mongo/util/fail_point',
    ],
    LIBDEPS_TAGS=[
        # Depends on files from serverOnlyFiles
        'incomplete',
    ],
)

env.Library(
    target='repl_settings',
    source=[
        'repl_settings.cpp',
        'repl_settings_init.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/server_parameters'
    ])

env.Library('rslog',
            'rslog.cpp',
            LIBDEPS=[
                '$BUILD_DIR/mongo/base',
            ])

env.Library(
    target='storage_interface',
    source=[
        'storage_interface.cpp',
    ],
    LIBDEPS=[
        'optime',
        '$BUILD_DIR/mongo/db/service_context',
        '$BUILD_DIR/mongo/util/decorable',
    ],
)

env.Library(
    target='storage_interface_impl',
    source=[
        'storage_interface_impl.cpp',
        'collection_bulk_loader_impl.cpp',
    ],
    LIBDEPS=[
        'storage_interface',
        '$BUILD_DIR/mongo/db/common',
        '$BUILD_DIR/mongo/db/query/internal_plans',
        '$BUILD_DIR/mongo/db/serveronly', # For OperationContextImpl
    ],
)

env.CppUnitTest(
    target='storage_interface_impl_test',
    source=[
        'storage_interface_impl_test.cpp',
    ],
    LIBDEPS=[
        'oplog_interface_local',
        'replmocks',
        'storage_interface_impl',
        '$BUILD_DIR/mongo/db/service_context_d_test_fixture',
    ],
)

env.Library(
    target='replication_executor',
    source=[
        'replication_executor.cpp',
        'scatter_gather_algorithm.cpp',
        'scatter_gather_runner.cpp',
    ],
    LIBDEPS=[
        'database_task',
        'task_runner',
        '$BUILD_DIR/mongo/executor/network_interface',
        '$BUILD_DIR/mongo/executor/task_executor_interface',
        '$BUILD_DIR/mongo/util/net/hostandport',
    ],
)

env.Library(
    target='replication_executor_test_fixture',
    source=[
        'replication_executor_test_fixture.cpp',
    ],
    LIBDEPS=[
        'replication_executor',
        'replmocks',
        'service_context_repl_mock_init',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/executor/task_executor_test_fixture',
    ],
)

env.CppUnitTest(
    target='replication_executor_test',
    source=[
        'replication_executor_test.cpp',
    ],
    LIBDEPS=[
        'replication_executor_test_fixture',
        '$BUILD_DIR/mongo/db/bson/dotted_path_support',
        '$BUILD_DIR/mongo/unittest/concurrency',
    ],
)

env.Library(
    target='oplog_buffer_blocking_queue',
    source=[
        'oplog_buffer_blocking_queue.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
    ],
)

env.Library(
    target='oplog_buffer_collection',
    source=[
        'oplog_buffer_collection.cpp',
    ],
    LIBDEPS=[
        'storage_interface',
        '$BUILD_DIR/mongo/db/catalog/collection_options',
        '$BUILD_DIR/mongo/db/db_raii',
        '$BUILD_DIR/mongo/db/dbdirectclient',
        '$BUILD_DIR/mongo/db/service_context',
    ],
)

env.Library(
    target='oplog_buffer_proxy',
    source=[
        'oplog_buffer_proxy.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
    ],
)

env.CppUnitTest(
    target='oplog_buffer_collection_test',
    source=[
        'oplog_buffer_collection_test.cpp',
    ],
    LIBDEPS=[
        'oplog_buffer_collection',
        'oplog_interface_local',
        'replmocks',
        'storage_interface_impl',
        '$BUILD_DIR/mongo/db/service_context_d_test_fixture',
        '$BUILD_DIR/mongo/unittest/concurrency',
    ],
    NO_CRUTCH = True,
)

env.CppUnitTest(
    target='oplog_buffer_proxy_test',
    source=[
        'oplog_buffer_proxy_test.cpp',
    ],
    LIBDEPS=[
        'oplog_buffer_proxy',
    ],
)

env.Library(
    target='oplog_interface_local',
    source=[
        'oplog_interface_local.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/query/internal_plans',
        '$BUILD_DIR/mongo/db/query/query',
    ],
    LIBDEPS_TAGS=[
        # Depends on OldClientContext from db/serveronly
        # Circular with catalog via db_raii
        'incomplete',
    ],
)

env.Library(
    target='oplog_interface_mock',
    source=[
        'oplog_interface_mock.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
    ],
)

env.Library(
    target='oplog_interface_remote',
    source=[
        'oplog_interface_remote.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/client/clientdriver',
    ],
)

env.Library(
    target='rs_rollback',
    source=[
        'rs_rollback.cpp',
    ],
    LIBDEPS=[
        'roll_back_local_operations',
        #'$BUILD_DIR/mongo/db/s/sharding', # CYCLE
    ],
    LIBDEPS_TAGS=[
        # Depends on files in serverOnlyFiles, and has other unresolved symbols.
        'incomplete',
    ]
)

env.Library(
    target="isself",
    source=[
        'isself.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/client/clientdriver',
        '$BUILD_DIR/mongo/db/auth/authcore',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_global',
        '$BUILD_DIR/mongo/util/net/hostandport',
        '$BUILD_DIR/mongo/util/net/network',
    ],
)

env.CppUnitTest(
    target='rs_rollback_test',
    source=[
        'rs_rollback_test.cpp',
    ],
    LIBDEPS=[
        'oplog_interface_local',
        'oplog_interface_mock',
        'replmocks',
        'rs_rollback',
        '$BUILD_DIR/mongo/db/service_context_d_test_fixture',
    ],
)

env.Library(
    target='rollback_source_impl',
    source=[
        'rollback_source_impl.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/client/clientdriver',
        'oplog_interface_remote',
    ],
    LIBDEPS_TAGS=[
        # Depends on Cloner from db/serveronly
        'incomplete'
    ],

)

env.Library(
    target='oplog_entry',
    source=[
            'oplog_entry.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        'optime'
    ],
)

env.Library(
    target='sync_tail',
    source=[
        'sync_tail.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/auth/authorization_manager_global',
        '$BUILD_DIR/mongo/db/commands/server_status_core',
        '$BUILD_DIR/mongo/db/concurrency/lock_manager',
        '$BUILD_DIR/mongo/db/concurrency/write_conflict_exception',
        '$BUILD_DIR/mongo/db/curop',
        '$BUILD_DIR/mongo/db/stats/timer_stats',
        '$BUILD_DIR/mongo/db/storage/storage_options',
        '$BUILD_DIR/mongo/util/concurrency/thread_pool',
        '$BUILD_DIR/mongo/util/net/network',
        'oplog_entry',
        'repl_coordinator_global',
        'storage_interface',
    ],
    LIBDEPS_TAGS=[
        # Many undefined symbols in sync_tail.cpp
        'incomplete'
    ]
)

env.CppUnitTest(
    target='sync_tail_test',
    source=[
        'sync_tail_test.cpp',
    ],
    LIBDEPS=[
        'oplog_buffer_blocking_queue',
        'oplog_interface_local',
        'replmocks',
        'sync_tail',
        '$BUILD_DIR/mongo/db/service_context_d_test_fixture',
    ],
)

env.Library('topology_coordinator',
            [
                'heartbeat_response_action.cpp',
                'topology_coordinator.cpp',
            ],
            LIBDEPS=[
                'repl_coordinator_interface',
                '$BUILD_DIR/mongo/rpc/metadata',
            ])

env.Library('topology_coordinator_impl',
            [
                'member_heartbeat_data.cpp',
                'topology_coordinator_impl.cpp',
            ],
            LIBDEPS=[
                '$BUILD_DIR/mongo/db/audit',
                'replication_executor',
                'replica_set_messages',
                'repl_settings',
                'rslog',
                'topology_coordinator',
                '$BUILD_DIR/mongo/util/fail_point',
            ])

env.CppUnitTest('repl_set_heartbeat_response_test',
                'repl_set_heartbeat_response_test.cpp',
                LIBDEPS=['replica_set_messages'])

env.CppUnitTest(
    target='topology_coordinator_impl_test',
    source=[
        'topology_coordinator_impl_test.cpp',
    ],
    LIBDEPS=[
        'topology_coordinator_impl',
        'replica_set_messages',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
    ],
)

env.CppUnitTest(
    target='topology_coordinator_impl_v1_test',
    source=[
        'topology_coordinator_impl_v1_test.cpp',
    ],
    LIBDEPS=[
        'topology_coordinator_impl',
        'replica_set_messages',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
    ],
)

env.Library('repl_coordinator_impl',
            [
                'check_quorum_for_config_change.cpp',
                'elect_cmd_runner.cpp',
                'freshness_checker.cpp',
                'repl_client_info.cpp',
                'repl_set_config_checks.cpp',
                'replication_coordinator_impl.cpp',
                'replication_coordinator_impl_elect.cpp',
                'replication_coordinator_impl_elect_v1.cpp',
                'replication_coordinator_impl_heartbeat.cpp',
                'vote_requester.cpp',
            ],
            LIBDEPS=[
                     '$BUILD_DIR/mongo/db/common',
                     '$BUILD_DIR/mongo/db/global_timestamp',
                     '$BUILD_DIR/mongo/db/index/index_descriptor',
                     '$BUILD_DIR/mongo/db/server_options_core',
                     '$BUILD_DIR/mongo/db/service_context',
                     '$BUILD_DIR/mongo/rpc/command_status',
                     '$BUILD_DIR/mongo/rpc/metadata',
                     '$BUILD_DIR/mongo/transport/transport_layer_common',
                     '$BUILD_DIR/mongo/util/fail_point',
                     'collection_cloner',
                     'initial_syncer',
                     'data_replicator_external_state_initial_sync',
                     'repl_coordinator_global',
                     'repl_coordinator_interface',
                     'repl_settings',
                     'replica_set_messages',
                     'replication_executor',
                     'reporter',
                     'rslog',
                     'topology_coordinator',
                 ])

env.Library(
    target='repl_coordinator_test_fixture',
    source=[
        'replication_coordinator_test_fixture.cpp',
    ],
    LIBDEPS=[
        'repl_coordinator_impl',
        'replmocks',
        'service_context_repl_mock_init',
        'topology_coordinator_impl',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/unittest/unittest',
    ],
)

env.CppUnitTest(
    target='replication_coordinator_impl_test',
    source=[
        'replication_coordinator_impl_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/unittest/concurrency',
        'repl_coordinator_test_fixture',
    ],
)

env.CppUnitTest(
    target='repl_set_config_checks_test',
    source=[
        'repl_set_config_checks_test.cpp',
    ],
    LIBDEPS=[
        'repl_coordinator_impl',
        'replmocks',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
    ],
)

env.CppUnitTest(
    target='scatter_gather_test',
    source=[
        'scatter_gather_test.cpp',
    ],
    LIBDEPS=[
        'repl_coordinator_impl',
        'replmocks',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
    ],
)

env.CppUnitTest(
    target='check_quorum_for_config_change_test',
    source=[
        'check_quorum_for_config_change_test.cpp',
    ],
    LIBDEPS=[
        'repl_coordinator_impl',
        'replication_executor',
        'replmocks',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
    ],
)

env.CppUnitTest(
    target='freshness_checker_test',
    source=[
        'freshness_checker_test.cpp',
    ],
    LIBDEPS=[
        'repl_coordinator_impl',
        'replica_set_messages',
        'replmocks',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
    ],
)

env.CppUnitTest(
    target='vote_requester_test',
    source=[
        'vote_requester_test.cpp',
    ],
    LIBDEPS=[
        'repl_coordinator_impl',
        'replica_set_messages',
        'replmocks',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
    ],
)


env.CppUnitTest(
    target='elect_cmd_runner_test',
    source=[
        'elect_cmd_runner_test.cpp',
    ],
    LIBDEPS=[
        'repl_coordinator_impl',
        'replica_set_messages',
        'replmocks',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
    ],
)

env.CppUnitTest('replication_coordinator_impl_elect_test',
                'replication_coordinator_impl_elect_test.cpp',
                LIBDEPS=[
                    'repl_coordinator_test_fixture',
                ])

env.CppUnitTest('replication_coordinator_impl_elect_v1_test',
                'replication_coordinator_impl_elect_v1_test.cpp',
                LIBDEPS=['repl_coordinator_test_fixture'])

env.CppUnitTest('replication_coordinator_impl_heartbeat_v1_test',
                'replication_coordinator_impl_heartbeat_v1_test.cpp',
                LIBDEPS=['repl_coordinator_test_fixture'])

env.CppUnitTest('replication_coordinator_impl_heartbeat_test',
                'replication_coordinator_impl_heartbeat_test.cpp',
                LIBDEPS=['repl_coordinator_test_fixture'])

env.CppUnitTest('replication_coordinator_impl_reconfig_test',
                'replication_coordinator_impl_reconfig_test.cpp',
                LIBDEPS=['repl_coordinator_test_fixture'])

env.Library('repl_coordinator_interface',
            ['replication_coordinator.cpp',
             'replication_coordinator_external_state.cpp'],
            LIBDEPS=[
                '$BUILD_DIR/mongo/db/service_context',
                '$BUILD_DIR/mongo/util/net/hostandport',
                'optime',
            ])

env.Library('repl_coordinator_global',
            'replication_coordinator_global.cpp',
            LIBDEPS=['repl_coordinator_interface'])

env.Library(
    target='replmocks',
    source=[
        'replication_coordinator_external_state_mock.cpp',
        'replication_coordinator_mock.cpp',
        'service_context_repl_mock.cpp',
        'storage_interface_mock.cpp',
    ],
    LIBDEPS=[
        'oplog_buffer_blocking_queue',
        'repl_coordinator_interface',
        'repl_settings',
        'replica_set_messages',
        'replication_executor',
        'storage_interface',
        '$BUILD_DIR/mongo/db/concurrency/lock_manager',
        '$BUILD_DIR/mongo/db/service_context',
        '$BUILD_DIR/mongo/executor/network_interface_mock',
    ],
)

env.Library(
    target='service_context_repl_mock_init',
    source=[
        'service_context_repl_mock_init.cpp',
    ],
    LIBDEPS=[
        'replmocks',
        '$BUILD_DIR/mongo/util/clock_source_mock',
    ],
)

env.Library('read_concern_args',
            [
                'read_concern_args.cpp'
            ],
            LIBDEPS=[
                '$BUILD_DIR/mongo/base',
                '$BUILD_DIR/mongo/bson/util/bson_extract',
                'optime',
            ])

env.Library('replica_set_messages',
            [
                'handshake_args.cpp',
                'is_master_response.cpp',
                'member_config.cpp',
                'old_update_position_args.cpp',
                'repl_set_config.cpp',
                'repl_set_heartbeat_args.cpp',
                'repl_set_heartbeat_args_v1.cpp',
                'repl_set_heartbeat_response.cpp',
                'repl_set_html_summary.cpp',
                'repl_set_request_votes_args.cpp',
                'repl_set_tag.cpp',
                'update_position_args.cpp',
                'last_vote.cpp',
            ],
            LIBDEPS=[
                '$BUILD_DIR/mongo/base',
                '$BUILD_DIR/mongo/bson/util/bson_extract',
                '$BUILD_DIR/mongo/client/connection_string',
                '$BUILD_DIR/mongo/db/common',
                '$BUILD_DIR/mongo/db/server_options_core',
                '$BUILD_DIR/mongo/transport/transport_layer_common',
                '$BUILD_DIR/mongo/util/net/hostandport',
                'optime',
                'read_concern_args',
            ])

env.CppUnitTest('repl_set_config_test',
                [
                    'member_config_test.cpp',
                    'repl_set_config_test.cpp',
                    'repl_set_tag_test.cpp',
                ],
                LIBDEPS=[
                    '$BUILD_DIR/mongo/bson/mutable/mutable_bson',
                    'replica_set_messages',
                ])

env.CppUnitTest('isself_test',
                [
                    'isself_test.cpp',
                ],
                LIBDEPS=[
                    '$BUILD_DIR/mongo/db/serveronly',
                ],
                )

env.Library(
    target='repl_set_commands',
    source=[
        'repl_set_commands.cpp',
        'repl_set_command.cpp',
        'repl_set_request_votes.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/commands',
        '$BUILD_DIR/mongo/db/concurrency/lock_manager',
        '$BUILD_DIR/mongo/db/lasterror',
        '$BUILD_DIR/mongo/db/repl/repl_coordinator_global',
        '$BUILD_DIR/mongo/db/storage/storage_options',
        'repl_settings',
        'replica_set_messages',
        'replication_executor',
    ],
    LIBDEPS_TAGS=[
        # Depends on files in serverOnlyFiles
        'incomplete',
    ],
)

env.Library(
    target='oplog_fetcher',
    source=[
        'oplog_fetcher.cpp',
    ],
    LIBDEPS=[
        'repl_coordinator_interface',
        'replica_set_messages',
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/client/fetcher',
        '$BUILD_DIR/mongo/db/commands/server_status_core',
        '$BUILD_DIR/mongo/db/namespace_string',
        '$BUILD_DIR/mongo/db/stats/counters',
        '$BUILD_DIR/mongo/db/stats/timer_stats',
        '$BUILD_DIR/mongo/executor/task_executor_interface',
    ],
)

env.CppUnitTest(
    target='oplog_fetcher_test',
    source='oplog_fetcher_test.cpp',
    LIBDEPS=[
        'oplog_fetcher',
        'data_replicator_external_state_mock',
        '$BUILD_DIR/mongo/unittest/task_executor_proxy',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
    ],
)

env.Library(
    target='reporter',
    source=[
        'reporter.cpp',
    ],
    LIBDEPS=[
        'replica_set_messages',
        'replication_executor',
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/namespace_string',
        '$BUILD_DIR/mongo/rpc/command_status',
    ],
)

env.CppUnitTest(
    target='reporter_test',
    source='reporter_test.cpp',
    LIBDEPS=[
        'reporter',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
        '$BUILD_DIR/mongo/unittest/task_executor_proxy',
    ],
)

env.Library(
    target='sync_source_resolver',
    source=[
        'sync_source_resolver.cpp',
    ],
    LIBDEPS=[
        'oplog_entry',
        'optime',
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/client/fetcher',
        '$BUILD_DIR/mongo/db/namespace_string',
        '$BUILD_DIR/mongo/executor/task_executor_interface',
		'$BUILD_DIR/mongo/rpc/metadata',
        '$BUILD_DIR/mongo/util/net/hostandport',
    ],
)

env.Library(
    target='sync_source_selector_mock',
    source=[
        'sync_source_selector_mock.cpp',
    ],
    LIBDEPS=[
        'optime',
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/rpc/metadata',
        '$BUILD_DIR/mongo/util/net/hostandport',
    ],
)

env.CppUnitTest(
    target='sync_source_resolver_test',
    source='sync_source_resolver_test.cpp',
    LIBDEPS=[
        'sync_source_resolver',
        'sync_source_selector_mock',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
        '$BUILD_DIR/mongo/unittest/task_executor_proxy',
    ],
)

env.Library(
    target='base_cloner_test_fixture',
    source=[
        'base_cloner_test_fixture.cpp',
    ],
    LIBDEPS=[
        'replmocks',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
    ],
)

env.Library(
    target='initial_sync_common',
    source=[
        'initial_sync_common.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/fail_point',
    ],
)

env.Library(
    target='collection_cloner',
    source=[
        'collection_cloner.cpp',
    ],
    LIBDEPS=[
        'initial_sync_common',
        'task_runner',
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/client/fetcher',
        '$BUILD_DIR/mongo/client/remote_command_retry_scheduler',
        '$BUILD_DIR/mongo/db/catalog/collection_options',
        '$BUILD_DIR/mongo/db/catalog/document_validation',
        '$BUILD_DIR/mongo/executor/task_executor_interface',
        '$BUILD_DIR/mongo/rpc/command_status',
        '$BUILD_DIR/mongo/util/progress_meter',
    ],
)

env.CppUnitTest(
    target='collection_cloner_test',
    source='collection_cloner_test.cpp',
    LIBDEPS=[
        'collection_cloner',
        'base_cloner_test_fixture',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
        '$BUILD_DIR/mongo/unittest/task_executor_proxy',
    ],
)

env.Library(
    target='database_cloner',
    source=[
        'database_cloner.cpp',
    ],
    LIBDEPS=[
        'collection_cloner',
        '$BUILD_DIR/mongo/db/commands/list_collections_filter',
        '$BUILD_DIR/mongo/executor/task_executor_interface',
    ],
)

env.CppUnitTest(
    target='database_cloner_test',
    source='database_cloner_test.cpp',
    LIBDEPS=[
        'database_cloner',
        'base_cloner_test_fixture',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
        '$BUILD_DIR/mongo/unittest/task_executor_proxy',
    ],
)

env.Library(
    target='databases_cloner',
    source=[
        'databases_cloner.cpp',
    ],
    LIBDEPS=[
        'database_cloner',
        '$BUILD_DIR/mongo/db/service_context',
    ],
)

env.CppUnitTest(
    target='databases_cloner_test',
    source='databases_cloner_test.cpp',
    LIBDEPS=[
        'databases_cloner',
        'oplog_entry',
        'replmocks',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/service_context_noop_init',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
        '$BUILD_DIR/mongo/unittest/task_executor_proxy',
    ],
)

env.Library(
    target='task_runner',
    source=[
        'task_runner.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/auth/authcore',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_global',
        '$BUILD_DIR/mongo/util/concurrency/thread_pool',
    ],
)

env.Library(
    target='task_runner_test_fixture',
    source=[
        'task_runner_test_fixture.cpp',
    ],
    LIBDEPS=[
        'replmocks',
        'service_context_repl_mock_init',
        'task_runner',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/service_context',
        '$BUILD_DIR/mongo/unittest/concurrency',
        '$BUILD_DIR/mongo/unittest/unittest',
        '$BUILD_DIR/mongo/util/decorable',
    ],
)

env.CppUnitTest(
    target='task_runner_test',
    source='task_runner_test.cpp',
    LIBDEPS=[
        'task_runner_test_fixture',
    ],
)

env.Library(
    target='database_task',
    source=[
        'database_task.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/concurrency/lock_manager',
        '$BUILD_DIR/mongo/db/concurrency/write_conflict_exception',
        '$BUILD_DIR/mongo/db/curop',
    ],
)

env.CppUnitTest(
    target='database_task_test',
    source='database_task_test.cpp',
    LIBDEPS=[
        'database_task',
        'task_runner_test_fixture',
    ],
)

env.CppUnitTest(
    target='read_concern_args_test',
    source=[
        'read_concern_args_test.cpp',
    ],
    LIBDEPS=['replica_set_messages']
)

env.Library(target='optime',
            source=[
                'bson_extract_optime.cpp',
                'optime.cpp',
            ],
            LIBDEPS=[
                '$BUILD_DIR/mongo/base',
                '$BUILD_DIR/mongo/bson/util/bson_extract',
            ],
)

env.CppUnitTest(
    target='optime_extract_test',
    source=[
        'optime_extract_test.cpp'
    ],
    LIBDEPS=[
        'optime',
    ],
)

env.Library(
    target='multiapplier',
    source=[
        'multiapplier.cpp',
    ],
    LIBDEPS=[
        'oplog_entry',
        '$BUILD_DIR/mongo/db/service_context',
        '$BUILD_DIR/mongo/executor/task_executor_interface',
    ],
)

env.CppUnitTest(
    target='multiapplier_test',
    source='multiapplier_test.cpp',
    LIBDEPS=[
        'multiapplier',
        'service_context_repl_mock_init',
        '$BUILD_DIR/mongo/db/auth/authorization_manager_mock_init',
        '$BUILD_DIR/mongo/db/commands_test_crutch',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
        '$BUILD_DIR/mongo/unittest/task_executor_proxy',
    ],
)

env.Library(
    target='data_replicator_external_state_impl',
    source=[
        'data_replicator_external_state_impl.cpp',
    ],
    LIBDEPS=[
        'optime',
        'repl_coordinator_interface',
        '$BUILD_DIR/mongo/base',
    ],
)

env.Library(
    target='data_replicator_external_state_initial_sync',
    source=[
        'data_replicator_external_state_initial_sync.cpp',
    ],
    LIBDEPS=[
        'data_replicator_external_state_impl',
    ],
)

env.Library(
    target='data_replicator_external_state_mock',
    source=[
        'data_replicator_external_state_mock.cpp',
    ],
    LIBDEPS=[
        'oplog_buffer_blocking_queue',
        'oplog_entry',
        'optime',
        'replica_set_messages',
        '$BUILD_DIR/mongo/util/net/hostandport',
    ],
)

env.Library(
    target='initial_syncer',
    source=[
        'initial_syncer.cpp',
    ],
    LIBDEPS=[
        'collection_cloner',
        'database_cloner',
        'databases_cloner',
        'multiapplier',
        'oplog_buffer_blocking_queue',
        'oplog_entry',
        'oplog_fetcher',
        'optime',
        'rollback_checker',
        'storage_interface',
        '$BUILD_DIR/mongo/client/fetcher',
    ],
)

env.CppUnitTest(
    target='initial_syncer_test',
    source=[
        'initial_syncer_test.cpp',
    ],
    LIBDEPS=[
        'base_cloner_test_fixture',
        'initial_syncer',
        'data_replicator_external_state_mock',
        'replication_executor_test_fixture',
        'sync_source_selector_mock',
        '$BUILD_DIR/mongo/db/query/command_request_response',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture',
        '$BUILD_DIR/mongo/unittest/concurrency',
        '$BUILD_DIR/mongo/unittest/task_executor_proxy',
    ],
)

env.Library(
    target='rollback_checker',
    source=[
        'rollback_checker.cpp',
    ],
    LIBDEPS=[
        'replication_executor',
    ],
)

env.CppUnitTest(
    target='rollback_checker_test',
    source=[
        'rollback_checker_test.cpp',
    ],
    LIBDEPS=[
        'replication_executor_test_fixture',
        'rollback_checker',
        '$BUILD_DIR/mongo/unittest/concurrency',
    ],
)

env.Library(
    target='roll_back_local_operations',
    source=[
        'roll_back_local_operations.cpp',
    ],
    LIBDEPS=[
        'optime',
        '$BUILD_DIR/mongo/base',
    ],
)

env.CppUnitTest(
    target='roll_back_local_operations_test',
    source='roll_back_local_operations_test.cpp',
    LIBDEPS=[
        'oplog_interface_mock',
        'roll_back_local_operations',
    ],
)

env.Library(
    target="serveronly",
    source=[
        "initial_sync.cpp",
        "master_slave.cpp",
        'noop_writer.cpp',
        "oplog.cpp",
        "oplogreader.cpp",
        "replication_coordinator_external_state_impl.cpp",
        "replication_info.cpp",
        "resync.cpp",
        "rs_initialsync.cpp",
        "rs_sync.cpp",
        "sync_source_feedback.cpp",
    ],
    LIBDEPS=[
        'bgsync',
        'optime',
        'repl_coordinator_interface',
        'repl_coordinator_impl',
        'repl_settings',
        'sync_tail',
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/client/clientdriver',
        '$BUILD_DIR/mongo/db/auth/authcore',
        '$BUILD_DIR/mongo/db/commands',
        '$BUILD_DIR/mongo/db/commands/list_collections_filter',
        '$BUILD_DIR/mongo/rpc/client_metadata',
        '$BUILD_DIR/mongo/db/concurrency/lock_manager',
        '$BUILD_DIR/mongo/db/curop',
        '$BUILD_DIR/mongo/db/lasterror',
        '$BUILD_DIR/mongo/db/query/query',
        '$BUILD_DIR/mongo/db/s/balancer',
        '$BUILD_DIR/mongo/db/service_context',
        '$BUILD_DIR/mongo/db/stats/counters',
    ],
    LIBDEPS_TAGS=[
        # TODO: Many missing libdeps above
        'incomplete',
    ],
)
