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