Import('env')
Import('debugBuild')
protobuf_env = env.Clone(NINJA_GENSOURCE_INDEPENDENT=True)

protobuf_env.InjectThirdParty(libraries=['abseil-cpp', 'zlib'])

protobuf_env.Append(CPPDEFINES=[
    'HAVE_CONFIG_H',
    ('HAVE_ZLIB', '1'),
    ('PIC', '1'),
], )

if protobuf_env.ToolchainIs('gcc', 'clang'):
    protobuf_env.Append(
        CPPDEFINES=[
            ('HAVE_PTHREAD', '1'),
        ],
        CCFLAGS=[
            '-Wno-sign-compare',
            '-Wno-overloaded-virtual',
        ],
    )
    if debugBuild:
        protobuf_env.Append(CCFLAGS=['-Wno-error'])

if protobuf_env.ToolchainIs('gcc'):
    protobuf_env.Append(
        CPPDEFINES=[],
        CCFLAGS=[
            '-Wno-stringop-overflow',
            '-Wno-error=deprecated',
            '-Wno-error=attributes',
        ],
    )

if protobuf_env.ToolchainIs('msvc'):
    protobuf_env.Append(
        CCFLAGS=[
            '/wd4018',  # signed/unsigned mismatch
            '/wd4065',  # switch statement contains 'default' but no 'case' labels
            '/wd4146',  # unary minus operator applied to unsigned type, result still unsigned
        ],
        CPPDEFINES=[
            '_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING',
        ],
    )

protobuf_root = protobuf_env.Dir(".").srcnode()
protobuf_platform = protobuf_root.Dir("platform/${TARGET_OS}_${TARGET_ARCH}")
protobuf_env.Append(CPPPATH=[
    protobuf_root.Dir("dist"),
    protobuf_root.Dir("dist/src"),
], )

# Passing this up to the main env
env['PROTOC_DESCRIPTOR_PROTO'] = protobuf_env.File(
    "dist/src/google/protobuf/descriptor.proto").abspath

utf8_validity_env = protobuf_env.Clone()
utf8_validity_env.Append(CPPPATH=[
    protobuf_root.Dir('dist/third_party/utf8_range'),
], )

utf8_validity_env.Library(
    target='utf8_validity',
    source=[
        "dist/third_party/utf8_range/utf8_validity.cc",
    ],
)

protobuf_env.Append(CPPPATH=[
    protobuf_root.Dir('dist/third_party/utf8_range'),
])

protobuf_env.Library(
    target='protobuf',
    source=[
        "dist/src/google/protobuf/any.cc",
        "dist/src/google/protobuf/any.pb.cc",
        "dist/src/google/protobuf/any_lite.cc",
        "dist/src/google/protobuf/api.pb.cc",
        "dist/src/google/protobuf/arena.cc",
        "dist/src/google/protobuf/arena_align.cc",
        "dist/src/google/protobuf/arenastring.cc",
        "dist/src/google/protobuf/arenaz_sampler.cc",
        "dist/src/google/protobuf/compiler/importer.cc",
        "dist/src/google/protobuf/compiler/parser.cc",
        "dist/src/google/protobuf/cpp_features.pb.cc",
        "dist/src/google/protobuf/descriptor.cc",
        "dist/src/google/protobuf/descriptor.pb.cc",
        "dist/src/google/protobuf/descriptor_database.cc",
        "dist/src/google/protobuf/duration.pb.cc",
        "dist/src/google/protobuf/dynamic_message.cc",
        "dist/src/google/protobuf/empty.pb.cc",
        "dist/src/google/protobuf/extension_set.cc",
        "dist/src/google/protobuf/extension_set_heavy.cc",
        "dist/src/google/protobuf/feature_resolver.cc",
        "dist/src/google/protobuf/field_mask.pb.cc",
        "dist/src/google/protobuf/generated_enum_util.cc",
        "dist/src/google/protobuf/generated_message_bases.cc",
        "dist/src/google/protobuf/generated_message_reflection.cc",
        "dist/src/google/protobuf/generated_message_tctable_full.cc",
        "dist/src/google/protobuf/generated_message_tctable_gen.cc",
        "dist/src/google/protobuf/generated_message_tctable_lite.cc",
        "dist/src/google/protobuf/generated_message_util.cc",
        "dist/src/google/protobuf/implicit_weak_message.cc",
        "dist/src/google/protobuf/inlined_string_field.cc",
        "dist/src/google/protobuf/internal_message_util.cc",
        "dist/src/google/protobuf/io/coded_stream.cc",
        "dist/src/google/protobuf/io/gzip_stream.cc",
        "dist/src/google/protobuf/io/io_win32.cc",
        "dist/src/google/protobuf/io/printer.cc",
        "dist/src/google/protobuf/io/strtod.cc",
        "dist/src/google/protobuf/io/tokenizer.cc",
        "dist/src/google/protobuf/io/zero_copy_sink.cc",
        "dist/src/google/protobuf/io/zero_copy_stream.cc",
        "dist/src/google/protobuf/io/zero_copy_stream_impl.cc",
        "dist/src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
        "dist/src/google/protobuf/json/internal/lexer.cc",
        "dist/src/google/protobuf/json/internal/message_path.cc",
        "dist/src/google/protobuf/json/internal/parser.cc",
        "dist/src/google/protobuf/json/internal/unparser.cc",
        "dist/src/google/protobuf/json/internal/untyped_message.cc",
        "dist/src/google/protobuf/json/internal/writer.cc",
        "dist/src/google/protobuf/json/internal/zero_copy_buffered_stream.cc",
        "dist/src/google/protobuf/json/json.cc",
        "dist/src/google/protobuf/map.cc",
        "dist/src/google/protobuf/map_field.cc",
        "dist/src/google/protobuf/message.cc",
        "dist/src/google/protobuf/message_lite.cc",
        "dist/src/google/protobuf/parse_context.cc",
        "dist/src/google/protobuf/port.cc",
        "dist/src/google/protobuf/raw_ptr.cc",
        "dist/src/google/protobuf/reflection_mode.cc",
        "dist/src/google/protobuf/reflection_ops.cc",
        "dist/src/google/protobuf/repeated_field.cc",
        "dist/src/google/protobuf/repeated_ptr_field.cc",
        "dist/src/google/protobuf/service.cc",
        "dist/src/google/protobuf/source_context.pb.cc",
        "dist/src/google/protobuf/struct.pb.cc",
        "dist/src/google/protobuf/stubs/common.cc",
        "dist/src/google/protobuf/text_format.cc",
        "dist/src/google/protobuf/timestamp.pb.cc",
        "dist/src/google/protobuf/type.pb.cc",
        "dist/src/google/protobuf/unknown_field_set.cc",
        "dist/src/google/protobuf/util/delimited_message_util.cc",
        "dist/src/google/protobuf/util/field_comparator.cc",
        "dist/src/google/protobuf/util/field_mask_util.cc",
        "dist/src/google/protobuf/util/message_differencer.cc",
        "dist/src/google/protobuf/util/time_util.cc",
        "dist/src/google/protobuf/util/type_resolver_util.cc",
        "dist/src/google/protobuf/wire_format.cc",
        "dist/src/google/protobuf/wire_format_lite.cc",
        "dist/src/google/protobuf/wrappers.pb.cc",
    ],
    LIBDEPS=[
        '$BUILD_DIR/third_party/abseil-cpp/absl_base',
        '$BUILD_DIR/third_party/abseil-cpp/absl_debugging_internal',
        '$BUILD_DIR/third_party/abseil-cpp/absl_die_if_null',
        '$BUILD_DIR/third_party/abseil-cpp/absl_flags',
        '$BUILD_DIR/third_party/abseil-cpp/absl_hash',
        '$BUILD_DIR/third_party/abseil-cpp/absl_log_initialize',
        '$BUILD_DIR/third_party/abseil-cpp/absl_log_internal_check_op',
        '$BUILD_DIR/third_party/abseil-cpp/absl_log_internal_message',
        '$BUILD_DIR/third_party/abseil-cpp/absl_log_severity',
        '$BUILD_DIR/third_party/abseil-cpp/absl_status',
        '$BUILD_DIR/third_party/abseil-cpp/absl_statusor',
        '$BUILD_DIR/third_party/abseil-cpp/absl_str_format_internal',
        '$BUILD_DIR/third_party/abseil-cpp/absl_strings',
        '$BUILD_DIR/third_party/abseil-cpp/absl_synchronization',
        '$BUILD_DIR/third_party/abseil-cpp/absl_time',
        '$BUILD_DIR/third_party/shim_zlib',
        'utf8_validity',
    ],
)

protobuf_env.Library(
    target='protoc',
    source=[
        "dist/src/google/protobuf/compiler/allowlists/editions.cc",
        "dist/src/google/protobuf/compiler/allowlists/empty_package.cc",
        "dist/src/google/protobuf/compiler/allowlists/open_enum.cc",
        "dist/src/google/protobuf/compiler/allowlists/unused_imports.cc",
        "dist/src/google/protobuf/compiler/allowlists/weak_imports.cc",
        "dist/src/google/protobuf/compiler/code_generator.cc",
        "dist/src/google/protobuf/compiler/command_line_interface.cc",
        "dist/src/google/protobuf/compiler/cpp/enum.cc",
        "dist/src/google/protobuf/compiler/cpp/extension.cc",
        "dist/src/google/protobuf/compiler/cpp/field.cc",
        "dist/src/google/protobuf/compiler/cpp/field_generators/cord_field.cc",
        "dist/src/google/protobuf/compiler/cpp/field_generators/enum_field.cc",
        "dist/src/google/protobuf/compiler/cpp/field_generators/map_field.cc",
        "dist/src/google/protobuf/compiler/cpp/field_generators/message_field.cc",
        "dist/src/google/protobuf/compiler/cpp/field_generators/primitive_field.cc",
        "dist/src/google/protobuf/compiler/cpp/field_generators/string_field.cc",
        "dist/src/google/protobuf/compiler/cpp/file.cc",
        "dist/src/google/protobuf/compiler/cpp/generator.cc",
        "dist/src/google/protobuf/compiler/cpp/helpers.cc",
        "dist/src/google/protobuf/compiler/cpp/message.cc",
        "dist/src/google/protobuf/compiler/cpp/padding_optimizer.cc",
        "dist/src/google/protobuf/compiler/cpp/parse_function_generator.cc",
        "dist/src/google/protobuf/compiler/cpp/service.cc",
        "dist/src/google/protobuf/compiler/cpp/tracker.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_enum.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_enum_field.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_field_base.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_generator.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_helpers.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_map_field.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_message.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_message_field.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc",
        "dist/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc",
        "dist/src/google/protobuf/compiler/csharp/names.cc",
        "dist/src/google/protobuf/compiler/java/context.cc",
        "dist/src/google/protobuf/compiler/java/doc_comment.cc",
        "dist/src/google/protobuf/compiler/java/enum.cc",
        "dist/src/google/protobuf/compiler/java/enum_field.cc",
        "dist/src/google/protobuf/compiler/java/enum_field_lite.cc",
        "dist/src/google/protobuf/compiler/java/enum_lite.cc",
        "dist/src/google/protobuf/compiler/java/extension.cc",
        "dist/src/google/protobuf/compiler/java/extension_lite.cc",
        "dist/src/google/protobuf/compiler/java/field.cc",
        "dist/src/google/protobuf/compiler/java/file.cc",
        "dist/src/google/protobuf/compiler/java/generator.cc",
        "dist/src/google/protobuf/compiler/java/generator_factory.cc",
        "dist/src/google/protobuf/compiler/java/helpers.cc",
        "dist/src/google/protobuf/compiler/java/java_features.pb.cc",
        "dist/src/google/protobuf/compiler/java/kotlin_generator.cc",
        "dist/src/google/protobuf/compiler/java/map_field.cc",
        "dist/src/google/protobuf/compiler/java/map_field_lite.cc",
        "dist/src/google/protobuf/compiler/java/message.cc",
        "dist/src/google/protobuf/compiler/java/message_builder.cc",
        "dist/src/google/protobuf/compiler/java/message_builder_lite.cc",
        "dist/src/google/protobuf/compiler/java/message_field.cc",
        "dist/src/google/protobuf/compiler/java/message_field_lite.cc",
        "dist/src/google/protobuf/compiler/java/message_lite.cc",
        "dist/src/google/protobuf/compiler/java/message_serialization.cc",
        "dist/src/google/protobuf/compiler/java/name_resolver.cc",
        "dist/src/google/protobuf/compiler/java/names.cc",
        "dist/src/google/protobuf/compiler/java/primitive_field.cc",
        "dist/src/google/protobuf/compiler/java/primitive_field_lite.cc",
        "dist/src/google/protobuf/compiler/java/service.cc",
        "dist/src/google/protobuf/compiler/java/shared_code_generator.cc",
        "dist/src/google/protobuf/compiler/java/string_field.cc",
        "dist/src/google/protobuf/compiler/java/string_field_lite.cc",
        "dist/src/google/protobuf/compiler/objectivec/enum.cc",
        "dist/src/google/protobuf/compiler/objectivec/enum_field.cc",
        "dist/src/google/protobuf/compiler/objectivec/extension.cc",
        "dist/src/google/protobuf/compiler/objectivec/field.cc",
        "dist/src/google/protobuf/compiler/objectivec/file.cc",
        "dist/src/google/protobuf/compiler/objectivec/generator.cc",
        "dist/src/google/protobuf/compiler/objectivec/helpers.cc",
        "dist/src/google/protobuf/compiler/objectivec/import_writer.cc",
        "dist/src/google/protobuf/compiler/objectivec/line_consumer.cc",
        "dist/src/google/protobuf/compiler/objectivec/map_field.cc",
        "dist/src/google/protobuf/compiler/objectivec/message.cc",
        "dist/src/google/protobuf/compiler/objectivec/message_field.cc",
        "dist/src/google/protobuf/compiler/objectivec/names.cc",
        "dist/src/google/protobuf/compiler/objectivec/oneof.cc",
        "dist/src/google/protobuf/compiler/objectivec/primitive_field.cc",
        "dist/src/google/protobuf/compiler/objectivec/text_format_decode_data.cc",
        "dist/src/google/protobuf/compiler/php/names.cc",
        "dist/src/google/protobuf/compiler/php/php_generator.cc",
        "dist/src/google/protobuf/compiler/plugin.cc",
        "dist/src/google/protobuf/compiler/plugin.pb.cc",
        "dist/src/google/protobuf/compiler/python/generator.cc",
        "dist/src/google/protobuf/compiler/python/helpers.cc",
        "dist/src/google/protobuf/compiler/python/pyi_generator.cc",
        "dist/src/google/protobuf/compiler/retention.cc",
        "dist/src/google/protobuf/compiler/ruby/ruby_generator.cc",
        "dist/src/google/protobuf/compiler/rust/accessors/accessors.cc",
        "dist/src/google/protobuf/compiler/rust/accessors/singular_message.cc",
        "dist/src/google/protobuf/compiler/rust/accessors/singular_scalar.cc",
        "dist/src/google/protobuf/compiler/rust/accessors/singular_string.cc",
        "dist/src/google/protobuf/compiler/rust/accessors/unsupported_field.cc",
        "dist/src/google/protobuf/compiler/rust/context.cc",
        "dist/src/google/protobuf/compiler/rust/generator.cc",
        "dist/src/google/protobuf/compiler/rust/message.cc",
        "dist/src/google/protobuf/compiler/rust/naming.cc",
        "dist/src/google/protobuf/compiler/rust/oneof.cc",
        "dist/src/google/protobuf/compiler/rust/relative_path.cc",
        "dist/src/google/protobuf/compiler/subprocess.cc",
        "dist/src/google/protobuf/compiler/zip_writer.cc",
    ],
    LIBDEPS=[
        '$BUILD_DIR/third_party/abseil-cpp/absl_base',
        '$BUILD_DIR/third_party/abseil-cpp/absl_strings',
        'protobuf',
    ],
)

protobuf_compiler = protobuf_env.Program(
    target='protobuf_compiler',
    source=['dist/src/google/protobuf/compiler/main.cc'],
    LIBDEPS=[
        'protobuf',
        'protoc',
    ],
    AIB_COMPONENT='protobuf',
)

installed = env.GetAutoInstalledFiles(protobuf_compiler[0])
if installed:
    setattr(installed[0].attributes, 'AIB_NO_ARCHIVE', True)
