diff --git a/WORKSPACE b/WORKSPACE index c5d1cf72b..8bab982c0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -103,3 +103,24 @@ xcode_configure( remote_xcode_label = "", xcode_locator_label = "//tools/toolchains/xcode_configure:xcode_locator.m", ) + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "rules_proto_grpc", + sha256 = "507e38c8d95c7efa4f3b1c0595a8e8f139c885cb41a76cab7e20e4e67ae87731", + strip_prefix = "rules_proto_grpc-4.1.1", + urls = ["https://github.com/rules-proto-grpc/rules_proto_grpc/archive/4.1.1.tar.gz"], +) + +load("@rules_proto_grpc//:repositories.bzl", "rules_proto_grpc_repos", "rules_proto_grpc_toolchains") + +rules_proto_grpc_toolchains() + +rules_proto_grpc_repos() + +load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") + +rules_proto_dependencies() + +rules_proto_toolchains() diff --git a/tests/ios/frameworks/protos/BUILD.bazel b/tests/ios/frameworks/protos/BUILD.bazel new file mode 100644 index 000000000..bf8240dab --- /dev/null +++ b/tests/ios/frameworks/protos/BUILD.bazel @@ -0,0 +1,37 @@ +load("proto_library.bzl", "apple_proto_framework") +load("//rules:framework.bzl", "apple_framework", "apple_framework_packaging") + +# Export protobuf into a framework module +objc_library( + name = "Protobuf_hdrs", + hdrs = ["Protobuf/module.modulemap"], +) + +apple_framework_packaging( + name = "Protobuf", + framework_name = "Protobuf", + transitive_deps = [], + deps = [ + "Protobuf_hdrs", + "@com_github_protocolbuffers_protobuf//:objectivec", + ], +) + +apple_proto_framework( + name = "Sample", + proto_srcs = ["sample.proto"], + deps = [":Dep"], +) + +apple_proto_framework( + name = "Dep", + proto_srcs = ["dep.proto"], +) + +apple_framework( + name = "Some", + srcs = ["Some.swift"], + objc_defines = ["GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1"], + swift_defines = ["GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1"], + deps = ["Sample"], +) diff --git a/tests/ios/frameworks/protos/Protobuf/module.modulemap b/tests/ios/frameworks/protos/Protobuf/module.modulemap new file mode 100644 index 000000000..04d3b314f --- /dev/null +++ b/tests/ios/frameworks/protos/Protobuf/module.modulemap @@ -0,0 +1,51 @@ +framework module Protobuf { + header "GPBAny.pbobjc.h" + header "GPBApi.pbobjc.h" + header "GPBDuration.pbobjc.h" + header "GPBEmpty.pbobjc.h" + header "GPBFieldMask.pbobjc.h" + header "GPBSourceContext.pbobjc.h" + header "GPBStruct.pbobjc.h" + header "GPBTimestamp.pbobjc.h" + header "GPBType.pbobjc.h" + header "GPBWrappers.pbobjc.h" + header "GPBArray.h" + header "GPBBootstrap.h" + header "GPBCodedInputStream.h" + header "GPBCodedOutputStream.h" + header "GPBDescriptor.h" + header "GPBDictionary.h" + header "GPBExtensionInternals.h" + header "GPBExtensionRegistry.h" + header "GPBMessage.h" + header "GPBProtocolBuffers.h" + header "GPBProtocolBuffers_RuntimeSupport.h" + header "GPBRootObject.h" + header "GPBRuntimeTypes.h" + header "GPBUnknownField.h" + header "GPBUnknownFieldSet.h" + header "GPBUtilities.h" + header "GPBWellKnownTypes.h" + header "GPBWireFormat.h" + header "Any.pbobjc.h" + header "Api.pbobjc.h" + header "Duration.pbobjc.h" + header "Empty.pbobjc.h" + header "FieldMask.pbobjc.h" + header "SourceContext.pbobjc.h" + header "Struct.pbobjc.h" + header "Timestamp.pbobjc.h" + header "Type.pbobjc.h" + header "Wrappers.pbobjc.h" + header "GPBArray_PackagePrivate.h" + header "GPBCodedInputStream_PackagePrivate.h" + header "GPBCodedOutputStream_PackagePrivate.h" + header "GPBDescriptor_PackagePrivate.h" + header "GPBDictionary_PackagePrivate.h" + header "GPBMessage_PackagePrivate.h" + header "GPBRootObject_PackagePrivate.h" + header "GPBUnknownFieldSet_PackagePrivate.h" + header "GPBUnknownField_PackagePrivate.h" + header "GPBUtilities_PackagePrivate.h" + export * +} diff --git a/tests/ios/frameworks/protos/Some.swift b/tests/ios/frameworks/protos/Some.swift new file mode 100644 index 000000000..1daa0b1cb --- /dev/null +++ b/tests/ios/frameworks/protos/Some.swift @@ -0,0 +1,5 @@ +import Sample + +func main() { + print(Sample()) +} diff --git a/tests/ios/frameworks/protos/dep.proto b/tests/ios/frameworks/protos/dep.proto new file mode 100644 index 000000000..4c734a103 --- /dev/null +++ b/tests/ios/frameworks/protos/dep.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package example; + +message Dep { + string name = 1; +} \ No newline at end of file diff --git a/tests/ios/frameworks/protos/proto_library.bzl b/tests/ios/frameworks/protos/proto_library.bzl new file mode 100644 index 000000000..e78ebdedb --- /dev/null +++ b/tests/ios/frameworks/protos/proto_library.bzl @@ -0,0 +1,62 @@ +load("//rules:framework.bzl", "apple_framework") +load("@rules_proto_grpc//objc:defs.bzl", "objc_proto_compile") +load("@rules_proto_grpc//internal:filter_files.bzl", "filter_files") + +## This macro generates a apple_framework _per_ proto_srcs + +def apple_proto_framework(name, proto_srcs, use_proto_map = True, deps = []): + native.proto_library( + name = name + "_proto", + srcs = proto_srcs, + # Internal implementation detail: assume all deps are protos + deps = [d + "_proto" for d in deps], + ) + + # proto_map.txt needs to correspend with the names used in rules_ios, this + # allows the devs to import them as as such + if use_proto_map: + extra_protoc_args = [ + "--objc_opt", + # In-practice this might be generated by a repository_rule or a + # build rule - in that case just put the file here: + # e.g. external/my_protos/proto_map.txt + "named_framework_to_proto_path_mappings_path=tests/ios/frameworks/protos/proto_map.txt", + ] + extra_protoc_files = [ + "proto_map.txt", + ] + else: + extra_protoc_args = [] + extra_protoc_files = [] + + objc_proto_compile( + name = name + "_objc_proto", + protos = [name + "_proto"], + extra_protoc_args = extra_protoc_args, + extra_protoc_files = extra_protoc_files, + verbose = 2, + ) + + # Filter files to sources and headers + filter_files( + name = name + ".pbobjc.m", + target = name + "_objc_proto", + extensions = ["m"], + ) + + # This has to correspond with rules_ios + filter_files( + name = name + ".pbobjc.h", + target = name + "_objc_proto", + extensions = ["h"], + ) + + apple_framework( + name = name, + srcs = [name + ".pbobjc.m", name + ".pbobjc.h"], + objc_defines = ["GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1"], + swift_defines = ["GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1"], + deps = [":Protobuf"] + deps, + platforms = {"ios": "10.0"}, + visibility = ["//visibility:public"], + ) diff --git a/tests/ios/frameworks/protos/proto_map.txt b/tests/ios/frameworks/protos/proto_map.txt new file mode 100644 index 000000000..470f75a95 --- /dev/null +++ b/tests/ios/frameworks/protos/proto_map.txt @@ -0,0 +1,2 @@ +Sample:tests/ios/frameworks/protos/sample.proto +Dep:tests/ios/frameworks/protos/dep.proto \ No newline at end of file diff --git a/tests/ios/frameworks/protos/sample.proto b/tests/ios/frameworks/protos/sample.proto new file mode 100644 index 000000000..67aaa2984 --- /dev/null +++ b/tests/ios/frameworks/protos/sample.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package example; + +// Note: Need to import these in a way protoc can deal with +// e.g. this is root relative +// import "dep.proto"; + +import "tests/ios/frameworks/protos/dep.proto"; + +message Sample { + string name = 1; + Dep dep = 2; +} \ No newline at end of file