| 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__"], | |
| ) |