# -*- mode: python; -*-
# based off of boost fork here: https://github.com/mongodb-forks/boost/tree/boost-1.70.0-mongo-v4.4
Import("env")

env = env.Clone()

# GCC emits a warning on both v2 and v3 toolchains when compiling filesystem. 
# We should check if this is still needed when doing boost upgrades in the future.
if env.ToolchainIs('GCC'):
    env.AppendUnique(CXXFLAGS=['-Wno-overloaded-virtual'])

env.Library(
    target='boost_system', 
    source=[
        'libs/system/src/error_code.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/boost_assert_shim',
    ],
)

env.Library(
    target='boost_filesystem', 
    source=[
        'libs/filesystem/src/codecvt_error_category.cpp',
        'libs/filesystem/src/operations.cpp',
        'libs/filesystem/src/path.cpp',
        'libs/filesystem/src/path_traits.cpp',
        'libs/filesystem/src/portability.cpp',
        'libs/filesystem/src/unique_path.cpp',
        'libs/filesystem/src/utf8_codecvt_facet.cpp',
        'libs/filesystem/src/windows_file_codecvt.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/boost_assert_shim',
        'boost_system',
    ],
)

env.Library(
    target='boost_program_options', 
    source=[
        'libs/program_options/src/cmdline.cpp',
        'libs/program_options/src/config_file.cpp',
        'libs/program_options/src/convert.cpp',
        'libs/program_options/src/options_description.cpp',
        'libs/program_options/src/parsers.cpp',
        'libs/program_options/src/positional_options.cpp',
        'libs/program_options/src/split.cpp',
        'libs/program_options/src/utf8_codecvt_facet.cpp',
        'libs/program_options/src/value_semantic.cpp',
        'libs/program_options/src/variables_map.cpp',
        'libs/program_options/src/winmain.cpp',
    ],
    # Because `::environ` is resolved in `/usr/lib/crt1.o` on FreeBSD, this library needs to be
    # marked `incomplete` on FreeBSD.
    LIBDEPS_TAGS=[] if not env.TargetOSIs('freebsd') else [
        'illegal_cyclic_or_unresolved_dependencies_whitelisted',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/boost_assert_shim',
    ],
)

env.Library(
    target='boost_iostreams', 
    source=[
        'libs/iostreams/src/file_descriptor.cpp',
        'libs/iostreams/src/mapped_file.cpp',
        ],
        LIBDEPS=[
            '$BUILD_DIR/mongo/boost_assert_shim',
            'boost_system',
        ])

boost_thread_source = dict( 
    posix=[
        'libs/thread/src/pthread/once.cpp', 
        'libs/thread/src/pthread/thread.cpp'
    ], 
    windows=[
        'libs/thread/src/win32/thread.cpp', 
        'libs/thread/src/win32/thread_primitives.cpp',
        'libs/thread/src/win32/tss_dll.cpp',
        'libs/thread/src/win32/tss_pe.cpp',
    ] 
).get(env['TARGET_OS_FAMILY'], 'UNKNOWN_OS_FAMILY_FOR_BOOST_THREADS__%s' % env['TARGET_OS_FAMILY'])

boost_thread_defines = dict( 
    posix=['BOOST_THREAD_PTHREAD'], 
    windows=['BOOST_THREAD_WIN32'] 
).get(env['TARGET_OS_FAMILY'], 'UNKNOWN_OS_FAMILY_FOR_BOOST_THREADS__%s' % env['TARGET_OS_FAMILY'])

threadlib_env = env.Clone()
threadlib_env.Append(CPPDEFINES=['BOOST_THREAD_BUILD_LIB'] + boost_thread_defines)
threadlib_env.Library(
    target='boost_thread', 
    source=[
        'libs/thread/src/future.cpp',
    ] + boost_thread_source,
    LIBDEPS=[
        '$BUILD_DIR/mongo/boost_assert_shim',
    ]
)

loglib_env = env.Clone()
loglib_env.AppendUnique(
    CPPDEFINES=[
        'BOOST_LOG_USE_COMPILER_TLS',
        'BOOST_LOG_USE_STD_REGEX',
        'BOOST_LOG_WITHOUT_DEFAULT_FACTORIES',
        'BOOST_LOG_WITHOUT_IPC',
        'BOOST_LOG_WITHOUT_SETTINGS_PARSERS',
    ])
if env.ToolchainIs('msvc'):
    # warning C4828: The file contains a character starting at offset 0x6009 that is illegal in 
    # the current source character set (codepage 65001).
    loglib_env.AppendUnique(CCFLAGS=['/wd4828'])

    # permissions.cpp includes windows.h directly, causing issues with boost winapi (error C2116 and C2733)
    loglib_env.AppendUnique(
    CPPDEFINES=[
        'BOOST_USE_WINDOWS_H',
    ])

loglib_env.Library(
    target='boost_log', 
    source=[
        'libs/log/src/attribute_name.cpp',
        'libs/log/src/attribute_set.cpp',
        'libs/log/src/attribute_value_set.cpp',
        'libs/log/src/code_conversion.cpp',
        'libs/log/src/core.cpp',
        'libs/log/src/date_time_format_parser.cpp',
        'libs/log/src/default_attribute_names.cpp',
        'libs/log/src/default_sink.cpp',
        'libs/log/src/dump.cpp',
        'libs/log/src/event.cpp',
        'libs/log/src/exceptions.cpp',
        'libs/log/src/format_parser.cpp',
        'libs/log/src/global_logger_storage.cpp',
        'libs/log/src/named_scope.cpp',
        'libs/log/src/named_scope_format_parser.cpp',
        'libs/log/src/once_block.cpp',
        'libs/log/src/permissions.cpp',
        'libs/log/src/process_id.cpp',
        'libs/log/src/process_name.cpp',
        'libs/log/src/record_ostream.cpp',
        'libs/log/src/severity_level.cpp',
        'libs/log/src/spirit_encoding.cpp',
        'libs/log/src/syslog_backend.cpp' if not env.TargetOSIs('windows') else [],
        'libs/log/src/text_file_backend.cpp',
        'libs/log/src/text_multifile_backend.cpp',
        'libs/log/src/text_ostream_backend.cpp',
        'libs/log/src/thread_id.cpp',
        'libs/log/src/thread_specific.cpp',
        'libs/log/src/threadsafe_queue.cpp',
        'libs/log/src/timer.cpp',
        'libs/log/src/timestamp.cpp',
        'libs/log/src/trivial.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/boost_assert_shim',
        'boost_filesystem',
        'boost_thread',
    ]
)
