load("@rules_cc//cc:defs.bzl", "objc_library") load("@rules_pkg//pkg:mappings.bzl", "pkg_files", "strip_prefix") 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__"], )