blob: 7dbbb353c195f0a6c8481a20c06a58430f1e12fd [file] [log] [blame]
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__"],
)