| load("@rules_cc//cc:defs.bzl", "objc_library") |
| load("@rules_pkg//:mappings.bzl", "pkg_files", "strip_prefix") |
| load("@upb//cmake:build_defs.bzl", "staleness_test") |
| load("//conformance:defs.bzl", "conformance_test") |
| load(":defs.bzl", "objc_proto_camel_case_name") |
| |
| # The WKTs have to be checked in to support the CocoaPods and Xcode builds. This |
| # generule and test ensure the source are current. |
| # |
| # Within the ":objectivec" target, the outputs of the genrule are then used to |
| # ensure they are always "current". This implementation is basically the same |
| # has how the WKTs are handled in src/google/protobuf/BUILD.bazel for the C++ |
| # version. They share the potential downsides around layer checks and that |
| # someone could #include the header with the `wkt/` prefix on the name. |
| |
| _WELL_KNOWN_TYPES = [ |
| "any", |
| "api", |
| "duration", |
| "empty", |
| "field_mask", |
| "source_context", |
| "struct", |
| "timestamp", |
| "type", |
| "wrappers", |
| ] |
| |
| _OBJC_WKT_NAMES = [objc_proto_camel_case_name(x) for x in _WELL_KNOWN_TYPES] |
| |
| _OBJC_EXTS = [ |
| ".pbobjc.h", |
| ".pbobjc.m", |
| ] |
| |
| genrule( |
| name = "gen_wkt_sources", |
| srcs = ["//src/google/protobuf:well_known_type_protos"], |
| outs = ["wkt/GPB" + wkt + ext for wkt in _OBJC_WKT_NAMES for ext in _OBJC_EXTS], |
| cmd = " && ".join([ |
| "$(execpath //:protoc) --objc_out=$(RULEDIR)/wkt --proto_path=src $(SRCS)", |
| ] + [ |
| "mv $(RULEDIR)/wkt/google/protobuf/" + wkt + ext + " $(RULEDIR)/wkt/GPB" + wkt + ext |
| for wkt in _OBJC_WKT_NAMES |
| for ext in _OBJC_EXTS |
| ]), |
| exec_tools = ["//:protoc"], |
| ) |
| |
| staleness_test( |
| name = "well_known_types_staleness_test", |
| outs = ["GPB" + wkt + ext for wkt in _OBJC_WKT_NAMES for ext in _OBJC_EXTS], |
| generated_pattern = "wkt/%s", |
| tags = ["manual"], |
| ) |
| |
| ################################################################################ |
| # Objective-C Runtime Library |
| ################################################################################ |
| |
| objc_library( |
| name = "objectivec", |
| hdrs = [ |
| "GPBArray.h", |
| "GPBBootstrap.h", |
| "GPBCodedInputStream.h", |
| "GPBCodedOutputStream.h", |
| "GPBDescriptor.h", |
| "GPBDictionary.h", |
| "GPBExtensionInternals.h", |
| "GPBExtensionRegistry.h", |
| "GPBMessage.h", |
| "GPBProtocolBuffers.h", |
| "GPBProtocolBuffers_RuntimeSupport.h", |
| "GPBRootObject.h", |
| "GPBRuntimeTypes.h", |
| "GPBUnknownField.h", |
| "GPBUnknownFieldSet.h", |
| "GPBUtilities.h", |
| "GPBWellKnownTypes.h", |
| "GPBWireFormat.h", |
| "google/protobuf/Any.pbobjc.h", |
| "google/protobuf/Api.pbobjc.h", |
| "google/protobuf/Duration.pbobjc.h", |
| "google/protobuf/Empty.pbobjc.h", |
| "google/protobuf/FieldMask.pbobjc.h", |
| "google/protobuf/SourceContext.pbobjc.h", |
| "google/protobuf/Struct.pbobjc.h", |
| "google/protobuf/Timestamp.pbobjc.h", |
| "google/protobuf/Type.pbobjc.h", |
| "google/protobuf/Wrappers.pbobjc.h", |
| # Package private headers, but exposed because the generated sources |
| # need to use them. |
| "GPBArray_PackagePrivate.h", |
| "GPBCodedInputStream_PackagePrivate.h", |
| "GPBCodedOutputStream_PackagePrivate.h", |
| "GPBDescriptor_PackagePrivate.h", |
| "GPBDictionary_PackagePrivate.h", |
| "GPBMessage_PackagePrivate.h", |
| "GPBRootObject_PackagePrivate.h", |
| "GPBUnknownFieldSet_PackagePrivate.h", |
| "GPBUnknownField_PackagePrivate.h", |
| "GPBUtilities_PackagePrivate.h", |
| ] + ["wkt/GPB" + wkt + ".pbobjc.h" for wkt in _OBJC_WKT_NAMES], |
| copts = [ |
| "-Wno-vla", |
| ], |
| includes = [ |
| ".", |
| "wkt", |
| ], |
| non_arc_srcs = [ |
| "GPBArray.m", |
| "GPBCodedInputStream.m", |
| "GPBCodedOutputStream.m", |
| "GPBDescriptor.m", |
| "GPBDictionary.m", |
| "GPBExtensionInternals.m", |
| "GPBExtensionRegistry.m", |
| "GPBMessage.m", |
| "GPBRootObject.m", |
| "GPBUnknownField.m", |
| "GPBUnknownFieldSet.m", |
| "GPBUtilities.m", |
| "GPBWellKnownTypes.m", |
| "GPBWireFormat.m", |
| ] + ["wkt/GPB" + wkt + ".pbobjc.m" for wkt in _OBJC_WKT_NAMES], |
| target_compatible_with = select({ |
| "@platforms//os:macos": [], |
| "@platforms//os:ios": [], |
| "@platforms//os:tvos": [], |
| "@platforms//os:watchos": [], |
| "//conditions:default": ["@platforms//:incompatible"], |
| }), |
| visibility = ["//visibility:public"], |
| ) |
| |
| ################################################################################ |
| # Tests |
| ################################################################################ |
| |
| conformance_test( |
| name = "conformance_test", |
| failure_list = "//conformance:failure_list_objc.txt", |
| target_compatible_with = ["@platforms//os:macos"], |
| testee = "//conformance:conformance_objc", |
| ) |
| |
| # ------------------------------------------------------------------- |
| # Current Version Check between Generator and Runtime Sources |
| sh_test( |
| name = "check_version_stamps", |
| size = "small", |
| srcs = ["DevTools/check_version_stamps.sh"], |
| data = [ |
| "GPBBootstrap.h", |
| "//src/google/protobuf/compiler/objectivec:file.cc", |
| ], |
| ) |
| |
| # ------------------------------------------------------------------- |
| # Validation of pddm expansion. |
| |
| py_binary( |
| name = "pddm", |
| srcs = ["DevTools/pddm.py"], |
| ) |
| |
| py_test( |
| name = "pddm_tests", |
| size = "small", |
| srcs = [ |
| "DevTools/pddm.py", |
| "DevTools/pddm_tests.py", |
| ], |
| ) |
| |
| sh_test( |
| name = "sources_pddm_expansion_test", |
| size = "small", |
| srcs = ["DevTools/sources_pddm_expansion_test.sh"], |
| data = [":pddm"] + glob([ |
| "**/*.h", |
| "**/*.m", |
| "**/*.pddm", |
| ]), |
| ) |
| |
| ################################################################################ |
| # Distribution files |
| ################################################################################ |
| |
| pkg_files( |
| name = "dist_files", |
| srcs = glob([ |
| "*.h", |
| "*.m", |
| "**/*.h", |
| "**/*.m", |
| "**/*.mm", |
| "**/*.swift", |
| "DevTools/*.sh", |
| "DevTools/*.py", |
| "ProtocolBuffers_iOS.xcodeproj/**/*", |
| "ProtocolBuffers_OSX.xcodeproj/**/*", |
| "ProtocolBuffers_tvOS.xcodeproj/**/*", |
| "Tests/*.pddm", |
| "Tests/*.txt", |
| "Tests/*.plist", |
| "Tests/*.proto", |
| ]) + [ |
| ".clang-format", |
| "BUILD.bazel", |
| "README.md", |
| "Tests/golden_message", |
| "Tests/golden_packed_fields_message", |
| "generate_well_known_types.sh", |
| ], |
| strip_prefix = strip_prefix.from_root(""), |
| visibility = ["//pkg:__pkg__"], |
| ) |