-
Notifications
You must be signed in to change notification settings - Fork 7
/
refresh_launch_json.bzl
158 lines (147 loc) · 6.17 KB
/
refresh_launch_json.bzl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
load("@build_bazel_rules_apple//apple:providers.bzl", "AppleBundleInfo")
load("//:bisproject_aspect.bzl", "bis_aspect")
load("//:providers.bzl", "BisProjInfo")
def _create_launch_items(target, pre_launch_task_name):
# Return launch_items[], dep_files[]
launch_items = []
dep_files = []
if not AppleBundleInfo in target:
return launch_items, dep_files
bundle_info = target[AppleBundleInfo]
if bundle_info.bundle_extension == ".app":
program = "{}{}".format(bundle_info.bundle_name, bundle_info.bundle_extension)
# ios-debug cannot run .app so we need to convert it into executable in payload
if bundle_info.platform_type == "ios":
program = "Payload/{}.app".format(bundle_info.bundle_name)
launch_items.append(struct(
name = "Launch",
type = "lldb",
request = "launch",
program = '${workspaceFolder}/'+ "{}/{}".format(bundle_info.archive_root, program),
ipaPath = '${workspaceFolder}/'+ bundle_info.archive.path,
iosBundleId = bundle_info.bundle_id,
iosTarget = "last-selected",
preLaunchTask = pre_launch_task_name,
sourceMap = {"./": "${workspaceFolder}"}
))
launch_items.append(struct(
name = "Attach",
type = "lldb",
request = "attach",
program = '${workspaceFolder}/'+ "{}/{}".format(bundle_info.archive_root, program),
ipaPath = '${workspaceFolder}/'+ bundle_info.archive.path,
iosBundleId = bundle_info.bundle_id,
iosTarget = "last-selected",
sourceMap = {"./": "${workspaceFolder}"}
))
elif bundle_info.platform_type == "macos":
program = "{}.app".format(bundle_info.bundle_name)
launch_items.append(struct(
name = "Launch",
type = "lldb",
request = "launch",
program = '${workspaceFolder}/'+ "{}/{}".format(bundle_info.archive_root, program),
ipaPath = '${workspaceFolder}/'+ bundle_info.archive.path,
preLaunchTask = pre_launch_task_name,
sourceMap = {"./": "${workspaceFolder}"}
))
launch_items.append(struct(
name = "Attach",
type = "lldb",
request = "attach",
program = '${workspaceFolder}/'+ "{}/{}".format(bundle_info.archive_root, program),
ipaPath = '${workspaceFolder}/'+ bundle_info.archive.path,
sourceMap = {"./": "${workspaceFolder}"}
))
elif bundle_info.bundle_extension == ".xctest":
bis_info = target[BisProjInfo]
xctest_infos = bis_info.transitive_xctest_infos.to_list()
if len(xctest_infos) != 1:
fail("There should be only one xctest info in the target")
xctest_info = xctest_infos[0]
if xctest_info.xctest_run_file:
launch_items.append(struct(
name = "Launch",
type = "lldb",
sourceMap = {"./": "${workspaceFolder}"},
preLaunchTask = "bis.build: xctest bundle outputs",
BIS_XCTEST_RUN_FILE = xctest_info.xctest_run_file.path,
BIS_XCTEST_IS_DEVICE = xctest_info.xctest_is_device,
))
dep_files.append(xctest_info.xctest_run_file)
else:
launch_items.append(struct(
name = "Launch",
type = "lldb",
cwd = "${workspaceFolder}",
internalConsoleOptions = "openOnSessionStart",
console = "internalConsole",
sourceMap = {"./": "${workspaceFolder}"},
preLaunchTask = "bis.build: xctest bundle outputs",
BIS_XCTEST_BUNDLE = xctest_info.xctest_bundle.path,
BIS_XCTEST_IS_DEVICE = xctest_info.xctest_is_device,
BIS_XCTEST_ARCH_CPU = xctest_info.xctest_arch_cpu,
))
dep_files.append(xctest_info.xctest_bundle)
return launch_items, dep_files
def _refresh_launch_json(ctx):
# Launch configurations
launch_items = []
dep_files = []
target = ctx.attr.target
pre_launch_task_name = ctx.attr.pre_launch_task_name
launch_items, dep_files = _create_launch_items(target, pre_launch_task_name)
if len(launch_items) == 0:
# We should assert that if the files do not exist, we should not create a launch configuration. So just throw an exception
launch_items.append(struct(
name = "Launch",
type = "lldb",
request = "launch",
program = '${workspaceFolder}/'+ target.files.to_list()[0].path,
preLaunchTask = pre_launch_task_name,
sourceMap = {"./": "${workspaceFolder}"}
))
launch_items.append(struct(
name = "Attach",
type = "lldb",
request = "attach",
program = '${workspaceFolder}/'+ target.files.to_list()[0].path,
sourceMap = {"./": "${workspaceFolder}"}
))
launch_configuration = struct(
version = "2.0.0",
configurations = launch_items
)
output = ctx.actions.declare_file("{}-runner.py".format(ctx.attr.name))
ctx.actions.expand_template(
template = ctx.file._runner_template,
output = output,
is_executable = True,
substitutions = {
"%config_name%": "launch.json",
"%json_items%": json.encode_indent(launch_configuration, indent=' '),
},
)
return [
DefaultInfo(
executable = output,
files = depset(dep_files)
),
]
refresh_launch_json = rule(
implementation = _refresh_launch_json,
attrs = {
"target": attr.label(
mandatory = True,
aspects = [bis_aspect],
),
"pre_launch_task_name": attr.string(
default = "${config:bis.pre_launch_task_name}"
),
"_runner_template": attr.label(
allow_single_file = True,
default = Label("//:json.template.py"),
),
},
executable = True,
)