# -*- mode: python -*-

Import([
    "env",
    "get_option",
    "has_option",
    "version_extra",
    "version_parts",
    "wiredtiger",
])

env = env.Clone()

# Ideally 's2' would be scoped narrowly but it is spammed in all over the place by
# db/geo unfortunately.
env.InjectThirdParty(libraries=[
    's2',
])


def shouldBuildGRPC(myEnv):
    return myEnv.TargetOSIs('linux') and myEnv['ENABLE_GRPC_BUILD']


env.SConscript(
    dirs=[
        'admission',
        'auth',
        'bson',
        'catalog',
        'commands',
        'concurrency',
        'cst',
        'exec',
        'fts',
        'ftdc',
        'geo',
        'process_health',
        'index',
        'matcher',
        'op_observer',
        'ops',
        'pipeline',
        'query',
        'repl',
        's',
        'serverless',
        'session',
        'sorter',
        'stats',
        'storage',
        'timeseries',
        'transaction',
        'update',
        'views',
    ],
    exports=[
        'env',
    ],
)

env.Library(
    target='server_parameter_insert_max_batch_size',
    source=[
        'server_parameter_insert_max_batch_size.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'repl/repl_server_parameters',
        'server_base',
        'storage/storage_options',
    ],
)

# The 'server_base' library must only contain basic, stateless, value types which are used throughout
# all the server binaries. It must not depend on anything other than utilities that are outside of
# the server codebase.
env.Library(
    target='server_base',
    source=[
        '$BUILD_DIR/mongo/idl/command_generic_argument.cpp',
        '$BUILD_DIR/mongo/idl/generic_argument.idl',
        '$BUILD_DIR/mongo/client/hedging_mode.idl',
        '$BUILD_DIR/mongo/client/read_preference.idl',
        '$BUILD_DIR/mongo/client/read_preference_validators.cpp',
        '$BUILD_DIR/mongo/rpc/metadata/impersonated_user_metadata.idl',
        '$BUILD_DIR/mongo/s/chunk_version.cpp',
        '$BUILD_DIR/mongo/s/chunk_version.idl',
        '$BUILD_DIR/mongo/s/database_version.cpp',
        '$BUILD_DIR/mongo/s/database_version.idl',
        '$BUILD_DIR/mongo/s/database_version_base.idl',
        '$BUILD_DIR/mongo/s/gossiped_routing_cache.idl',
        '$BUILD_DIR/mongo/s/index_version.cpp',
        '$BUILD_DIR/mongo/s/index_version.idl',
        '$BUILD_DIR/mongo/s/shard_version.cpp',
        '$BUILD_DIR/mongo/s/shard_version.idl',
        '$BUILD_DIR/mongo/s/sharding_types.idl',
        '$BUILD_DIR/mongo/util/database_name_util.cpp',
        '$BUILD_DIR/mongo/util/namespace_string_util.cpp',
        'auth/auth_name.cpp',
        'auth/auth_types.idl',
        'auth/validated_tenancy_scope.cpp',
        env.BazelIdlc('basic_types.idl')[0],
        'catalog_shard_feature_flag.idl',
        'cluster_role.cpp',
        'dump_lock_manager.cpp',
        'feature_compatibility_version_document.idl',
        'feature_compatibility_version_parser.cpp',
        'feature_flag.cpp',
        'index_names.cpp',
        'keypattern.cpp',
        'logical_time.cpp',
        'multitenancy.idl',
        'namespace_string.cpp',
        'read_write_concern_provenance.cpp',
        'read_write_concern_provenance_base.idl',
        'repl/read_concern.idl',
        'repl/read_concern_idl.cpp',
        'server_options.cpp',
        'server_parameter.cpp',
        'server_parameter.idl',
        'server_parameter_with_storage.cpp',
        'shard_id.cpp',
        'shutdown_in_progress_quiesce_info.cpp',
        'tenant_id.cpp',
        'vector_clock.idl',
        'write_concern_idl.cpp',
        'write_concern.idl',
        'write_concern_options.cpp',
        'write_concern_options.idl',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/idl/idl_parser',
        'repl/optime',
        'session/logical_session_id',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/bson/util/bson_extract',
    ],
)

env.CppUnitTest(
    target='server_base_test',
    source=[
        '$BUILD_DIR/mongo/util/database_name_util_test.cpp',
        '$BUILD_DIR/mongo/util/namespace_string_util_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/server_base',
    ],
)

#
# The db/'common' lib has the abstractions that are shared by components of the
# server. Ideally, many of the object in 'coredb' should be moved here when their dependencies
# get resolved.
#

env.Library(
    target='common',
    source=[
        'database_name.cpp',
        'field_ref.cpp',
        'field_ref_set.cpp',
        'field_parser.cpp',
        'txn_retry_counter_too_old_info.cpp',
    ],
    LIBDEPS=[
        'catalog/cannot_convert_index_to_unique_info',
        'repl/tenant_migration_errors',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/collection_uuid_mismatch_info',
        'server_base',
    ],
)

env.Library(
    target='global_index',
    source=[
        'global_index.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/collection_crud',
        'catalog/collection_options',
        'concurrency/exception_util',
        'dbhelpers',
        'index_builds_coordinator_interface',
        'query_exec',
        'server_base',
        'session/logical_session_id_helpers',
        'shard_role',
        'storage/key_string',
        'transaction/transaction',
    ],
)

env.Library(
    target='multitenancy',
    source=[
        'multitenancy.cpp',
    ],
    LIBDEPS=[
        'server_base',
    ],
    LIBDEPS_PRIVATE=[
        'auth/auth',
        'auth/security_token',
    ],
)

env.Library(
    target='dbmessage',
    source=[
        'dbmessage.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/bson/bson_validate',
        '$BUILD_DIR/mongo/transport/transport_layer_common',
        '$BUILD_DIR/mongo/util/net/network',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='startup_warnings_common',
    source=[
        'startup_warnings_common.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/client/authentication',
        '$BUILD_DIR/mongo/util/net/ssl_manager',
    ],
)

env.Library(
    target='startup_warnings_mongod',
    source=[
        'startup_warnings_mongod.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/repl/repl_coordinator_interface',
        '$BUILD_DIR/mongo/db/repl/repl_settings',
        '$BUILD_DIR/mongo/util/processinfo',
        'startup_warnings_common',
    ],
)

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

env.Benchmark(
    target='profile_filter_bm',
    source=[
        'profile_filter_bm.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/commands/profile_common',
        '$BUILD_DIR/mongo/util/processinfo',
        'profile_filter',
    ],
)

env.Library(
    target='curop_failpoint_helpers',
    source=[
        'curop_failpoint_helpers.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/fail_point',
        'query/query_stats/query_stats',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/concurrency/spin_lock',
    ],
)

env.Library(
    target='mongohasher',
    source=[
        'hasher.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/util/md5',
    ],
)

env.Library(
    target='update_index_data',
    source=[
        'update_index_data.cpp',
    ],
    LIBDEPS=[
        'common',
    ],
)

env.Library(
    target='collection_index_usage_tracker',
    source=[
        'aggregated_index_usage_tracker.cpp',
        'collection_index_usage_tracker.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'commands/server_status_core',
        'server_base',
    ],
)

env.Command(
    target=[
        'feature_flag_test.idl',
    ],
    source=[
        '#buildscripts/cheetah_source_generator.py',
        'feature_flag_test.idl.tpl',
        '$BUILD_DIR/mongo/util/version/releases.yml',
    ],
    action=[
        '$PYTHON ${SOURCES[0]} -o ${TARGETS[0]} ${SOURCES[1]} ${SOURCES[2]} ${MONGO_VERSION}',
    ],
    # Ensure that that SCons is used to produce this file rather than Ninja, to avoid spurious
    # dependency cycles due to how we manage generated sources with Ninja.
    NINJA_TEMPLATE=True,
)

env.Library(
    target='server_feature_flags',
    source=[
        'feature_flag_test.idl',
        'server_feature_flags.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/idl/cluster_server_parameter',
        'server_base',
    ],
)

env.Library(
    target='server_options',
    source=[
        'server_options_helpers.cpp',
        'server_options_helpers.idl',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/cmdline_utils/cmdline_utils',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/fail_point',
        'server_base',
    ],
)

if env.TargetOSIs('windows'):
    env.Library(
        target='windows_options',
        source=[
            'windows_options.idl',
        ],
        LIBDEPS_PRIVATE=[
            '$BUILD_DIR/mongo/util/options_parser/options_parser',
        ],
    )

env.Library(
    target='server_options_base',
    source=[
        'server_options_base.cpp',
        'cluster_auth_mode_option.idl',
        'keyfile_option.idl',
        'server_options_base.idl',
        'server_options_general.idl',
        'server_options_nongeneral.idl',
        'server_options_upgrade_downgrade.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/options_parser/options_parser',
        'auth/cluster_auth_mode',
        'connection_health_metrics_parameter',
        'server_base',
    ],
)

env.Clone().InjectModule("enterprise").Library(
    target='server_options_servers',
    source=[
        'server_options_server_helpers.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/transport/message_compressor',
        '$BUILD_DIR/mongo/util/net/network',
        # The dependency on net/ssl_manager is a temporary crutch that should go away once the
        # networking library has separate options
        '$BUILD_DIR/mongo/util/net/ssl_manager',
        'server_options',
        'server_options_base',
    ],
    LIBDEPS_PRIVATE=[
        'auth/cluster_auth_mode',
        'server_base',
    ],
)

env.Library(
    target="serverinit",
    source=[
        "initialize_server_global_state.cpp",
        "initialize_server_global_state.idl",
        "server_options_init.cpp",
    ],
    LIBDEPS_PRIVATE=[
        "$BUILD_DIR/mongo/db/audit",
        "$BUILD_DIR/mongo/db/server_base",
        "$BUILD_DIR/mongo/util/processinfo",
        "$BUILD_DIR/mongo/util/signal_handlers",
    ],
)

env.Library(
    target='global_settings',
    source=[
        'global_settings.cpp',
    ],
    LIBDEPS=[
        'repl/repl_settings',
        'server_base',
        'service_context',
    ],
)

env.Library(
    target='connection_health_metrics_parameter',
    source=[
        'connection_health_metrics_parameter.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/options_parser/options_parser',
        'server_base',
    ],
)

env.Library(
    target='namespace_spec',
    source=[
        'namespace_spec.idl',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='mongod_options',
    source=[
        'mongod_options.cpp',
        'mongod_options_general.idl',
        'mongod_options_legacy.idl',
        'mongod_options_replication.idl',
        'mongod_options_sharding.idl',
        'mongod_options_storage.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/s/common_s',
        '$BUILD_DIR/mongo/util/options_parser/options_parser',
        'auth/cluster_auth_mode',
        'global_settings',
        'repl/repl_server_parameters',
        'repl/repl_settings',
        'repl/replica_set_messages',
        'server_base',
        'server_feature_flags',
        'server_options_base',
        'server_options_servers',
        'storage/storage_options',
    ],
)

env.Library(
    target='read_write_concern_defaults',
    source=[
        'read_write_concern_defaults.cpp',
        'read_write_concern_defaults.idl',
    ],
    LIBDEPS=[
        'repl/read_concern_args',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/caching',
        '$BUILD_DIR/mongo/util/concurrency/thread_pool',
        'repl/repl_server_parameters',
        'server_base',
        'vector_clock',
    ],
)

env.Library(
    target='default_max_time_ms_cluster_parameter',
    source=[
        'default_max_time_ms_cluster_parameter.idl',
        'default_max_time_ms_cluster_parameter.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/auth/auth',
        '$BUILD_DIR/mongo/db/auth/security_token',
        '$BUILD_DIR/mongo/idl/cluster_server_parameter',
        'query/query_request',
        'server_base',
        'server_feature_flags',
    ],
)

env.Library(
    target='change_stream_options',
    source=[
        'change_stream_options.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/idl/cluster_server_parameter',
        'server_base',
    ],
)

env.Library(
    target='change_stream_options_manager',
    source=[
        'change_stream_options_manager.cpp',
        'change_stream_options_parameter.idl',
    ],
    LIBDEPS_PRIVATE=[
        'change_stream_options',
        'change_stream_serverless_helpers',
        'repl/repl_coordinator_interface',
        'repl/repl_settings',
        'server_base',
        'service_context',
    ],
)

env.Library(
    target='change_streams_cluster_parameter',
    source=[
        'change_streams_cluster_parameter.idl',
        'change_streams_cluster_parameter.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/idl/cluster_server_parameter',
        'change_stream_serverless_helpers',
        'repl/repl_coordinator_interface',
        'repl/repl_settings',
        'server_base',
    ],
)

env.Library(
    target='change_stream_state',
    source=[
        'change_stream_state.idl',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='set_change_stream_state_coordinator',
    source=[
        'set_change_stream_state_coordinator.cpp',
        'set_change_stream_state_coordinator.idl',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/change_stream_change_collection_manager',
        '$BUILD_DIR/mongo/db/change_stream_pre_images_collection_manager',
        '$BUILD_DIR/mongo/db/change_stream_serverless_helpers',
        '$BUILD_DIR/mongo/db/change_stream_state',
        '$BUILD_DIR/mongo/db/dbdirectclient',
        '$BUILD_DIR/mongo/db/repl/primary_only_service',
        '$BUILD_DIR/mongo/db/repl/repl_coordinator_interface',
        '$BUILD_DIR/mongo/db/repl/wait_for_majority_service',
        '$BUILD_DIR/mongo/idl/idl_parser',
    ],
)

env.Library(
    target='change_stream_serverless_helpers',
    source=[
        'change_stream_serverless_helpers.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/collection_catalog',
        'global_settings',
        'query/query_knobs',
        'server_base',
    ],
)

env.Library(
    target='change_stream_change_collection_manager',
    source=[
        'change_collection_truncate_markers.cpp',
        'change_stream_change_collection_manager.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/catalog_helpers',
        'catalog/collection_crud',
        'catalog/collection_options',
        'change_stream_serverless_helpers',
        'change_streams_cluster_parameter',
        'concurrency/exception_util',
        'dbhelpers',
        'record_id_helpers',
        'server_feature_flags',
        'service_context',
    ],
)

env.Library(
    target='change_collection_expired_change_remover',
    source=[
        'change_collection_expired_documents_remover.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/change_stream_change_collection_manager',
        '$BUILD_DIR/mongo/db/change_stream_serverless_helpers',
        '$BUILD_DIR/mongo/db/change_streams_cluster_parameter',
        '$BUILD_DIR/mongo/db/query_exec',
        '$BUILD_DIR/mongo/db/server_feature_flags',
        '$BUILD_DIR/mongo/util/periodic_runner',
    ],
)

env.Library(
    target='change_stream_pre_image_util',
    source=[
        'change_stream_pre_image_util.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'change_stream_options_manager',
        'change_stream_serverless_helpers',
        'concurrency/exception_util',
        'pipeline/change_stream_preimage',
        'query_exec',
        'record_id_helpers',
        'server_base',
    ],
)

env.Library(
    target='change_stream_pre_images_collection_manager',
    source=[
        'change_stream_pre_images_collection_manager.cpp',
        'change_stream_pre_images_tenant_truncate_markers.cpp',
        'change_stream_pre_images_truncate_manager.cpp',
        'change_stream_pre_images_truncate_markers_per_nsUUID.cpp',
    ],
    LIBDEPS=[
        'pipeline/change_stream_preimage',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/catalog_helpers',
        'catalog/collection_crud',
        'catalog/collection_options',
        'change_stream_options_manager',
        'change_stream_pre_image_util',
        'change_stream_serverless_helpers',
        'concurrency/exception_util',
        'query_exec',
        'record_id_helpers',
        'repl/storage_interface',
        'server_base',
        'server_feature_flags',
        'storage/storage_options',
    ],
)

env.CppUnitTest(
    target='change_stream_pre_images_manager_test',
    source=[
        'change_stream_pre_images_remover_test.cpp',
        'change_stream_pre_images_truncate_manager_test.cpp',
    ],
    LIBDEPS=[
        'catalog/catalog_test_fixture',
        'catalog/collection_catalog',
        'catalog/collection_crud',
        'change_stream_options',
        'change_stream_options_manager',
        'change_stream_pre_image_util',
        'change_stream_pre_images_collection_manager',
        'change_stream_serverless_helpers',
        'change_streams_cluster_parameter',
        'op_observer/op_observer',
        'op_observer/op_observer_impl',
        'op_observer/operation_logger_impl',
        'shard_role',
        'storage/record_store_base',
    ],
)

env.Library(
    target='write_block_bypass',
    source=[
        'write_block_bypass.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'auth/auth',
        'auth/authprivilege',
        'service_context',
    ],
)

env.Library(
    target='read_write_concern_defaults_mock',
    source=[
        'read_write_concern_defaults_cache_lookup_mock.cpp',
    ],
    LIBDEPS=[
        'read_write_concern_defaults',
    ],
)

env.Library(
    target='service_context',
    source=[
        'baton.cpp',
        'cancelable_operation_context.cpp',
        'client.cpp',
        'client_strand.cpp',
        'default_baton.cpp',
        'operation_context.cpp',
        'operation_context_group.cpp',
        'operation_cpu_timer.cpp',
        'operation_id.cpp',
        'operation_key_manager.cpp',
        'service_context.cpp',
        'server_recovery.cpp',
        'repl_set_member_in_standalone_mode.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/clock_sources',
        '$BUILD_DIR/mongo/util/concurrency/spin_lock',
        '$BUILD_DIR/mongo/util/fail_point',
        '$BUILD_DIR/mongo/util/net/network',
        '$BUILD_DIR/mongo/util/periodic_runner',
        'multi_key_path_tracker',
        'session/logical_session_id',
        'storage/recovery_unit_base',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/processinfo',
        'server_base',
        'storage/write_unit_of_work',
    ],
)

env.CppUnitTest(
    target='default_baton_test',
    source=[
        'default_baton_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/service_context_non_d',
        '$BUILD_DIR/mongo/util/clock_source_mock',
        'service_context',
        'service_context_test_fixture',
    ],
)

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

env.Library(
    target='multi_key_path_tracker',
    source=[
        'multi_key_path_tracker.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/storage/key_string',
    ],
)

env.Library(
    target='not_primary_error_tracker',
    source=[
        'not_primary_error_tracker.cpp',
    ],
    LIBDEPS=[
        'service_context',
    ],
)

env.Clone().InjectModule("enterprise").Library(
    target="audit",
    source=[
        "audit.cpp",
    ],
    LIBDEPS=[
        "$BUILD_DIR/mongo/base",
        "service_context",
    ],
)

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

env.Library(
    target='mirror_maestro',
    source=[
        'mirror_maestro.cpp',
        'mirror_maestro.idl',
        'mirroring_sampler.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/executor/task_executor_interface',
        '$BUILD_DIR/mongo/rpc/message',
        '$BUILD_DIR/mongo/util/net/network',
        'client_out_of_line_executor',
        'service_context',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/bson/util/bson_extract',
        '$BUILD_DIR/mongo/db/auth/security_token_auth',
        '$BUILD_DIR/mongo/executor/network_interface_factory',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor',
        '$BUILD_DIR/mongo/util/concurrency/thread_pool',
        'commands',
        'commands/server_status_core',
        'repl/repl_coordinator_interface',
        'repl/repl_settings',
        'repl/replica_set_messages',
        'repl/topology_version_observer',
        'server_base',
    ],
)

env.CppUnitTest(
    target='client_out_of_line_executor_test',
    source=[
        'client_out_of_line_executor_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/transport/transport_layer_common',
        'client_out_of_line_executor',
        'concurrency/lock_manager',
    ],
)

env.CppUnitTest(
    target='mongod_options_test',
    source=[
        'mongod_options_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/options_parser/options_parser',
        'concurrency/lock_manager',
        'mongod_options',
        'server_base',
    ],
)

env.Library(
    target='coll_mod_command_idl',
    source=[
        'coll_mod.idl',
    ],
    LIBDEPS=[
        'catalog/collection_options',
    ],
    LIBDEPS_PRIVATE=[
        'auth/authprivilege',
        'server_base',
        'timeseries/timeseries_options',
    ],
)

env.Library(
    target='dbcommands_idl',
    source=[
        'dbcommands.idl',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/collection_options',
        'pipeline/document_sources_idl',
        'server_base',
    ],
)

env.Library(
    target='metadata_consistency_types_idl',
    source=[
        'metadata_consistency_types.idl',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='commands',
    source=[
        'coll_mod_reply_validation.cpp',
        'commands.cpp',
        'curop.cpp',
        'drop.idl',
        'drop_database.idl',
        'explain.idl',
        'list_collections.idl',
        'list_indexes.idl',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/admission/execution_admission_context',
        '$BUILD_DIR/mongo/db/admission/ingress_admission_context',
        '$BUILD_DIR/mongo/db/query/cursor_response_idl',
        'api_parameters',
        'server_base',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/bson/mutable/mutable_bson',
        '$BUILD_DIR/mongo/rpc/command_status',
        '$BUILD_DIR/mongo/rpc/rewrite_state_change_errors',
        '$BUILD_DIR/mongo/rpc/rpc',
        '$BUILD_DIR/mongo/transport/service_executor',
        '$BUILD_DIR/mongo/util/concurrency/spin_lock',
        '$BUILD_DIR/mongo/util/diagnostic_info'
        if get_option('use-diagnostic-latches') == 'on' else [],
        '$BUILD_DIR/mongo/util/fail_point',
        '$BUILD_DIR/mongo/util/progress_meter',
        'admission/ticketholder_manager',
        'audit',
        'auth/auth',
        'auth/authprivilege',
        'auth/user_acquisition_stats',
        'catalog/collection_options',
        'coll_mod_command_idl',
        'commands/create_command',
        'commands/server_status_core',
        'commands/test_commands_enabled',
        'concurrency/lock_manager',
        'generic_cursor',
        'index_commands_idl',
        'prepare_conflict_tracker',
        'query/common_query_enums_and_helpers',
        'repl/read_concern_args',
        'server_feature_flags',
        'stats/resource_consumption_metrics',
        'stats/timer_stats',
        'timeseries/timeseries_options',
    ],
)

env.Library(
    target='command_can_run_here',
    source=[
        'command_can_run_here.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/client/read_preference',
        '$BUILD_DIR/mongo/db/repl/repl_coordinator_interface',
        'commands/test_commands_enabled',
        'service_context',
    ],
)

env.Library(
    target='shard_role_api_stor_ex',
    source=[
        'catalog/collection.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/s/common_s',
        'catalog/collection_options',
        'catalog/index_catalog',
        'query/collation/collator_factory_interface',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='shard_role_api',
    source=[
        'catalog/collection_operation_source.cpp',
        'direct_shard_client_tracker.cpp',
        'dump_lock_manager_impl.cpp',
        'replica_set_endpoint_sharding_state.cpp',
        'replica_set_endpoint_util.cpp',
        's/collection_metadata.cpp',
        's/collection_sharding_state.cpp',
        's/database_sharding_state.cpp',
        's/global_user_write_block_state.cpp',
        's/operation_sharding_state.cpp',
        's/range_arithmetic.cpp',
        's/scoped_collection_metadata.cpp',
        's/shard_key_index_util.cpp',
        's/sharding_api_d_params.idl',
        's/sharding_migration_critical_section.cpp',
        's/sharding_statistics.cpp',
        's/sharding_write_router.cpp',
        's/transaction_coordinator_curop.cpp',
        's/transaction_coordinator_factory.cpp',
        's/transaction_coordinator_worker_curop_repository.cpp',
        'transaction_resources.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/admission/execution_admission_context',
        '$BUILD_DIR/mongo/s/grid',
        'concurrency/lock_manager',
        'shard_role_api_stor_ex',
        'storage/write_unit_of_work',
        'views/views',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/concurrency/spin_lock',
        'server_base',
        'server_feature_flags',
        'write_block_bypass',
    ],
)

env.Library(
    target='shard_role',
    source=[
        'catalog/catalog_helper.cpp',
        'catalog/collection_uuid_mismatch.cpp',
        'catalog/collection_yield_restore.cpp',
        'catalog_raii.cpp',
        'db_raii.cpp',
        'direct_connection_util.cpp',
        'shard_role.cpp',
    ],
    LIBDEPS=[
        'catalog/collection_catalog',
        'catalog/database_holder',
        'shard_role_api',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/concurrency/spin_lock',
        'catalog/collection_uuid_mismatch_info',
        'catalog/local_oplog_info',
        'multitenancy',
        'server_base',
        'stats/top',
        'storage/capped_snapshots',
        'storage/snapshot_helper',
        'storage/storage_options',
    ],
)

env.CppUnitTest(
    target='replica_set_endpoint_test',
    source=[
        'direct_shard_client_tracker_test.cpp',
        'replica_set_endpoint_sharding_state_test.cpp',
        'replica_set_endpoint_test_fixture.cpp',
        'replica_set_endpoint_util_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/rpc/message',
        '$BUILD_DIR/mongo/transport/transport_layer_mock',
        'auth/authmocks',
        'commands',
        'commands_test_example',
        'repl/replmocks',
        's/sharding_catalog_manager',
        'service_context_d_test_fixture',
        'shard_role_api',
    ],
)

env.Library(
    target='internal_transactions_feature_flag',
    source=[
        'internal_transactions_feature_flag.idl',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='fle_crud',
    source=[
        'commands/fle2_get_count_info_command.idl',
        'fle_crud.cpp',
        'query/fle/encrypted_predicate.cpp',
        'query/fle/equality_predicate.cpp',
        'query/fle/query_rewriter.cpp',
        'query/fle/range_predicate.cpp',
        'query/fle/range_validator.cpp',
        'query/fle/server_rewrite.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/crypto/encrypted_field_config',
        'ops/write_ops_parsers',
        'pipeline/pipeline',
        'query/command_request_response',
        'transaction/transaction_api',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/crypto/fle_crypto',
        '$BUILD_DIR/mongo/executor/inline_executor',
        '$BUILD_DIR/mongo/executor/task_executor_pool',
        '$BUILD_DIR/mongo/s/sharding_router_api',
        '$BUILD_DIR/mongo/util/concurrency/spin_lock',
        'dbdirectclient',
        'query/collation/collator_factory_interface',
        'query/query_request',
        'query_expressions',
        'session/logical_session_id',
    ],
)

env.Library(
    target='fle_crud_mongod',
    source=[
        'fle_crud_mongod.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/crypto/fle_crypto',
        '$BUILD_DIR/mongo/executor/inline_executor',
        '$BUILD_DIR/mongo/executor/network_interface_factory',
        '$BUILD_DIR/mongo/executor/task_executor_pool',
        '$BUILD_DIR/mongo/executor/thread_pool_task_executor',
        '$BUILD_DIR/mongo/util/concurrency/thread_pool',
        'concurrency/exception_util',
        'fle_crud',
        'query/query_request',
        'record_id_helpers',
        'repl/repl_coordinator_interface',
        'session/logical_session_id',
        'session/session_catalog_mongod',
        'shard_role',
        'transaction/transaction',
    ],
)

env.Library(
    target='fle_mocks',
    source=[
        'fle_query_interface_mock.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/crypto/fle_crypto',
        '$BUILD_DIR/mongo/db/ops/write_ops',
        '$BUILD_DIR/mongo/db/repl/storage_interface_impl',
        'fle_crud',
        'fle_crud_mongod',
    ],
)

env.Library(
    target='cluster_transaction_api',
    source=[
        'cluster_transaction_api.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/session/logical_session_id',
        '$BUILD_DIR/mongo/db/session/logical_session_id_helpers',
        '$BUILD_DIR/mongo/db/transaction/transaction_api',
        '$BUILD_DIR/mongo/rpc/rpc',
        '$BUILD_DIR/mongo/s/startup_initialization',
        'service_context',
        'shared_request_handling',
    ],
)

env.Library(
    target='dbdirectclient',
    source=[
        'dbdirectclient.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/client/clientdriver_minimal',
        'not_primary_error_tracker',
        'ops/write_ops_parsers',
    ],
    LIBDEPS_PRIVATE=[
        'repl/repl_coordinator_interface',
        'repl/repl_settings',
        'shard_role',
    ],
)

env.Library(
    target='dbhelpers',
    source=[
        'dbhelpers.cpp',
    ],
    LIBDEPS=[
        'query_exec',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/collection_crud',
        'commands/server_status_core',
        'index/index_access_method',
        'ops/write_ops',
        'record_id_helpers',
        'shard_role',
    ],
)

env.Library(
    target='system_index',
    source=[
        'system_index.cpp',
    ],
    LIBDEPS=[
        'catalog/index_key_validate',
        'catalog/multi_index_block',
        'exec/scoped_timer',
        'index_builds_coordinator_interface',
        'shard_role',
    ],
)

env.Library(
    target='service_context_d',
    source=[
        'service_entry_point_mongod.cpp',
        'transaction_resources_init_mongod.cpp',
    ],
    LIBDEPS=[
        'service_context',
        'storage/storage_engine_common',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/s/startup_initialization',
        'auth/auth',
        'command_can_run_here',
        'commands/fsync_locked',
        'not_primary_error_tracker',
        'read_concern_d_impl',
        'rw_concern_d',
        's/sharding_runtime_d',
        'server_base',
        'service_entry_point_common',
        'storage/storage_engine_lock_file',
        'storage/storage_engine_metadata',
        'storage/storage_options',
    ],
)

env.Library(
    target='service_context_non_d',
    source=[
        'transaction_resources_init_non_mongod.cpp',
    ],
    LIBDEPS=[
        'service_context',
    ],
    LIBDEPS_PRIVATE=[
        'shard_role_api',
    ],
)

env.Library(
    target='service_request_common', source=[
        'common_request_args.idl',
    ], LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/db/query/query_request',
        '$BUILD_DIR/mongo/db/session/logical_session_id',
        '$BUILD_DIR/mongo/idl/idl_parser',
        '$BUILD_DIR/mongo/s/common_s',
        'api_parameters',
        'vector_clock',
    ])

env.Library(
    target='service_entry_point_common',
    source=[
        'service_entry_point_common.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/s/query_analysis_sampler',
        '$BUILD_DIR/mongo/s/sharding_router_api',
        '$BUILD_DIR/mongo/s/startup_initialization',
        '$BUILD_DIR/mongo/transport/service_executor',
        'admission/ingress_admission_control',
        'audit',
        'auth/auth',
        'auth/auth_umc',
        'auth/authprivilege',
        'auth/security_token_auth',
        'auth/user_acquisition_stats',
        'command_can_run_here',
        'commands/server_status_core',
        'commands/txn_cmd_request',
        'curop_metrics',
        'default_max_time_ms_cluster_parameter',
        'introspect',
        'multitenancy',
        'not_primary_error_tracker',
        'repl/repl_server_parameters',
        'repl/replica_set_messages',
        'repl/tenant_migration_access_blocker',
        'rw_concern_d',
        'server_feature_flags',
        'service_request_common',
        'session/session_catalog_mongod',
        'shared_request_handling',
        'stats/api_version_metrics',
        'stats/counters',
        'stats/read_preference_metrics',
        'stats/resource_consumption_metrics',
        'stats/server_read_concern_write_concern_metrics',
        'stats/top',
        'storage/storage_engine_lock_file',
        'storage/storage_engine_metadata',
        'transaction/transaction',
        'validate_api_parameters',
        'write_block_bypass',
    ],
)

env.Library(
    target='resumable_index_builds_idl',
    source=[
        'resumable_index_builds.idl',
    ],
    LIBDEPS=[
        "$BUILD_DIR/mongo/base",
        '$BUILD_DIR/mongo/idl/idl_parser',
    ],
    LIBDEPS_PRIVATE=[
        'sorter/sorter_base',
    ],
)

env.Library(
    target='index_builds_coordinator_mongod',
    source=[
        'index_builds_coordinator_mongod.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/concurrency/thread_pool',
        'index_builds_coordinator_interface',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/executor/task_executor_interface',
        'catalog/collection_catalog',
        'catalog/index_build_entry_idl',
        'index_build_entry_helpers',
        'repl/tenant_migration_access_blocker',
        'resumable_index_builds_idl',
        's/forwardable_operation_metadata',
        'shard_role',
        'storage/two_phase_index_build_knobs_idl',
    ],
)

env.Library(
    target='index_builds_coordinator_interface',
    source=[
        'index_builds_coordinator.cpp',
        'repl_index_build_state.cpp',
        'active_index_builds.cpp',
    ],
    LIBDEPS=[
        'catalog/commit_quorum_options',
        'catalog/index_builds_manager',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/storage/durable_catalog',
        '$BUILD_DIR/mongo/executor/task_executor_interface',
        '$BUILD_DIR/mongo/util/fail_point',
        'catalog/collection_catalog',
        'catalog/index_build_entry_idl',
        'catalog/index_build_oplog_entry',
        'catalog/multi_index_block',
        'concurrency/exception_util',
        'dbhelpers',
        'index_build_entry_helpers',
        'repl/cloner_utils',
        'repl/repl_coordinator_interface',
        'repl/tenant_migration_access_blocker',
        'repl/timestamp_block',
        'resumable_index_builds_idl',
        'server_base',
        'shard_role',
        'storage/disk_space_util',
        'storage/encryption_hooks',
        'storage/storage_options',
        'storage/storage_util',
        'storage/two_phase_index_build_knobs_idl',
    ],
)

env.Library(
    target='index_builds_coordinator_mock',
    source=['index_builds_coordinator_mock.cpp'],
    LIBDEPS=[
        'index_builds_coordinator_interface',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/executor/task_executor_interface',
        'catalog/collection_catalog',
        'catalog/index_build_entry_idl',
        'index_build_entry_helpers',
        'repl/tenant_migration_access_blocker',
        'resumable_index_builds_idl',
        's/forwardable_operation_metadata',
        'shard_role',
        'storage/two_phase_index_build_knobs_idl',
    ],
)

env.Library(
    target='index_build_entry_helpers',
    source=[
        'index_build_entry_helpers.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/collection_crud',
        'catalog/commit_quorum_options',
        'catalog/index_build_entry_idl',
        'catalog/local_oplog_info',
        'concurrency/exception_util',
        'dbhelpers',
        'server_base',
        'service_context',
        'shard_role',
    ],
)

env.Library(
    target='cloner',
    source=[
        'cloner.cpp',
        'cloner.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/client/authentication',
        'catalog/collection_crud',
        'catalog/collection_options',
        'catalog/multi_index_block',
        'commands/list_collections_filter',
        'concurrency/exception_util',
        'dbdirectclient',
        'index_builds_coordinator_interface',
        'multitenancy',
        'ops/write_ops',
        'repl/isself',
        'server_base',
        'shard_role',
    ],
)

env.Library(
    target="curop_metrics",
    source=[
        "curop_metrics.cpp",
    ],
    LIBDEPS_PRIVATE=[
        "$BUILD_DIR/mongo/db/query/query_stats/query_stats",
        "commands/server_status_core",
    ],
)

env.Library(
    target='introspect',
    source=[
        'introspect.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/concurrency/spin_lock',
        'catalog/collection_crud',
        'catalog/collection_options',
        'concurrency/exception_util',
        'shard_role',
        'stats/resource_consumption_metrics',
    ],
)

env.Library(
    target='rw_concern_d',
    source=[
        'read_concern.cpp',
        'write_concern.cpp',
    ],
    LIBDEPS=[
        'query/query_stats/query_stats',
        'read_write_concern_defaults',
        'repl/speculative_majority_read_info',
        'stats/timer_stats',
    ],
    LIBDEPS_PRIVATE=[
        'commands/server_status_core',
        'repl/repl_coordinator_interface',
        'repl/repl_server_parameters',
        'repl/repl_settings',
        "shard_role",
        'shared_request_handling',
        'storage/storage_control',
    ],
)

env.Library(
    target='read_concern_d_impl',
    source=[
        'read_concern_mongod.cpp',
        'read_concern_mongod.idl',
    ],
    LIBDEPS_PRIVATE=[
        'concurrency/exception_util',
        'repl/repl_coordinator_interface',
        'repl/speculative_majority_read_info',
        'repl/tenant_migration_access_blocker',
        'server_base',
        'shard_role',
    ],
)

env.Library(
    target='rebuild_indexes',
    source=[
        'rebuild_indexes.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/index_key_validate',
        'index_builds_coordinator_interface',
        'server_base',
        'shard_role_api',
    ],
)

env.Library(
    target='ttl_d',
    source=[
        'ttl.cpp',
        'ttl.idl',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/catalog_helpers',
        'catalog/index_key_validate',
        'coll_mod_command_idl',
        'commands/fsync_locked',
        'commands/server_status_core',
        'index_commands_idl',
        'ops/write_ops',
        'query_exec',
        'record_id_helpers',
        'repl/replica_set_aware_service',
        'repl/tenant_migration_access_blocker',
        's/sharding_runtime_d',
        'server_base',
        'service_context',
        'shard_role',
        'ttl_collection_cache',
    ],
)

env.Library(
    target='record_id_helpers',
    source=[
        'record_id_helpers.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/bson/bson_validate',
        'catalog/collection_options',
        'query/collation/collator_interface',
        'server_base',
        'storage/key_string',
    ],
)

env.Library(
    target='shard_filterer',
    source=[
        'exec/shard_filterer_impl.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'exec/working_set',
        'shard_role_api',
    ],
)

env.Library(
    target='working_set_common',
    source=[
        'exec/working_set_common.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/health_log_interface',
        'exec/working_set',
        'index/index_access_method',
        'server_base',
        'storage/execution_context',
        'storage/key_string',
    ],
)

env.Library(
    target='write_stage_common',
    source=[
        'exec/write_stage_common.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'exec/document_value/document_value',
        'exec/working_set',
        'server_base',
        'shard_filterer',
        'shard_role_api',
        'working_set_common',
    ],
)

execEnv = env.Clone()
execEnv.InjectThirdParty(libraries=['snappy'])
execEnv.Library(
    target='query_exec',
    source=[
        'clientcursor.cpp',
        'cursor_manager.cpp',
        'exec/and_hash.cpp',
        'exec/and_sorted.cpp',
        'exec/batched_delete_stage.cpp',
        'exec/batched_delete_stage.idl',
        'exec/batched_delete_stage_buffer.cpp',
        'exec/cached_plan.cpp',
        'exec/collection_scan.cpp',
        'exec/count.cpp',
        'exec/count_scan.cpp',
        'exec/delete_stage.cpp',
        'exec/distinct_scan.cpp',
        'exec/eof.cpp',
        'exec/express/express_plan.cpp',
        'exec/fetch.cpp',
        'exec/geo_near.cpp',
        'exec/idhack.cpp',
        'exec/index_scan.cpp',
        'exec/limit.cpp',
        'exec/merge_sort.cpp',
        'exec/mock_stage.cpp',
        'exec/multi_iterator.cpp',
        'exec/multi_plan.cpp',
        'exec/near.cpp',
        'exec/or.cpp',
        'exec/plan_cache_util.cpp',
        'exec/plan_stage.cpp',
        'exec/projection.cpp',
        'exec/queued_data_stage.cpp',
        'exec/record_store_fast_count.cpp',
        'exec/recordid_deduplicator.cpp',
        'exec/requires_collection_stage.cpp',
        'exec/requires_index_stage.cpp',
        'exec/return_key.cpp',
        'exec/sample_from_timeseries_bucket.cpp',
        'exec/shard_filter.cpp',
        'exec/skip.cpp',
        'exec/sort.cpp',
        'exec/sort_key_generator.cpp',
        'exec/spool.cpp',
        'exec/subplan.cpp',
        'exec/text_match.cpp',
        'exec/text_or.cpp',
        'exec/timeseries_modify.cpp',
        'exec/timeseries_upsert.cpp',
        'exec/trial_period_utils.cpp',
        'exec/trial_stage.cpp',
        'exec/unpack_timeseries_bucket.cpp',
        'exec/update_stage.cpp',
        'exec/upsert_stage.cpp',
        'ops/parsed_delete.cpp',
        'ops/parsed_update.cpp',
        'ops/update_result.cpp',
        'pipeline/document_source_cursor.cpp',
        'pipeline/document_source_geo_near_cursor.cpp',
        'pipeline/pipeline_d.cpp',
        'pipeline/plan_executor_pipeline.cpp',
        'pipeline/plan_explainer_pipeline.cpp',
        'pipeline/sbe_pushdown.cpp',
        'query/all_indices_required_checker.cpp',
        'query/bind_input_params.cpp',
        'query/classic_runtime_planner/cached_planner.cpp',
        'query/classic_runtime_planner/idhack_planner.cpp',
        'query/classic_runtime_planner/multi_planner.cpp',
        'query/classic_runtime_planner/planner_interface.cpp',
        'query/classic_runtime_planner/single_solution_passthrough_planner.cpp',
        'query/classic_runtime_planner/sub_planner.cpp',
        'query/classic_runtime_planner_for_sbe/cached_planner.cpp',
        'query/classic_runtime_planner_for_sbe/multi_planner.cpp',
        'query/classic_runtime_planner_for_sbe/planner_interface.cpp',
        'query/classic_runtime_planner_for_sbe/single_solution_passthrough_planner.cpp',
        'query/classic_runtime_planner_for_sbe/sub_planner.cpp',
        'query/classic_stage_builder.cpp',
        'query/cost_model/on_coefficients_change_updater_impl.cpp',
        'query/cqf_command_utils.cpp',
        'query/cqf_fast_paths.cpp',
        'query/cqf_fast_paths_utils.cpp',
        'query/cqf_get_executor.cpp',
        'query/explain.cpp',
        'query/find.cpp',
        'query/get_executor.cpp',
        'query/internal_plans.cpp',
        'query/plan_executor_express.cpp',
        'query/plan_executor_factory.cpp',
        'query/plan_executor_impl.cpp',
        'query/plan_executor_sbe.cpp',
        'query/plan_explainer_express.cpp',
        'query/plan_explainer_factory.cpp',
        'query/plan_explainer_impl.cpp',
        'query/plan_explainer_sbe.cpp',
        'query/plan_insert_listener.cpp',
        'query/plan_ranker.cpp',
        'query/plan_yield_policy_impl.cpp',
        'query/plan_yield_policy_sbe.cpp',
        'query/query_planner_params.cpp',
        'query/sbe_cached_solution_planner.cpp',
        'query/sbe_multi_planner.cpp',
        'query/sbe_plan_ranker.cpp',
        'query/sbe_planner_interfaces.cpp',
        'query/sbe_stage_builder.cpp',
        'query/sbe_stage_builder_abt_helpers.cpp',
        'query/sbe_stage_builder_abt_holder_impl.cpp',
        'query/sbe_stage_builder_accumulator.cpp',
        'query/sbe_stage_builder_coll_scan.cpp',
        'query/sbe_stage_builder_const_eval.cpp',
        'query/sbe_stage_builder_expression.cpp',
        'query/sbe_stage_builder_filter.cpp',
        'query/sbe_stage_builder_group.cpp',
        'query/sbe_stage_builder_helpers.cpp',
        'query/sbe_stage_builder_index_scan.cpp',
        'query/sbe_stage_builder_lookup.cpp',
        'query/sbe_stage_builder_plan_data.cpp',
        'query/sbe_stage_builder_projection.cpp',
        'query/sbe_stage_builder_sbexpr.cpp',
        'query/sbe_stage_builder_sbexpr_helpers.cpp',
        'query/sbe_stage_builder_state.cpp',
        'query/sbe_stage_builder_ts.cpp',
        'query/sbe_stage_builder_type_checker.cpp',
        'query/sbe_stage_builder_type_signature.cpp',
        "query/sbe_stage_builder_value_lifetime.cpp",
        'query/sbe_stage_builder_vectorizer.cpp',
        'query/sbe_stage_builder_window_function.cpp',
        'query/sbe_sub_planner.cpp',
        'query/sbe_trial_runtime_executor.cpp',
        'query/shard_filterer_factory_impl.cpp',
        'query/stage_builder_util.cpp',
        'query/wildcard_multikey_paths.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/scripting/scripting',
        '$BUILD_DIR/mongo/util/background_job',
        '$BUILD_DIR/mongo/util/elapsed_tracker',
        '$BUILD_DIR/mongo/util/field_set',
        '$BUILD_DIR/third_party/croaring/croaring',
        '$BUILD_DIR/third_party/s2/s2',
        'audit',
        'auth/auth_checks',
        'bson/dotted_path_support',
        'catalog/collection_query_info',
        'commands',
        'cursor_server_params',
        'dbdirectclient',
        'disk_use_options_idl',
        'exec/projection_executor',
        'exec/sbe/query_sbe_stages',
        'exec/sbe/query_sbe_storage',
        'exec/scoped_timer',
        'exec/sort_executor',
        'exec/working_set',
        'fts/base_fts',
        'matcher/expressions_mongod_only',
        'ops/delete_request_idl',
        'ops/parsed_update',
        'pipeline/pipeline',
        'query/cost_model/query_cost_model',
        'query/plan_executor',
        'query/plan_yield_policy',
        'query/query_common',
        'query/query_plan_cache',
        'query/query_planner',
        'query/query_settings/query_settings',
        'session/logical_session_cache',
        'shard_filterer',
        'shard_role',
        'shared_request_handling',
        'stats/latency_server_stats',
        'stats/serveronly_stats',
        'update/update_driver',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/collection_crud',
        'catalog/database_holder',
        'catalog/health_log_interface',
        'catalog/local_oplog_info',
        'commands/server_status_core',
        'concurrency/exception_util',
        'curop_failpoint_helpers',
        'exec/sbe/query_sbe_abt',
        'internal_transactions_feature_flag',
        'not_primary_error_tracker',
        'pipeline/abt_translation',
        'pipeline/change_stream_pipeline',
        'pipeline/document_source_internal_apply_oplog_update',
        'pipeline/pipeline_visitor',
        'query/ce/query_ce_heuristic',
        'query/ce/query_ce_histogram',
        'query/ce/query_ce_sampling',
        'query/ce/query_ce_sampling_executor',
        'query/optimizer/optimizer',
        'record_id_helpers',
        'repl/repl_coordinator_interface',
        'repl/wait_for_majority_service',
        'server_base',
        'session/kill_sessions',
        'sorter/sorter_base',
        'sorter/sorter_stats',
        'stats/resource_consumption_metrics',
        'storage/record_store_base',
        'storage/storage_options',
        'timeseries/bucket_catalog/bucket_catalog',
        'timeseries/timeseries_conversion_util',
        'timeseries/timeseries_options',
        'timeseries/timeseries_write_util',
        'working_set_common',
        'write_stage_common',
    ],
)

env.Library(
    target='disk_use_options_idl',
    source=[
        'exec/disk_use_options.idl',
    ],
    LIBDEPS_PRIVATE=[
        'query/query_knobs',
        'server_base',
    ],
)

env.Library(
    target='sbe_values',
    source=[
        'exec/sbe/values/arith_common.cpp',
        'exec/sbe/values/block_interface.cpp',
        'exec/sbe/values/bson.cpp',
        'exec/sbe/values/bson_block.cpp',
        'exec/sbe/values/cell_interface.cpp',
        'exec/sbe/values/key_string_entry.cpp',
        'exec/sbe/values/row.cpp',
        'exec/sbe/values/slot_printer.cpp',
        'exec/sbe/values/ts_block.cpp',
        'exec/sbe/values/value.cpp',
        'exec/sbe/values/value_printer.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/bson/util/bson_column',
        '$BUILD_DIR/mongo/util/pcre_util',
        '$BUILD_DIR/mongo/util/string_listset',
        '$BUILD_DIR/mongo/util/summation',
        'exec/js_function',
        'query/collation/collator_interface',
        'query/datetime/date_time_support',
        'storage/key_string',
        'storage/storage_options',
    ],
)

env.Library(
    target='query_expressions',
    source=[
        'matcher/doc_validation_error.cpp',
        'matcher/doc_validation_util.cpp',
        'matcher/expression.cpp',
        'matcher/expression_algo.cpp',
        'matcher/expression_array.cpp',
        'matcher/expression_bitset_tree_converter.cpp',
        'matcher/expression_expr.cpp',
        'matcher/expression_geo.cpp',
        'matcher/expression_geo_serializer.cpp',
        'matcher/expression_hasher.cpp',
        'matcher/expression_internal_bucket_geo_within.cpp',
        'matcher/expression_leaf.cpp',
        'matcher/expression_parameterization.cpp',
        'matcher/expression_parser.cpp',
        'matcher/expression_restorer.cpp',
        'matcher/expression_simplifier.cpp',
        'matcher/expression_text_base.cpp',
        'matcher/expression_text_noop.cpp',
        'matcher/expression_tree.cpp',
        'matcher/expression_where_base.cpp',
        'matcher/expression_where_noop.cpp',
        'matcher/expression_with_placeholder.cpp',
        'matcher/extensions_callback.cpp',
        'matcher/extensions_callback_noop.cpp',
        'matcher/implicit_validator.cpp',
        'matcher/in_list_data.cpp',
        'matcher/match_details.cpp',
        'matcher/match_expression_dependencies.cpp',
        'matcher/match_expression_util.cpp',
        'matcher/matchable.cpp',
        'matcher/matcher.cpp',
        'matcher/matcher_type_set.cpp',
        'matcher/rewrite_expr.cpp',
        'matcher/schema/encrypt_schema.idl',
        'matcher/schema/encrypt_schema_types.cpp',
        'matcher/schema/expression_internal_schema_all_elem_match_from_index.cpp',
        'matcher/schema/expression_internal_schema_allowed_properties.cpp',
        'matcher/schema/expression_internal_schema_cond.cpp',
        'matcher/schema/expression_internal_schema_eq.cpp',
        'matcher/schema/expression_internal_schema_fmod.cpp',
        'matcher/schema/expression_internal_schema_match_array_index.cpp',
        'matcher/schema/expression_internal_schema_num_array_items.cpp',
        'matcher/schema/expression_internal_schema_num_properties.cpp',
        'matcher/schema/expression_internal_schema_object_match.cpp',
        'matcher/schema/expression_internal_schema_root_doc_eq.cpp',
        'matcher/schema/expression_internal_schema_str_length.cpp',
        'matcher/schema/expression_internal_schema_unique_items.cpp',
        'matcher/schema/expression_internal_schema_xor.cpp',
        'matcher/schema/json_pointer.cpp',
        'matcher/schema/json_schema_parser.cpp',
        'pipeline/expression.cpp',
        'pipeline/expression_context.cpp',
        'pipeline/expression_dependencies.cpp',
        'pipeline/expression_function.cpp',
        'pipeline/expression_js_emit.cpp',
        'pipeline/expression_parser.idl',
        'pipeline/expression_test_api_version.cpp',
        'pipeline/expression_trigonometric.cpp',
        'pipeline/javascript_execution.cpp',
        'pipeline/make_js_function.cpp',
        'pipeline/monotonic_expression.cpp',
        'pipeline/name_expression.cpp',
        'pipeline/variables.cpp',
        'query/query_shape/cmd_with_let_shape.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/bson/util/bson_extract',
        '$BUILD_DIR/mongo/crypto/fle_crypto',
        '$BUILD_DIR/mongo/db/query/str_trim_utils',
        '$BUILD_DIR/mongo/scripting/scripting',
        '$BUILD_DIR/mongo/scripting/scripting_common',
        '$BUILD_DIR/mongo/util/pcre_util',
        '$BUILD_DIR/mongo/util/pcre_wrapper',
        '$BUILD_DIR/mongo/util/summation',
        'bson/dotted_path_support',
        'commands/test_commands_enabled',
        'common',
        'exec/document_value/document_value',
        'fts/fts_query_noop',
        'geo/geometry',
        'geo/geoparser',
        'matcher/path',
        'pipeline/aggregation_request_helper',
        'pipeline/dependencies',
        'pipeline/variable_validation',
        'query/boolean_simplification/boolean_simplification',
        'query/collation/collator_factory_interface',
        'query/collation/collator_interface',
        'query/datetime/date_time_support',
        'query/query_knob_configuration',
        'query/query_knobs',
        'query/query_settings/query_settings',
        'query/query_shape/query_shape_common',
        'sbe_values',
        'stats/counters',
        'update/pattern_cmp',
    ],
    LIBDEPS_PRIVATE=[
        "$BUILD_DIR/mongo/util/elapsed_tracker",
        "curop_failpoint_helpers",
        "mongohasher",
        "server_base",
        "service_context",
        "vector_clock",
    ],
)

env.Library(
    target='startup_recovery',
    source=[
        'repair.cpp',
        'startup_recovery.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'catalog/catalog_helpers',
        'catalog/collection_catalog',
        'catalog/collection_validation',
        'catalog/database_holder',
        'catalog/document_validation',
        'catalog/index_key_validate',
        'catalog/local_oplog_info',
        'catalog/multi_index_block',
        'change_stream_pre_image_util',
        'change_stream_serverless_helpers',
        'commands/mongod_fcv',
        'concurrency/exception_util',
        'dbdirectclient',
        'dbhelpers',
        'index_builds_coordinator_interface',
        'multitenancy',
        'rebuild_indexes',
        'record_id_helpers',
        'repl/oplog',
        'repl/repl_settings',
        'rw_concern_d',
        'server_feature_flags',
        'storage/storage_options',
        'storage/storage_repair_observer',
        'storage/storage_util',
        'timeseries/timeseries_extended_range',
        'vector_clock',
    ],
)

env.Library(
    target='index_commands_idl',
    source=[
        'create_indexes.idl',
        'drop_indexes.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/auth/authprivilege',
        '$BUILD_DIR/mongo/db/catalog/commit_quorum_options',
        'server_base',
    ],
)

env.Library(
    target='error_labels',
    source=[
        'error_labels.cpp',
    ],
    LIBDEPS=[
        'commands',
        'pipeline/lite_parsed_document_source',
        'session/logical_session_id',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/fail_point',
    ],
)

env.Library(
    target='shared_request_handling',
    source=[
        'initialize_operation_session_info.cpp',
        'transaction_validation.cpp',
    ],
    LIBDEPS=[
        'api_parameters',
        'error_labels',
        'repl/repl_coordinator_interface',
        'session/logical_session_cache',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/concurrency/spin_lock',
    ],
)

env.Library(
    target='api_parameters',
    source=[
        'api_parameters.cpp',
        'api_parameters.idl',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='validate_api_parameters',
    source=[
        'validate_api_parameters.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/transport/transport_layer_common',
        'api_parameters',
        'commands',
    ],
)

env.Library(
    target='operation_time_tracker',
    source=[
        'operation_time_tracker.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
        'service_context',
    ],
)

env.Library(
    target='operation_killer',
    source=[
        'operation_killer.cpp',
    ],
    LIBDEPS=[
        'service_context',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/auth/auth',
        '$BUILD_DIR/mongo/db/auth/authprivilege',
        'server_base',
    ],
)

env.Library(
    target='periodic_runner_job_abort_expired_transactions',
    source=[
        'periodic_runner_job_abort_expired_transactions.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/session/kill_sessions_local',
        '$BUILD_DIR/mongo/db/transaction/transaction',
        '$BUILD_DIR/mongo/util/periodic_runner',
    ],
)

env.Library(
    target='snapshot_window_options',
    source=[
        'snapshot_window_options.idl',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='signed_logical_time',
    source=[
        'signed_logical_time.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/crypto/sha1_block',
        'server_base',
    ],
)

env.Library(
    target='rs_local_client',
    source=[
        'rs_local_client.cpp',
    ],
    LIBDEPS_PRIVATE=[
        'concurrency/lock_manager',
        'dbdirectclient',
        'repl/repl_coordinator_interface',
        'rw_concern_d',
    ],
)

env.Library(
    target='keys_collection_document',
    source=[
        'keys_collection_document.idl',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='keys_collection_util',
    source=[
        'keys_collection_util.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/concurrency/exception_util',
        'dbhelpers',
        'keys_collection_document',
        'shard_role',
    ],
)

env.Library(
    target='keys_collection_client_direct',
    source=[
        'keys_collection_client_direct.cpp',
    ],
    LIBDEPS=[
        'keys_collection_document',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/s/catalog/sharding_catalog_client',
        '$BUILD_DIR/mongo/s/client/shard_interface',
        'rs_local_client',
        'server_base',
    ],
)

env.Library(
    target='keys_collection_client_sharded',
    source=[
        'keys_collection_client_sharded.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/s/catalog/sharding_catalog_client',
        'keys_collection_document',
        'server_base',
    ],
)

env.Library(
    target='vector_clock',
    source=[
        'key_generator.cpp',
        'keys_collection_cache.cpp',
        'keys_collection_manager.cpp',
        'keys_collection_manager.idl',
        'logical_time_validator.cpp',
        'time_proof_service.cpp',
        'vector_clock.cpp',
        'vector_clock_document.idl',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/transport/transport_layer_common',
        'auth/auth',
        'auth/authprivilege',
        'global_settings',
        'keys_collection_client_sharded',
        'keys_collection_document',
        'repl/repl_coordinator_interface',
        'server_base',
        'signed_logical_time',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/crypto/sha_block_${MONGO_CRYPTO}',
        '$BUILD_DIR/mongo/util/fail_point',
        'service_context',
    ],
)

env.Library(
    target='vector_clock_mutable',
    source=[
        'vector_clock_mutable.cpp',
    ],
    LIBDEPS=[
        'vector_clock',
    ],
)

env.Library(
    target='vector_clock_mongod',
    source=[
        's/topology_time_ticker.cpp',
        'vector_clock_mongod.cpp',
    ],
    LIBDEPS=[
        'vector_clock_mutable',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/s/grid',
        'concurrency/lock_manager',
        'dbdirectclient',
        'repl/replica_set_aware_service',
        'rw_concern_d',
        'server_base',
    ],
)

env.Library(
    target='vector_clock_trivial',
    source=[
        'vector_clock_trivial.cpp',
    ],
    LIBDEPS=[
        'vector_clock_mutable',
    ],
)

env.Library(
    target='logical_time_metadata_hook',
    source=[
        'vector_clock_metadata_hook.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/rpc/metadata',
        'operation_time_tracker',
        'vector_clock',
    ],
)

env.Library(
    target='feature_compatibility_version_metrics',
    source=[
        'feature_compatibility_version_metrics.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/commands/server_status_core',
        'server_base',
    ],
)

# This library is the base class for tests which require the presence of ServiceContext. However it
# does not perform any default initialisation of the relevant services, such as lockers and
# transaction resources, so any test which directly references it must perform its own
# initialisation.
#
# If a test requires the presence of a storage engine, it should use the
# service_context_d_test_fixture below directly.
env.Library(
    target='service_context_test_fixture',
    source=[
        'service_context_test_fixture.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/client/clientdriver_network',
        '$BUILD_DIR/mongo/transport/session_manager',
        '$BUILD_DIR/mongo/unittest/unittest',
        'service_context',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/auth/authmocks',
        '$BUILD_DIR/mongo/db/query/query_settings/manager',
        '$BUILD_DIR/mongo/util/clock_source_mock',
    ],
)

env.Library(
    target='service_context_d_test_fixture',
    source=[
        'service_context_d_test_fixture.cpp',
    ],
    LIBDEPS=[
        'service_context_test_fixture',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/clock_source_mock',
        '$BUILD_DIR/mongo/util/periodic_runner_factory',
        'auth/auth_impl_internal',
        'catalog/catalog_impl',
        'commands/mongod',
        'index_builds_coordinator_mongod',
        'op_observer/op_observer',
        's/sharding_runtime_d',
        'service_context_d',
        'storage/devnull/storage_devnull',
        'storage/storage_control',
        'storage/storage_options',
        'storage/wiredtiger/storage_wiredtiger',
    ],
)

env.Library(
    target='log_process_details',
    source=[
        'log_process_details.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/util/net/network',
        'server_options_servers',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/processinfo',
        'repl/repl_coordinator_interface',
        'repl/repl_settings',
        'repl/replica_set_messages',
    ],
)

env.Library(
    target='cursor_server_params',
    source=[
        'cursor_server_params.cpp',
        'cursor_server_params.idl',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

env.Library(
    target='generic_cursor',
    source=[
        'allocate_cursor_id.cpp',
        'generic_cursor.idl',
    ],
    LIBDEPS=[
        'repl/optime',
        'service_context',
    ],
    LIBDEPS_PRIVATE=[
        'server_base',
    ],
)

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

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

asioEnv = env.Clone()
asioEnv.InjectThirdParty('asio')

env.Library(
    target='traffic_recorder',
    source=[
        'traffic_recorder.cpp',
        'traffic_recorder_validators.cpp',
        'traffic_recorder.idl',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/commands/server_status_core',
        '$BUILD_DIR/mongo/db/service_context',
        '$BUILD_DIR/mongo/rpc/rpc',
        'server_base',
    ],
)

env.Library(
    target='traffic_reader',
    source=[
        'traffic_reader.cpp',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/rpc/message',
        '$BUILD_DIR/mongo/rpc/rpc',
    ],
)

env.Program(
    target='mongotrafficreader',
    source=[
        'traffic_reader_main.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/mongo/rpc/message',
        '$BUILD_DIR/mongo/util/signal_handlers',
        'concurrency/lock_manager',
        'traffic_reader',
    ],
)

env.Library(
    target='mongod_options_init',
    source=[
        'mongod_options_init.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/util/net/ssl_options_server' if get_option('ssl') == 'on' else '',
        '$BUILD_DIR/mongo/util/options_parser/options_parser',
        'mongod_options',
    ],
)

env.Library(
    target='mongod_initializers',
    source=[
        # NOTE: If you add an additional source file here, please delete
        # the file db/mongod_initializers.cpp.
        'mongod_initializers.cpp',
    ],
    LIBDEPS_PRIVATE=[
        # NOTE: If you need to add a static or mongo initializer to mongod startup,
        # please add that library here, as a private library dependency.
        '$BUILD_DIR/mongo/executor/async_rpc_error_info',
        '$BUILD_DIR/mongo/executor/network_interface_factory',
        '$BUILD_DIR/mongo/rpc/rpc',
        '$BUILD_DIR/mongo/s/commands/cluster_commands',
        '$BUILD_DIR/mongo/s/commands/sharded_cluster_commands',
        '$BUILD_DIR/mongo/s/commands/sharded_cluster_sharding_commands',
        '$BUILD_DIR/mongo/scripting/scripting_server',
        '$BUILD_DIR/mongo/transport/grpc/grpc_transport_server_options'
        if shouldBuildGRPC(env) else [],
        '$BUILD_DIR/mongo/transport/message_compressor_options_server',
        '$BUILD_DIR/mongo/transport/session_manager',
        '$BUILD_DIR/mongo/transport/transport_layer_manager',
        '$BUILD_DIR/mongo/util/clock_sources',
        '$BUILD_DIR/mongo/util/elapsed_tracker',
        '$BUILD_DIR/mongo/util/fail_point',
        '$BUILD_DIR/mongo/util/latch_analyzer'
        if get_option('use-diagnostic-latches') == 'on' else [],
        '$BUILD_DIR/mongo/util/net/network',
        '$BUILD_DIR/mongo/util/ntservice',
        '$BUILD_DIR/mongo/util/options_parser/options_parser_init',
        '$BUILD_DIR/mongo/util/periodic_runner_factory',
        '$BUILD_DIR/mongo/util/pin_code_segments' if env.TargetOSIs('linux') else [],
        '$BUILD_DIR/mongo/util/testing_options',
        '$BUILD_DIR/mongo/util/version_impl',
        '$BUILD_DIR/mongo/watchdog/watchdog_mongod',
        '$BUILD_DIR/third_party/shim_snappy',
        'admission/queues_server_status_section',
        'auth/auth_op_observer',
        'auth/authserver',
        'bson/dotted_path_support',
        'catalog/catalog_impl',
        'catalog/collection_options',
        'catalog/document_validation',
        'catalog/health_log_interface',
        'catalog/index_key_validate',
        'collection_index_usage_tracker',
        'commands/mongod',
        'commands/mongod_fcv',
        'commands/server_status_servers',
        'common',
        'concurrency/flow_control_ticketholder',
        'curop_metrics',
        'dbdirectclient',
        'dbhelpers',
        'default_max_time_ms_cluster_parameter',
        'exec/working_set',
        'feature_compatibility_version_metrics',
        'ftdc/ftdc_mongod',
        'fts/ftsmongod',
        'index/index_access_method',
        'index_builds_coordinator_mongod',
        'introspect',
        'keys_collection_client_direct',
        'logical_time_metadata_hook',
        'matcher/expressions_mongod_only',
        'mirror_maestro',
        'mongod_options',
        'mongod_options_init',
        'periodic_runner_job_abort_expired_transactions',
        'pipeline/aggregation',
        'pipeline/process_interface/mongod_process_interface_factory',
        'query_exec',
        'read_concern_d_impl',
        'read_write_concern_defaults',
        'repl/oplog_application',
        'repl/oplog_buffer_blocking_queue',
        'repl/oplog_buffer_collection',
        'repl/oplog_buffer_proxy',
        'repl/repl_coordinator_impl',
        'repl/repl_set_commands',
        'repl/repl_settings',
        'repl/replica_set_aware_service',
        'repl/rs_rollback',
        'repl/serveronly_repl',
        'repl/storage_interface_impl',
        'repl/topology_coordinator',
        'rw_concern_d',
        'serverless/shard_split_commands',
        'session/kill_sessions_local',
        'session/service_liaison_mongod',
        'session/sessions_collection_rs',
        'shard_role',
        'startup_warnings_mongod',
        'stats/change_collection_server_status',
        'stats/counters',
        'stats/latency_server_stats',
        'stats/serveronly_stats',
        'stats/top',
        'storage/backup_cursor_hooks',
        'storage/devnull/storage_devnull',
        'storage/encryption_hooks',
        'storage/flow_control',
        'storage/flow_control_parameters',
        'storage/storage_control',
        'storage/storage_engine_lock_file',
        'storage/storage_engine_metadata',
        'storage/storage_init_d',
        'storage/storage_options',
        'system_index',
        'timeseries/bucket_compression_failure',
        'traffic_recorder',
        'ttl_collection_cache',
        'ttl_d',
        'update/update_driver',
        'update_index_data',
        'windows_options' if env.TargetOSIs('windows') else [],
    ],
    LIBDEPS=[
        # NOTE: This list must remain empty. Please only add to LIBDEPS_PRIVATE
    ],
)

env.Library(
    target='mongod_main',
    source=[
        'mongod_main.cpp',
        'logical_session_cache_factory_mongod.cpp',
        'read_write_concern_defaults_cache_lookup_mongod.cpp',
    ],
    LIBDEPS_PRIVATE=[
        # NOTE: Do not add new libdeps (public or private) here unless required by the linker to
        # satisfy symbol dependencies from the files listed above in `sources`. If you need to add a
        # library to inject a static or mongo initializer to mongod, please add that library as a
        # private libdep of mongod_initializers.
        '$BUILD_DIR/mongo/client/clientdriver_minimal',
        '$BUILD_DIR/mongo/db/auth/user_cache_invalidator',
        '$BUILD_DIR/mongo/idl/cluster_server_parameter',
        '$BUILD_DIR/mongo/idl/cluster_server_parameter_initializer',
        '$BUILD_DIR/mongo/idl/cluster_server_parameter_op_observer',
        '$BUILD_DIR/mongo/s/catalog/sharding_catalog_client_impl',
        '$BUILD_DIR/mongo/s/resource_yielders',
        '$BUILD_DIR/mongo/s/sessions_collection_sharded',
        '$BUILD_DIR/mongo/s/sharding_initialization',
        '$BUILD_DIR/mongo/s/startup_initialization',
        '$BUILD_DIR/mongo/scripting/scripting',
        '$BUILD_DIR/mongo/transport/ingress_handshake_metrics',
        '$BUILD_DIR/mongo/transport/service_executor',
        '$BUILD_DIR/mongo/transport/session_manager',
        '$BUILD_DIR/mongo/transport/transport_layer_manager',
        '$BUILD_DIR/mongo/util/allocator_thread',
        '$BUILD_DIR/mongo/util/cmdline_utils/cmdline_utils',
        '$BUILD_DIR/mongo/util/concurrency/thread_pool',
        '$BUILD_DIR/mongo/util/latch_analyzer'
        if get_option('use-diagnostic-latches') == 'on' else [],
        '$BUILD_DIR/mongo/util/net/http_client_impl',
        '$BUILD_DIR/mongo/util/net/ssl_manager',
        '$BUILD_DIR/mongo/util/periodic_runner_factory',
        '$BUILD_DIR/mongo/util/signal_handlers',
        '$BUILD_DIR/mongo/watchdog/watchdog_mongod',
        'admission/execution_control',
        'auth/auth_op_observer',
        'catalog/catalog_helpers',
        'catalog/catalog_impl',
        'catalog/collection_crud',
        'catalog/health_log',
        'catalog/health_log_interface',
        'change_collection_expired_change_remover',
        'change_stream_change_collection_manager',
        'change_stream_options_manager',
        'change_streams_cluster_parameter',
        'commands/mongod',
        'commands/mongod_fsync',
        'commands/test_commands',
        'concurrency/flow_control_ticketholder',
        'fle_crud_mongod',
        'ftdc/ftdc_mongod',
        'index/index_access_method',
        'index_builds_coordinator_mongod',
        'keys_collection_client_direct',
        'log_process_details',
        'mirror_maestro',
        'mongod_initializers',
        'mongod_options',
        'op_observer/change_stream_pre_images_op_observer',
        'op_observer/fallback_op_observer',
        'op_observer/fcv_op_observer',
        'op_observer/find_and_modify_images_op_observer',
        'op_observer/op_observer',
        'op_observer/op_observer_impl',
        'op_observer/operation_logger_impl',
        'op_observer/operation_logger_transaction_proxy',
        'op_observer/user_write_block_mode_op_observer',
        'periodic_runner_job_abort_expired_transactions',
        'pipeline/change_stream_expired_pre_image_remover',
        'pipeline/process_interface/mongod_process_interface_factory',
        'query/query_settings/manager',
        'query/stats/stats',
        'repl/drop_pending_collection_reaper',
        'repl/initial_syncer',
        'repl/repl_coordinator_impl',
        'repl/replication_recovery',
        'repl/serveronly_repl',
        'repl/shard_merge_recipient_service',
        'repl/storage_interface_impl',
        'repl/tenant_migration_donor_service',
        'repl/tenant_migration_recipient_service',
        'repl/topology_coordinator',
        'repl/wait_for_majority_service',
        's/query_analysis_writer',
        's/sessions_collection_config_server',
        's/sharding_commands_d',
        's/sharding_runtime_d',
        "server_lifecycle_monitor",
        'serverinit',
        'serverless/shard_split_donor_service',
        'service_context_d',
        'session/kill_sessions_local',
        'session/kill_sessions_remote',
        'session/service_liaison_mongod',
        'session/session_catalog_mongod',
        'session/sessions_collection_rs',
        'set_change_stream_state_coordinator',
        'shard_role',
        'startup_recovery',
        'startup_warnings_mongod',
        'storage/backup_cursor_hooks',
        'storage/disk_space_monitor',
        'storage/flow_control',
        'storage/flow_control_parameters',
        'storage/oplog_cap_maintainer_thread',
        'storage/storage_control',
        'system_index',
        'timeseries/timeseries_op_observer',
        'ttl_d',
        'vector_clock',
    ],
    LIBDEPS_TAGS=[
        # NOTE: This library must not link publicly. Please only add to LIBDEPS_PRIVATE
        'lint-no-public-deps',
    ],
)

if env.TargetOSIs('windows'):
    generatedDbManifest = env.Substfile(
        'mongod.manifest.in',
        SUBST_DICT=[
            ('@mongo_version_major@', version_parts[0]),
            ('@mongo_version_minor@', version_parts[1]),
            ('@mongo_version_patch@', version_parts[2]),
            ('@mongo_version_extra@', version_parts[3]),
            ('@mongo_version_extra_str@', version_extra),
        ],
    )

    env.Alias('generated-sources', generatedDbManifest)
    env.Depends('mongod.res', generatedDbManifest)

env.Program(
    target='mongod',
    source=[
        'mongod.cpp',
    ] + env.WindowsResourceFile('mongod.rc'),
    LIBDEPS=[
        # NOTE: Do not add new libdeps (public or private) here unless required by the linker to
        # satisfy symbol dependencies from the files listed above in `sources`. If you need to add a
        # library to inject a static or mongo initializer to mongod, please add that library as a
        # private libdep of mongod_initializers.
        'mongod_main',
        'server_base',
    ],
    AIB_COMPONENT='mongod',
    AIB_COMPONENTS_EXTRA=[
        'core',
        'default',
        'devcore',
        'dist',
        'dist-test',
        'integration-tests',
        'serverless',
        'serverless-test',
        'servers',
    ],
)

env.Library(
    target='op_msg_fuzzer_fixture',
    source=[
        'op_msg_fuzzer_fixture.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/transport/transport_layer_mock',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/rpc/rpc',
        '$BUILD_DIR/mongo/transport/session_manager',
        '$BUILD_DIR/mongo/unittest/unittest',
        '$BUILD_DIR/mongo/util/periodic_runner_factory',
        'auth/auth',
        'auth/authmocks',
        'catalog/catalog_impl',
        'catalog/database_holder',
        'op_observer/op_observer',
        'repl/replmocks',
        's/sharding_runtime_d',
        'server_base',
        'service_context_d',
        'stats/top',
        'storage/storage_control',
        'storage/storage_options',
        'storage/wiredtiger/storage_wiredtiger',
    ],
)

# TODO(SERVER-45266) This could be part of db_unittest_test but it needs to mutate
# storageGlobalParams.
env.CppUnitTest(
    target='op_msg_fuzzer_fixture_test',
    source=[
        'op_msg_fuzzer_fixture_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/rpc/rpc',
        'op_msg_fuzzer_fixture',
        'server_base',
    ],
)

env.Library(
    target='commands_test_example',
    source=[
        'commands_test_example.idl',
    ],
    LIBDEPS_PRIVATE=[
        'commands',
        'server_base',
    ],
)

envWithAsio = env.Clone()
envWithAsio.InjectThirdParty(libraries=['asio'])

if wiredtiger:
    envWithAsio.CppUnitTest(
        target='db_unittest_test',
        source=[
            'bulk_write_shard_test.cpp',
            'cancelable_operation_context_test.cpp',
            'catalog_raii_test.cpp',
            'change_collection_expired_change_remover_test.cpp',
            'client_context_test.cpp',
            'client_strand_test.cpp',
            'collection_index_usage_tracker_test.cpp',
            'commands_test.cpp',
            'curop_test.cpp',
            'curop_stats_test.cpp',
            'cursor_manager_test.cpp',
            'd_concurrency_test.cpp',
            'database_name_test.cpp',
            'db_raii_multi_collection_test.cpp',
            'db_raii_test.cpp',
            'dbdirectclient_test.cpp',
            'dbmessage_test.cpp',
            'error_labels_test.cpp',
            'explain_test.cpp',
            'field_parser_test.cpp',
            'field_ref_set_test.cpp',
            'field_ref_test.cpp',
            'fle_crud_test.cpp',
            'global_index_test.cpp',
            'hasher_test.cpp',
            'index_build_entry_helpers_test.cpp',
            'index_builds_coordinator_mongod_test.cpp',
            'index_builds_coordinator_test.cpp',
            'keypattern_test.cpp',
            'keys_collection_document_test.cpp',
            'logical_time_test.cpp',
            'mirroring_sampler_test.cpp',
            'multi_key_path_tracker_test.cpp',
            'namespace_string_test.cpp',
            'operation_context_test.cpp',
            'operation_cpu_timer_test.cpp',
            'operation_id_test.cpp',
            'operation_time_tracker_test.cpp',
            'persistent_task_store_test.cpp',
            'query/fle/encrypted_predicate_test_fixtures.cpp',
            'query/fle/equality_predicate_test.cpp',
            'query/fle/query_rewriter_test.cpp',
            'query/fle/range_predicate_test.cpp',
            'query/fle/range_validator_test.cpp',
            'read_write_concern_defaults_test.cpp',
            'read_write_concern_provenance_test.cpp',
            'record_id_test.cpp',
            'resource_yielder_test.cpp',
            'server_options_test.cpp',
            'server_parameter_insert_max_batch_size_test.cpp',
            'service_liaison_mock.cpp',
            'session/internal_session_pool_test.cpp',
            'session/internal_transactions_reap_service_test.cpp',
            'session/logical_session_cache_test.cpp',
            'session/logical_session_id_test.cpp',
            'session/session_catalog_mongod_test.cpp',
            'session/session_catalog_test.cpp',
            'shard_id_test.cpp',
            'shard_role_test.cpp',
            'startup_warnings_mongod_thp_test.cpp',
            'thread_client_test.cpp',
            'time_proof_service_test.cpp',
            'ttl_collection_cache_test.cpp',
            'ttl_test.cpp',
            'update_index_data_test.cpp',
            'vector_clock_mongod_test.cpp',
            'vector_clock_test.cpp',
            'vector_clock_test_fixture.cpp',
            'wire_version_test.cpp',
            'write_concern_test.cpp',
            'write_concern_options_test.cpp',
        ],
        LIBDEPS=[
            '$BUILD_DIR/mongo/bson/util/bson_extract',
            '$BUILD_DIR/mongo/client/read_preference',
            '$BUILD_DIR/mongo/crypto/aead_encryption',
            '$BUILD_DIR/mongo/crypto/encrypted_field_config',
            '$BUILD_DIR/mongo/crypto/fle_crypto',
            '$BUILD_DIR/mongo/executor/async_timer_mock',
            '$BUILD_DIR/mongo/rpc/command_status',
            '$BUILD_DIR/mongo/rpc/rpc',
            '$BUILD_DIR/mongo/shell/kms_idl',
            '$BUILD_DIR/mongo/transport/transport_layer_mock',
            '$BUILD_DIR/mongo/util/clock_source_mock',
            '$BUILD_DIR/mongo/util/net/network',
            '$BUILD_DIR/mongo/util/net/ssl_options_server',
            '$BUILD_DIR/mongo/util/periodic_runner_factory',
            '$BUILD_DIR/mongo/util/progress_meter',
            'admission/ticketholder_manager',
            'auth/auth',
            'auth/authmocks',
            'auth/security_token',
            'catalog/catalog_test_fixture',
            'catalog/collection_crud',
            'catalog/collection_uuid_mismatch_info',
            'catalog/database_holder',
            'catalog/index_build_entry_idl',
            'change_collection_expired_change_remover',
            'change_stream_change_collection_manager',
            'change_stream_options_manager',
            'change_stream_serverless_helpers',
            'change_streams_cluster_parameter',
            'collection_index_usage_tracker',
            'commands',
            'commands/bulk_write_command',
            'commands_test_example',
            'common',
            'dbmessage',
            'fle_crud',
            'fle_mocks',
            'global_index',
            'index_build_entry_helpers',
            'index_builds_coordinator_mongod',
            'keys_collection_client_direct',
            'keys_collection_document',
            'mirror_maestro',
            'mongohasher',
            'multitenancy',
            'op_observer/op_observer',
            'op_observer/op_observer_impl',
            'op_observer/operation_logger_impl',
            'operation_time_tracker',
            'ops/write_ops',
            'pipeline/change_stream_expired_pre_image_remover',
            'query/common_query_enums_and_helpers',
            'query/query_test_service_context',
            'query_exec',
            'read_write_concern_defaults_mock',
            'record_id_helpers',
            'repl/image_collection_entry',
            'repl/repl_coordinator_interface',
            'repl/repl_server_parameters',
            'repl/replica_set_aware_service',
            'repl/replmocks',
            'repl/storage_interface_impl',
            'repl/tenant_migration_access_blocker',
            'rw_concern_d',
            's/shard_server_test_fixture',
            'server_base',
            'server_options_servers',
            'server_parameter_insert_max_batch_size',
            'session/logical_session_cache_impl',
            'session/logical_session_id_helpers',
            'session/session_catalog_mongod',
            'session/sessions_collection',
            'session/sessions_collection_mock',
            'signed_logical_time',
            'snapshot_window_options',
            'startup_recovery',
            'startup_warnings_mongod',
            'storage/wiredtiger/storage_wiredtiger',
            'ttl_collection_cache',
            'ttl_d',
            'update_index_data',
            'vector_clock',
        ],
    )

# These unit tests rely on the config_server_test_fixture, which
# globally alters the state of the system to be in config server
# mode. The other tests are not compatible with that setting.
envWithAsio.CppUnitTest(
    target='db_unittest_with_config_server_test_fixture_test',
    source=[
        'key_generator_update_test.cpp',
        'keys_collection_cache_test.cpp',
        'keys_collection_manager_sharding_test.cpp',
        'logical_time_validator_test.cpp',
    ],
    LIBDEPS=[
        'auth/authmocks',
        'keys_collection_client_direct',
        's/config_server_test_fixture',
        'vector_clock',
    ],
)

asioEnv.CppIntegrationTest(
    target='db_integration_test',
    source=[
        'nesting_depth_test.cpp',
        'exhaust_cursor_currentop_integration_test.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/client/clientdriver_network',
        '$BUILD_DIR/mongo/executor/network_interface_fixture',
        '$BUILD_DIR/mongo/rpc/message',
        '$BUILD_DIR/mongo/transport/transport_layer_egress_init',
        '$BUILD_DIR/mongo/util/version_impl',
    ],
)

env.CppLibfuzzerTest(
    target='op_msg_fuzzer',
    source=[
        'op_msg_fuzzer.cpp',
    ],
    LIBDEPS=[
        'op_msg_fuzzer_fixture',
        'server_base',
    ],
)

env.Benchmark(
    target='commands_bm',
    source=[
        'commands_bm.cpp',
    ],
    LIBDEPS=[
        'server_base',
    ],
)

env.Benchmark(
    target='operation_cpu_timer_bm',
    source=[
        'operation_cpu_timer_bm.cpp',
    ],
    LIBDEPS=[
        'service_context_non_d',
        'shard_role_api',
    ],
)

env.Benchmark(
    target='d_concurrency_bm',
    source=[
        'd_concurrency_bm.cpp',
    ],
    LIBDEPS=[
        'service_context_non_d',
        'shard_role_api',
    ],
)

env.Benchmark(
    target='service_entry_point_common_bm',
    source=[
        'service_entry_point_common_bm.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/util/periodic_runner_factory',
        'auth/authserver',
        'catalog/catalog_impl',
        'commands/standalone',
        'dbdirectclient',
        'index_builds_coordinator_mongod',
        'mongod_options_init',
        'op_observer/op_observer',
        'read_write_concern_defaults_mock',
        'repl/replmocks',
        'repl/storage_interface_impl',
        's/sharding_runtime_d',
        'server_base',
        'service_context_d',
        'storage/storage_control',
        'storage/wiredtiger/storage_wiredtiger',
        'vector_clock_mongod',
    ],
)

env.Benchmark(
    target='namespace_string_bm',
    source=[
        'namespace_string_bm.cpp',
    ],
    LIBDEPS=[
        'server_base',
    ],
)

env.Benchmark(
    target='collection_acquisition_bm',
    source=[
        'collection_acquisition_bm.cpp',
    ],
    LIBDEPS=[
        'repl/replmocks',
        'service_context_d_test_fixture',
        'shard_role',
        'shard_role_api',
    ],
)

bmEnv = env.Clone()
bmEnv.InjectThirdParty(libraries=["benchmark"])
bmEnv.Library(
    target='bonsai_query_bm_fixture',
    source=[
        'bonsai_query_bm_fixture.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/base',
        '$BUILD_DIR/third_party/shim_benchmark',
    ],
)

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

env.CppUnitTest(
    target="server_lifecycle_monitor_test",
    source=[
        "server_lifecycle_monitor_test.cpp",
    ],
    LIBDEPS=[
        "server_lifecycle_monitor",
    ],
)
