Skip to content

Commit 0bbf4df

Browse files
committed
Remove rendering metadata from check results
1 parent f694cc9 commit 0bbf4df

File tree

17 files changed

+315
-428
lines changed

17 files changed

+315
-428
lines changed

autoconf/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ bzl_library(
5858
srcs = ["package_info.bzl"],
5959
visibility = ["//visibility:public"],
6060
deps = [
61+
":cc_autoconf_info_bzl",
6162
"//autoconf/private:bzl_lib",
6263
],
6364
)

autoconf/autoconf.bzl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def _autoconf_impl(ctx):
5454
cache_results = {}
5555
define_results = {}
5656
subst_results = {}
57+
unquoted_defines = []
5758

5859
actions = {}
5960

@@ -89,10 +90,11 @@ def _autoconf_impl(ctx):
8990
))
9091

9192
define_checks[define_name] = check
92-
93-
# Use cache file directly - no symlink needed
9493
define_results[define_name] = output
9594

95+
if check.get("unquote", False):
96+
unquoted_defines.append(define_name)
97+
9698
# Check for truthy value
9799
if subst:
98100
check["subst"] = subst_name
@@ -320,6 +322,7 @@ def _autoconf_impl(ctx):
320322
cache_results = cache_results,
321323
define_results = define_results,
322324
subst_results = subst_results,
325+
unquoted_defines = unquoted_defines,
323326
),
324327
OutputGroupInfo(
325328
autoconf_checks = depset([action.input for action in actions.values()]),

autoconf/autoconf_hdr.bzl

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,38 @@ def _autoconf_hdr_impl(ctx):
3939
all_define_checks = defaults.define | dep_results["define"]
4040
all_subst_checks = defaults.subst | dep_results["subst"]
4141

42-
inputs = depset([ctx.file.template] + all_subst_checks.values() + all_define_checks.values())
42+
# Merge unquoted_defines from defaults and transitive deps
43+
all_unquoted = {}
44+
for uq in getattr(defaults, "unquoted_defines", []):
45+
all_unquoted[uq] = True
46+
for uq in dep_results.get("unquoted_defines", []):
47+
all_unquoted[uq] = True
48+
49+
# Build the manifest: maps define/subst names to result file paths + metadata
50+
manifest_data = {
51+
"defines": {},
52+
"substs": {},
53+
}
54+
for define_name, result_file in all_define_checks.items():
55+
manifest_data["defines"][define_name] = {
56+
"path": result_file.path,
57+
"unquote": define_name in all_unquoted,
58+
}
59+
for subst_name, result_file in all_subst_checks.items():
60+
manifest_data["substs"][subst_name] = {
61+
"path": result_file.path,
62+
"unquote": subst_name in all_unquoted,
63+
}
64+
65+
manifest = ctx.actions.declare_file("{}.manifest.json".format(ctx.label.name))
66+
ctx.actions.write(
67+
output = manifest,
68+
content = json.encode_indent(manifest_data, indent = " " * 4) + "\n",
69+
)
70+
71+
inputs = depset(
72+
[ctx.file.template, manifest] + all_subst_checks.values() + all_define_checks.values(),
73+
)
4374

4475
# Process inlines: collect files and create mappings
4576
inline_files = []
@@ -55,21 +86,11 @@ def _autoconf_hdr_impl(ctx):
5586

5687
inputs = depset(inline_files, transitive = [inputs])
5788

58-
# Pass all individual results files directly to resolver (it merges internally)
59-
# Include both defaults and transitive checks so resolver can merge them
60-
# Use separate flags for each bucket
6189
args = ctx.actions.args()
6290
args.use_param_file("@%s", use_always = True)
6391
args.set_param_file_format("multiline")
6492

65-
# Add define results
66-
for results_file_path in all_define_checks.values():
67-
args.add("--define-result", results_file_path)
68-
69-
# Add subst results
70-
for results_file_path in all_subst_checks.values():
71-
args.add("--subst-result", results_file_path)
72-
93+
args.add("--manifest", manifest)
7394
args.add("--output", ctx.outputs.out)
7495
args.add("--template", ctx.file.template)
7596
args.add("--mode", ctx.attr.mode)

autoconf/autoconf_toolchain.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def _autoconf_toolchain_impl(ctx):
3434
cache = direct_results["cache"],
3535
define = direct_results["define"],
3636
subst = direct_results["subst"],
37+
unquoted_defines = direct_results["unquoted_defines"],
3738
)
3839

3940
return [
@@ -43,6 +44,7 @@ def _autoconf_toolchain_impl(ctx):
4344
cache = dep_results["cache"],
4445
define = dep_results["define"],
4546
subst = dep_results["subst"],
47+
unquoted_defines = dep_results["unquoted_defines"],
4648
defaults_by_label = defaults_by_label,
4749
),
4850
),

autoconf/cc_autoconf_info.bzl

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,29 @@
1-
"""# CcAutoconfInfo"""
1+
"""# CcAutoconfInfo
22
3+
Public API for external rules that produce autoconf-compatible check results.
4+
5+
The ``CcAutoconfInfo`` provider constructor accepts defaults for every field
6+
except ``owner``, so callers only need to supply the fields they care about:
7+
8+
```python
9+
load("@rules_cc_autoconf//autoconf:cc_autoconf_info.bzl",
10+
"CcAutoconfInfo", "encode_result")
11+
12+
def _my_rule_impl(ctx):
13+
result = ctx.actions.declare_file("{}/MY_DEFINE.result.json".format(ctx.label.name))
14+
ctx.actions.write(output = result, content = encode_result("hello"))
15+
return [CcAutoconfInfo(owner = ctx.label, define_results = {"MY_DEFINE": result})]
16+
```
17+
"""
18+
19+
load(
20+
"//autoconf/private:autoconf_config.bzl",
21+
_encode_result = "encode_result",
22+
)
323
load(
424
"//autoconf/private:providers.bzl",
525
_CcAutoconfInfo = "CcAutoconfInfo",
626
)
727

828
CcAutoconfInfo = _CcAutoconfInfo
29+
encode_result = _encode_result

autoconf/macros/AC_C_RESTRICT/restrict.bzl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ and a dedicated resolver tool to combine the results.
1515
"""
1616

1717
load("@rules_cc//cc:find_cc_toolchain.bzl", "use_cc_toolchain")
18+
load("//autoconf:cc_autoconf_info.bzl", "CcAutoconfInfo")
1819
load(
1920
"//autoconf/private:autoconf_config.bzl",
2021
"create_config_dict",
2122
"get_cc_toolchain_info",
2223
"get_environment_variables",
2324
"write_config_json",
2425
)
25-
load("//autoconf/private:providers.bzl", "CcAutoconfInfo")
2626

2727
# Test code templates for each keyword variant.
2828
# Each is a minimal C program that uses the keyword in a function signature.
@@ -127,10 +127,9 @@ def _ac_c_restrict_impl(ctx):
127127
return [
128128
CcAutoconfInfo(
129129
owner = ctx.label,
130-
deps = depset(),
131130
cache_results = {"restrict": restrict_result},
132131
define_results = {"restrict": restrict_result},
133-
subst_results = {},
132+
unquoted_defines = ["restrict"],
134133
),
135134
DefaultInfo(files = depset([restrict_result])),
136135
OutputGroupInfo(

autoconf/macros/AC_C_RESTRICT/restrict_resolver.cc

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -215,17 +215,12 @@ std::optional<bool> read_check_success(const std::string& path) {
215215
return std::nullopt;
216216
}
217217

218-
// The result file has one top-level key (the cache variable name)
219-
// with an object containing "success": true/false.
220-
auto it = j.begin();
221-
const nlohmann::json& result = it.value();
222-
223-
if (!result.contains("success") || !result["success"].is_boolean()) {
218+
if (!j.contains("success") || !j["success"].is_boolean()) {
224219
std::cerr << "Error: missing 'success' field in: " << path << std::endl;
225220
return std::nullopt;
226221
}
227222

228-
return result["success"].get<bool>();
223+
return j["success"].get<bool>();
229224
}
230225

231226
/**
@@ -243,31 +238,20 @@ std::optional<bool> read_check_success(const std::string& path) {
243238
*/
244239
int write_result(const std::string& path,
245240
const std::optional<std::string>& value, bool success) {
246-
nlohmann::json result_obj;
241+
nlohmann::json j;
247242

248243
if (value.has_value()) {
249244
if (value->empty()) {
250-
// Empty string: renders as #define restrict /**/
251-
result_obj["value"] = "";
245+
j["value"] = "";
252246
} else {
253-
// Keyword alias: renders as #define restrict <value>
254-
result_obj["value"] = *value;
247+
j["value"] = *value;
255248
}
256249
} else {
257-
// No define needed: keyword works natively.
258-
// Write null value so the define is not emitted.
259-
result_obj["value"] = nullptr;
250+
j["value"] = nullptr;
260251
}
261252

262-
result_obj["success"] = success;
263-
result_obj["is_define"] = true;
264-
result_obj["is_subst"] = false;
265-
result_obj["type"] = "compile";
266-
result_obj["define"] = "restrict";
267-
result_obj["unquote"] = true;
268-
269-
nlohmann::json j;
270-
j["restrict"] = result_obj;
253+
j["success"] = success;
254+
j["type"] = "compile";
271255

272256
std::ofstream out(path);
273257
if (!out.is_open()) {

autoconf/package_info.bzl

Lines changed: 15 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
"""# package_info"""
22

3-
load("//autoconf/private:providers.bzl", "CcAutoconfInfo")
3+
load(
4+
":cc_autoconf_info.bzl",
5+
"CcAutoconfInfo",
6+
"encode_result",
7+
)
48

59
_RUNNER_SOURCES = [
610
"PACKAGE_NAME",
@@ -84,60 +88,31 @@ def _package_info_impl(ctx):
8488
if source not in _RUNNER_SOURCES:
8589
ctx.actions.write(
8690
output = extra_results[key],
87-
content = json.encode_indent({
88-
key: {
89-
"success": True,
90-
"value": json.encode(starlark_alias_values[source]),
91-
},
92-
}, indent = " " * 4) + "\n",
91+
content = encode_result(starlark_alias_values[source]),
9392
)
9493

9594
else:
96-
# Write JSON files in check result format for PACKAGE_NAME
97-
# Use regular string (not json.encode) so it goes through .dump() in check.cc
9895
ctx.actions.write(
9996
output = results["PACKAGE_NAME"],
100-
content = json.encode_indent({
101-
"PACKAGE_NAME": {
102-
"success": True,
103-
"value": json.encode(ctx.attr.package_name),
104-
},
105-
}, indent = " " * 4) + "\n",
97+
content = encode_result(ctx.attr.package_name),
10698
)
10799

108-
# Write JSON files in check result format for PACKAGE_VERSION
109100
ctx.actions.write(
110101
output = results["PACKAGE_VERSION"],
111-
content = json.encode_indent({
112-
"PACKAGE_VERSION": {
113-
"success": True,
114-
"value": json.encode(ctx.attr.package_version),
115-
},
116-
}, indent = " " * 4) + "\n",
102+
content = encode_result(ctx.attr.package_version),
117103
)
118104

119-
# Write PACKAGE_STRING as "package_name package_version"
120105
package_string = ctx.attr.package_name + " " + ctx.attr.package_version
121106
ctx.actions.write(
122107
output = results["PACKAGE_STRING"],
123-
content = json.encode_indent({
124-
"PACKAGE_STRING": {
125-
"success": True,
126-
"value": json.encode(package_string),
127-
},
128-
}, indent = " " * 4) + "\n",
108+
content = encode_result(package_string),
129109
)
130110

131111
ctx.actions.write(
132112
output = results["PACKAGE_TARNAME"],
133-
content = json.encode_indent({
134-
"PACKAGE_TARNAME": {
135-
"success": True,
136-
"value": json.encode(
137-
ctx.attr.package_tarname if ctx.attr.package_tarname else ctx.attr.package_name,
138-
),
139-
},
140-
}, indent = " " * 4) + "\n",
113+
content = encode_result(
114+
ctx.attr.package_tarname if ctx.attr.package_tarname else ctx.attr.package_name,
115+
),
141116
)
142117

143118
all_values = {
@@ -151,43 +126,23 @@ def _package_info_impl(ctx):
151126
for key, source in ctx.attr.aliases.items():
152127
ctx.actions.write(
153128
output = extra_results[key],
154-
content = json.encode_indent({
155-
key: {
156-
"success": True,
157-
"value": json.encode(all_values[source]),
158-
},
159-
}, indent = " " * 4) + "\n",
129+
content = encode_result(all_values[source]),
160130
)
161131

162132
ctx.actions.write(
163133
output = results["PACKAGE_BUGREPORT"],
164-
content = json.encode_indent({
165-
"PACKAGE_BUGREPORT": {
166-
"success": True,
167-
"value": json.encode(ctx.attr.package_bugreport),
168-
},
169-
}, indent = " " * 4) + "\n",
134+
content = encode_result(ctx.attr.package_bugreport),
170135
)
171136

172137
ctx.actions.write(
173138
output = results["PACKAGE_URL"],
174-
content = json.encode_indent({
175-
"PACKAGE_URL": {
176-
"success": True,
177-
"value": json.encode(ctx.attr.package_url),
178-
},
179-
}, indent = " " * 4) + "\n",
139+
content = encode_result(ctx.attr.package_url),
180140
)
181141

182-
# Package info creates defines (for config.h), so put them in define_results
183-
# They're not cache variables or subst values
184142
return [
185143
CcAutoconfInfo(
186144
owner = ctx.label,
187-
deps = depset(),
188-
cache_results = {},
189145
define_results = results | extra_results,
190-
subst_results = {},
191146
),
192147
]
193148

0 commit comments

Comments
 (0)