| load("@rules_cc//cc:defs.bzl", "objc_library") | 
 | load("@rules_pkg//pkg:mappings.bzl", "pkg_files", "strip_prefix") | 
 | load("@rules_python//python:defs.bzl", "py_binary") | 
 | load("@rules_python//python:py_test.bzl", "py_test") | 
 | load("@rules_shell//shell:sh_test.bzl", "sh_test") | 
 | load("//conformance:defs.bzl", "conformance_test") | 
 | load("//upb/cmake:build_defs.bzl", "staleness_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. | 
 | # | 
 | # TODO: Improve the bazel build so it uses these generated headers so it is | 
 | # always current, and only the builds that can't easily build protoc and | 
 | # generate the files rely on the checked in ones. | 
 |  | 
 | _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 | 
 |     ]), | 
 |     tags = ["manual"], | 
 |     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", | 
 |     srcs = [ | 
 |         # Private headers that aren't used from the generated sources. | 
 |         "GPBUnknownFields_PackagePrivate.h", | 
 |     ], | 
 |     hdrs = [ | 
 |         "GPBAny.pbobjc.h", | 
 |         "GPBApi.pbobjc.h", | 
 |         "GPBDuration.pbobjc.h", | 
 |         "GPBEmpty.pbobjc.h", | 
 |         "GPBFieldMask.pbobjc.h", | 
 |         "GPBSourceContext.pbobjc.h", | 
 |         "GPBStruct.pbobjc.h", | 
 |         "GPBTimestamp.pbobjc.h", | 
 |         "GPBType.pbobjc.h", | 
 |         "GPBWrappers.pbobjc.h", | 
 |         "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", | 
 |         "GPBUnknownFields.h", | 
 |         "GPBUtilities.h", | 
 |         "GPBWellKnownTypes.h", | 
 |         "GPBWireFormat.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", | 
 |         "GPBUnknownField_PackagePrivate.h", | 
 |         "GPBUtilities_PackagePrivate.h", | 
 |     ], | 
 |     copts = [ | 
 |         "-Wno-vla", | 
 |     ], | 
 |     includes = [ | 
 |         ".", | 
 |     ], | 
 |     non_arc_srcs = [ | 
 |         "GPBAny.pbobjc.m", | 
 |         "GPBApi.pbobjc.m", | 
 |         "GPBArray.m", | 
 |         "GPBCodedInputStream.m", | 
 |         "GPBCodedOutputStream.m", | 
 |         "GPBDescriptor.m", | 
 |         "GPBDictionary.m", | 
 |         "GPBDuration.pbobjc.m", | 
 |         "GPBEmpty.pbobjc.m", | 
 |         "GPBExtensionInternals.m", | 
 |         "GPBExtensionRegistry.m", | 
 |         "GPBFieldMask.pbobjc.m", | 
 |         "GPBMessage.m", | 
 |         "GPBRootObject.m", | 
 |         "GPBSourceContext.pbobjc.m", | 
 |         "GPBStruct.pbobjc.m", | 
 |         "GPBTimestamp.pbobjc.m", | 
 |         "GPBType.pbobjc.m", | 
 |         "GPBUnknownField.m", | 
 |         "GPBUnknownFields.m", | 
 |         "GPBUtilities.m", | 
 |         "GPBWellKnownTypes.m", | 
 |         "GPBWireFormat.m", | 
 |         "GPBWrappers.pbobjc.m", | 
 |     ], | 
 |     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", | 
 |     maximum_edition = "2023", | 
 |     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__"], | 
 | ) |