# Copyright 2014 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/linux/gtk/gtk.gni") import("//build/config/sanitizers/sanitizers.gni") # Includes default args like 'enable_js_protobuf'. import("proto_library.gni") import("proto_sources.gni") if (enable_js_protobuf) { import("//third_party/closure_compiler/compile_js.gni") } config("protobuf_config") { include_dirs = [ "src" ] defines = [ "GOOGLE_PROTOBUF_NO_RTTI", "GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER", "GOOGLE_PROTOBUF_INTERNAL_DONATE_STEAL_INLINE=0", ] if (!is_win) { defines += [ "HAVE_PTHREAD" ] } } config("protobuf_warnings") { cflags = [] if (is_clang) { # protobuf-3 contains a few functions that are unused. cflags += [ "-Wno-unused-function" ] } } config("protoc_warnings") { cflags = [] if (is_clang) { # Some generates contain a few fields that are not used. cflags += [ "-Wno-unused-private-field" ] } } if (is_component_build) { config("protobuf_use_dlls") { defines = [ "PROTOBUF_USE_DLLS" ] } } # This config should be applied to targets using generated code from the proto # compiler. It sets up the include directories properly. config("using_proto") { include_dirs = [ "src", "$root_gen_dir/protoc_out", ] } config("allow_deprecated_proto_fields") { if (is_clang) { cflags = [ "-DPROTOBUF_ALLOW_DEPRECATED=1" ] } } protobuf_lite_cflags = [] if (is_win) { protobuf_lite_cflags = [ "/wd4018", # signed/unsigned mismatch in comparison "/wd4065", # switch statement contains 'default' but no 'case' labels "/wd4146", # unary minus operator applied to unsigned type "/wd4244", # implicit conversion, possible loss of data "/wd4267", # size_t to int truncation "/wd4291", # no matching operator delete for a placement new. "/wd4305", # double to float truncation "/wd4355", # 'this' used in base member initializer list "/wd4506", # no definition for inline function (protobuf issue #240) "/wd4715", # not all control paths return a value (fixed in trunk) ] } component("protobuf_lite") { sources = protobuf_lite_sources + protobuf_headers configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code", # Must be after no_chromium_code for warning flags to be ordered # correctly. ":protobuf_warnings", ] # Build protobuf_lite with full optimizations so Clang can optimize the # initializer out. See 0029-make-initializers-optimizable.patch. if (!is_debug && is_android) { configs -= [ "//build/config/compiler:default_optimization" ] configs += [ "//build/config/compiler:optimize_max" ] } # Remove coverage and Sanitizers other than ASan for a performance boost when # fuzzing. ASan can't be removed here because of a bug preventing unsanitized # code from using libc++, which protobuf_full uses. configs -= not_fuzzed_remove_nonasan_configs configs += [ "//build/config/sanitizers:not_fuzzed" ] if (is_win) { configs -= [ "//build/config/win:lean_and_mean" ] } public_configs = [ ":protobuf_config" ] if (is_android) { libs = [ "log" ] # Used by src/google/protobuf/stubs/common.cc } cflags = protobuf_lite_cflags # Required for component builds. See http://crbug.com/172800. if (is_component_build) { public_configs += [ ":protobuf_use_dlls" ] defines = [ "LIBPROTOBUF_EXPORTS" ] } } # This is the full, heavy protobuf lib that's needed for c++ .protos that don't # specify the LITE_RUNTIME option. The protocol compiler itself (protoc) falls # into that category. Do not use in Chrome code. static_library("protobuf_full") { if (defined(build_with_chromium) && build_with_chromium) { # Prevent people from depending on this outside our file. visibility = [ ":*", # Used for testing protobuf generation. "//base/test:proto_test_support", # requires descriptors & reflection; testonly. "//third_party/libprotobuf-mutator:*", # Chromecast requires descriptors and reflection. "//chromecast/*", # libassistant requires descriptors and reflection for testing. "//libassistant/*", # Perfetto uses the full library for testing. "//third_party/perfetto/gn:protobuf_full", # Some tests inside ChromeOS need reflection to parse golden files. # Not included in production code. "//chrome/test:usage_time_limit_unittests", # The protobuf-based SQLite and GPU fuzzers need protobuf_full and are not # included in Chrome. "//gpu:gl_lpm_fuzzer_proto", "//gpu:gl_lpm_fuzzer_proto_gen", "//gpu:gl_lpm_shader_to_string_unittest", "//testing/libfuzzer/fuzzers:command_buffer_lpm_fuzzer_proto", "//testing/libfuzzer/fuzzers:command_buffer_lpm_fuzzer_proto_gen", "//third_party/sqlite:sqlite3_lpm_corpus_gen", # The protobuf-based Mojo LPM fuzzer needs protobuf_full and is not included # in Chrome. "//mojo/public/tools/fuzzers:mojolpm", # The root store tool is not part of Chrome itself, and needs to parse # human-readable protobufs. Protobuf is stored in //net/cert however as # browser needs to be able to parse serialized protobuf (which is exposed # as a separate lite BUILD rule). "//net/cert:root_store_proto_full", # The spirv-fuzz fuzzer tool needs protobuf_full and is not included in # Chrome. "//third_party/vulkan-deps/spirv-tools/src:spirv-fuzz", "//third_party/vulkan-deps/spirv-tools/src:spvtools_fuzz", "//third_party/vulkan-deps/spirv-tools/src:spvtools_fuzz_proto", # Some fuzzers for tint need protobuf_full and are not included in Chrome. "//third_party/dawn/src/tint/*", # Dawn LPM Fuzzers "//third_party/dawn/src/dawn/fuzzers:dawn_lpm_proto", "//third_party/dawn/src/dawn/fuzzers:dawn_lpm_proto_gen", # The Cast Core gRPC generator tool. "//third_party/cast_core/public/src/build/chromium:cast_core_grpc_generator", ] } deps = [ "//third_party/zlib" ] # In component build, protobuf_full can't depend on protobuf_lite because # it uses non-PROTOBUF_EXPORT symbols; in non-component build, protobuf_full # must have protobuf_lite as a dependency instead of building # protobuf_lite_sources to avoid ODR violations in targets that link both. # See crbug.com/1338164. if (is_component_build) { sources = protobuf_lite_sources + protobuf_sources + protobuf_headers } else { sources = protobuf_sources + protobuf_headers deps += [ ":protobuf_lite" ] } if (is_android) { libs = [ "log" ] # Used by src/google/protobuf/stubs/common.cc } configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code", # Must be after no_chromium_code for warning flags to be ordered # correctly. ":protobuf_warnings", ] # Remove coverage and Sanitizers other than ASan for a performance boost when # fuzzing. ASan can't be removed here because of a bug preventing unsanitized # code from using libc++, which protobuf_full uses. configs -= not_fuzzed_remove_nonasan_configs configs += [ "//build/config/sanitizers:not_fuzzed" ] if (is_win) { configs -= [ "//build/config/win:lean_and_mean" ] } public_configs = [ ":protobuf_config" ] cflags = protobuf_lite_cflags defines = [ "HAVE_ZLIB" ] } # Only compile the compiler for the host architecture. if (current_toolchain == host_toolchain) { # protoc compiler is separated into protoc library and executable targets to # support protoc plugins that need to link libprotoc, but not the main() # itself. See src/google/protobuf/compiler/plugin.h source_set("protoc_java") { sources = protoc_java_sources + protoc_java_headers configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code", # Must be after no_chromium_code for warning flags to be ordered # correctly. ":protobuf_warnings", ":protoc_warnings", ] public_configs = [ ":protobuf_config" ] cflags = protobuf_lite_cflags public_deps = [ ":protobuf_full" ] } source_set("protoc_python") { sources = protoc_python_sources + protoc_python_headers configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code", # Must be after no_chromium_code for warning flags to be ordered # correctly. ":protobuf_warnings", ":protoc_warnings", ] public_configs = [ ":protobuf_config" ] cflags = protobuf_lite_cflags public_deps = [ ":protobuf_full" ] } static_library("protoc_lib") { sources = protoc_sources + protoc_headers configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code", # Must be after no_chromium_code for warning flags to be ordered # correctly. ":protobuf_warnings", ":protoc_warnings", ] if (is_win) { # This is defined internally, don't warn on duplicate. configs -= [ "//build/config/win:lean_and_mean" ] } public_configs = [ ":protobuf_config" ] cflags = protobuf_lite_cflags public_deps = [ ":protobuf_full" ] deps = [ ":protoc_java", ":protoc_python", ] } executable("protoc") { sources = [ "src/google/protobuf/compiler/main.cc" ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code" ] cflags = protobuf_lite_cflags deps = [ ":protoc_lib", # Default manifest on Windows (a no-op elsewhere). "//build/win:default_exe_manifest", ] if (enable_js_protobuf) { deps += [ "//third_party/protobuf-javascript:protoc-gen-js" ] } } } google_python_dir = "$root_out_dir/pyproto/google" copy("copy_google_protobuf") { # TODO(ncarter): protoc's python generator treats descriptor.proto # specially, but only when the input path is exactly # "google/protobuf/descriptor.proto". I'm not sure how to execute a rule # from a different directory. For now, use a manually-generated copy of # descriptor_pb2.py. sources = pyproto_sources + [ "python/google/protobuf/descriptor_pb2.py" ] outputs = [ "$google_python_dir/protobuf/{{source_file_part}}" ] } copy("copy_google_protobuf_internal") { sources = pyproto_internal_sources outputs = [ "$google_python_dir/protobuf/internal/{{source_file_part}}" ] } # Build time dependency for action rules. group("py_proto") { public_deps = [ ":copy_google_protobuf", ":copy_google_protobuf_internal", ] } # Runtime dependency if the target needs the python scripts. group("py_proto_runtime") { deps = [ ":py_proto" ] # Targets that depend on this should depend on the copied data files. data = get_target_outputs(":copy_google_protobuf") data += get_target_outputs(":copy_google_protobuf_internal") } # JS protobuf library. if (enable_js_protobuf) { js_library("js_proto") { sources = [ "//third_party/google-closure-library/closure/goog/array/array.js", "//third_party/google-closure-library/closure/goog/asserts/asserts.js", "//third_party/google-closure-library/closure/goog/base.js", "//third_party/google-closure-library/closure/goog/crypt/base64.js", "//third_party/google-closure-library/closure/goog/crypt/crypt.js", "//third_party/google-closure-library/closure/goog/debug/error.js", "//third_party/google-closure-library/closure/goog/dom/asserts.js", "//third_party/google-closure-library/closure/goog/dom/browserfeature.js", "//third_party/google-closure-library/closure/goog/dom/dom.js", "//third_party/google-closure-library/closure/goog/dom/htmlelement.js", "//third_party/google-closure-library/closure/goog/dom/nodetype.js", "//third_party/google-closure-library/closure/goog/dom/safe.js", "//third_party/google-closure-library/closure/goog/dom/tagname.js", "//third_party/google-closure-library/closure/goog/dom/tags.js", "//third_party/google-closure-library/closure/goog/fs/blob.js", "//third_party/google-closure-library/closure/goog/fs/url.js", "//third_party/google-closure-library/closure/goog/functions/functions.js", "//third_party/google-closure-library/closure/goog/goog.js", "//third_party/google-closure-library/closure/goog/html/safehtml.js", "//third_party/google-closure-library/closure/goog/html/safescript.js", "//third_party/google-closure-library/closure/goog/html/safestyle.js", "//third_party/google-closure-library/closure/goog/html/safestylesheet.js", "//third_party/google-closure-library/closure/goog/html/safeurl.js", "//third_party/google-closure-library/closure/goog/html/trustedresourceurl.js", "//third_party/google-closure-library/closure/goog/html/trustedtypes.js", "//third_party/google-closure-library/closure/goog/html/uncheckedconversions.js", "//third_party/google-closure-library/closure/goog/i18n/bidi.js", "//third_party/google-closure-library/closure/goog/labs/useragent/browser.js", "//third_party/google-closure-library/closure/goog/labs/useragent/engine.js", "//third_party/google-closure-library/closure/goog/labs/useragent/platform.js", "//third_party/google-closure-library/closure/goog/labs/useragent/useragent.js", "//third_party/google-closure-library/closure/goog/labs/useragent/util.js", "//third_party/google-closure-library/closure/goog/math/coordinate.js", "//third_party/google-closure-library/closure/goog/math/math.js", "//third_party/google-closure-library/closure/goog/math/size.js", "//third_party/google-closure-library/closure/goog/memoize/memoize.js", "//third_party/google-closure-library/closure/goog/object/object.js", "//third_party/google-closure-library/closure/goog/reflect/reflect.js", "//third_party/google-closure-library/closure/goog/string/const.js", "//third_party/google-closure-library/closure/goog/string/internal.js", "//third_party/google-closure-library/closure/goog/string/string.js", "//third_party/google-closure-library/closure/goog/string/typedstring.js", "//third_party/google-closure-library/closure/goog/useragent/product.js", "//third_party/google-closure-library/closure/goog/useragent/useragent.js", "//third_party/protobuf-javascript/src/asserts.js", "//third_party/protobuf-javascript/src/binary/arith.js", "//third_party/protobuf-javascript/src/binary/constants.js", "//third_party/protobuf-javascript/src/binary/decoder.js", "//third_party/protobuf-javascript/src/binary/encoder.js", "//third_party/protobuf-javascript/src/binary/reader.js", "//third_party/protobuf-javascript/src/binary/utils.js", "//third_party/protobuf-javascript/src/binary/writer.js", "//third_party/protobuf-javascript/src/map.js", "//third_party/protobuf-javascript/src/message.js", ] } }