Skip to content

Commit 66d1b95

Browse files
committed
Framework imports, protos with deps
Add an example where a proto imports another proto. This addtionally exports the Protobuf runtime as a framework into rules_ios. proto_map.txt - this file is used to map protobuf imports to framework names in rules_ios
1 parent e492188 commit 66d1b95

File tree

8 files changed

+167
-32
lines changed

8 files changed

+167
-32
lines changed

WORKSPACE

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,14 @@ http_archive(
113113
urls = ["https://github.com/rules-proto-grpc/rules_proto_grpc/archive/4.1.1.tar.gz"],
114114
)
115115

116-
load("@rules_proto_grpc//:repositories.bzl", "rules_proto_grpc_toolchains", "rules_proto_grpc_repos")
116+
load("@rules_proto_grpc//:repositories.bzl", "rules_proto_grpc_repos", "rules_proto_grpc_toolchains")
117+
117118
rules_proto_grpc_toolchains()
119+
118120
rules_proto_grpc_repos()
119121

120122
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
123+
121124
rules_proto_dependencies()
125+
122126
rules_proto_toolchains()
Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,37 @@
1-
load("@rules_proto_grpc//objc:defs.bzl", "objc_proto_compile")
2-
load("@rules_proto_grpc//internal:filter_files.bzl", "filter_files")
3-
load("//rules:framework.bzl", "apple_framework")
1+
load("proto_library.bzl", "apple_proto_framework")
2+
load("//rules:framework.bzl", "apple_framework", "apple_framework_packaging")
43

5-
exports_files(["*.proto"])
6-
7-
proto_library(
8-
name = "sample_proto",
9-
srcs = ["sample.proto"],
4+
# Export protobuf into a framework module
5+
objc_library(
6+
name = "Protobuf_hdrs",
7+
hdrs = ["Protobuf/module.modulemap"],
108
)
119

12-
objc_proto_compile(
13-
name = "sample_objc_proto",
14-
protos = [":sample_proto"],
10+
apple_framework_packaging(
11+
name = "Protobuf",
12+
framework_name = "Protobuf",
13+
transitive_deps = [],
14+
deps = [
15+
"Protobuf_hdrs",
16+
"@com_github_protocolbuffers_protobuf//:objectivec",
17+
],
1518
)
1619

17-
# Filter files to sources and headers
18-
filter_files(
19-
name = "sample_objc_proto.m",
20-
extensions = ["m"],
21-
target = "sample_objc_proto",
20+
apple_proto_framework(
21+
name = "Sample",
22+
proto_srcs = ["sample.proto"],
23+
deps = [":Dep"],
2224
)
2325

24-
filter_files(
25-
name = "sample_objc_proto.h",
26-
extensions = ["h"],
27-
target = "sample_objc_proto",
26+
apple_proto_framework(
27+
name = "Dep",
28+
proto_srcs = ["dep.proto"],
2829
)
2930

3031
apple_framework(
31-
name = "SampleProtoFramework",
32-
srcs = [
33-
":sample_objc_proto.h",
34-
":sample_objc_proto.m",
35-
],
36-
includes = ["sample_objc_proto"],
37-
platforms = {"ios": "10.0"},
38-
visibility = ["//visibility:public"],
39-
deps = ["@com_google_protobuf//:protobuf_objc"],
32+
name = "Some",
33+
srcs = ["Some.swift"],
34+
objc_defines = ["GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1"],
35+
swift_defines = ["GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1"],
36+
deps = ["Sample"],
4037
)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
framework module Protobuf {
2+
header "GPBAny.pbobjc.h"
3+
header "GPBApi.pbobjc.h"
4+
header "GPBDuration.pbobjc.h"
5+
header "GPBEmpty.pbobjc.h"
6+
header "GPBFieldMask.pbobjc.h"
7+
header "GPBSourceContext.pbobjc.h"
8+
header "GPBStruct.pbobjc.h"
9+
header "GPBTimestamp.pbobjc.h"
10+
header "GPBType.pbobjc.h"
11+
header "GPBWrappers.pbobjc.h"
12+
header "GPBArray.h"
13+
header "GPBBootstrap.h"
14+
header "GPBCodedInputStream.h"
15+
header "GPBCodedOutputStream.h"
16+
header "GPBDescriptor.h"
17+
header "GPBDictionary.h"
18+
header "GPBExtensionInternals.h"
19+
header "GPBExtensionRegistry.h"
20+
header "GPBMessage.h"
21+
header "GPBProtocolBuffers.h"
22+
header "GPBProtocolBuffers_RuntimeSupport.h"
23+
header "GPBRootObject.h"
24+
header "GPBRuntimeTypes.h"
25+
header "GPBUnknownField.h"
26+
header "GPBUnknownFieldSet.h"
27+
header "GPBUtilities.h"
28+
header "GPBWellKnownTypes.h"
29+
header "GPBWireFormat.h"
30+
header "Any.pbobjc.h"
31+
header "Api.pbobjc.h"
32+
header "Duration.pbobjc.h"
33+
header "Empty.pbobjc.h"
34+
header "FieldMask.pbobjc.h"
35+
header "SourceContext.pbobjc.h"
36+
header "Struct.pbobjc.h"
37+
header "Timestamp.pbobjc.h"
38+
header "Type.pbobjc.h"
39+
header "Wrappers.pbobjc.h"
40+
header "GPBArray_PackagePrivate.h"
41+
header "GPBCodedInputStream_PackagePrivate.h"
42+
header "GPBCodedOutputStream_PackagePrivate.h"
43+
header "GPBDescriptor_PackagePrivate.h"
44+
header "GPBDictionary_PackagePrivate.h"
45+
header "GPBMessage_PackagePrivate.h"
46+
header "GPBRootObject_PackagePrivate.h"
47+
header "GPBUnknownFieldSet_PackagePrivate.h"
48+
header "GPBUnknownField_PackagePrivate.h"
49+
header "GPBUtilities_PackagePrivate.h"
50+
export *
51+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import Sample
2+
3+
func main() {
4+
print(Sample())
5+
}

tests/ios/frameworks/protos/dep.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
syntax = "proto3";
2+
3+
package example;
4+
5+
message Dep {
6+
string name = 1;
7+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
load("//rules:framework.bzl", "apple_framework")
2+
load("@rules_proto_grpc//objc:defs.bzl", "objc_proto_compile")
3+
load("@rules_proto_grpc//internal:filter_files.bzl", "filter_files")
4+
5+
## This macro generates a apple_framework _per_ proto_srcs
6+
7+
def apple_proto_framework(name, proto_srcs, use_proto_map = True, deps = []):
8+
native.proto_library(
9+
name = name + "_proto",
10+
srcs = proto_srcs,
11+
# Internal implementation detail: assume all deps are protos
12+
deps = [d + "_proto" for d in deps],
13+
)
14+
15+
# proto_map.txt needs to correspend with the names used in rules_ios, this
16+
# allows the devs to import them as as such
17+
if use_proto_map:
18+
extra_protoc_args = [
19+
"--objc_opt",
20+
# In-practice this might be generated by a repository_rule or a
21+
# build rule - in that case just put the file here:
22+
# e.g. external/my_protos/proto_map.txt
23+
"named_framework_to_proto_path_mappings_path=tests/ios/frameworks/protos/proto_map.txt",
24+
]
25+
extra_protoc_files = [
26+
"proto_map.txt",
27+
]
28+
else:
29+
extra_protoc_args = []
30+
extra_protoc_files = []
31+
32+
objc_proto_compile(
33+
name = name + "_objc_proto",
34+
protos = [name + "_proto"],
35+
extra_protoc_args = extra_protoc_args,
36+
extra_protoc_files = extra_protoc_files,
37+
verbose = 2,
38+
)
39+
40+
# Filter files to sources and headers
41+
filter_files(
42+
name = name + ".pbobjc.m",
43+
target = name + "_objc_proto",
44+
extensions = ["m"],
45+
)
46+
47+
# This has to correspond with rules_ios
48+
filter_files(
49+
name = name + ".pbobjc.h",
50+
target = name + "_objc_proto",
51+
extensions = ["h"],
52+
)
53+
54+
apple_framework(
55+
name = name,
56+
srcs = [name + ".pbobjc.m", name + ".pbobjc.h"],
57+
objc_defines = ["GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1"],
58+
swift_defines = ["GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1"],
59+
deps = [":Protobuf"] + deps,
60+
platforms = {"ios": "10.0"},
61+
visibility = ["//visibility:public"],
62+
)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Sample:tests/ios/frameworks/protos/sample.proto
2+
Dep:tests/ios/frameworks/protos/dep.proto

tests/ios/frameworks/protos/sample.proto

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@ syntax = "proto3";
22

33
package example;
44

5-
message Thing {
5+
// Note: Need to import these in a way protoc can deal with
6+
// e.g. this is root relative
7+
// import "dep.proto";
8+
9+
import "tests/ios/frameworks/protos/dep.proto";
10+
11+
message Sample {
612
string name = 1;
7-
}
13+
Dep dep = 2;
14+
}

0 commit comments

Comments
 (0)