Skip to content

Commit 914b984

Browse files
committed
[CMake] Merge Clang's features file with Swift's
Clang has a new `redirecting-with` property in the VFS overlay files. While this could be added to Swift's features as well, it is generally the case that features provided by Clang can also be useful to know for clients of Swift. Merge the features from Clang into Swift's features file with the "clang-" prefix to differentiate them.
1 parent a9a512d commit 914b984

File tree

2 files changed

+95
-3
lines changed

2 files changed

+95
-3
lines changed

lib/Option/CMakeLists.txt

+7-3
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@ add_dependencies(swiftOption
66
target_link_libraries(swiftOption PRIVATE
77
swiftBasic)
88

9-
set(features_file_src "${CMAKE_CURRENT_SOURCE_DIR}/features.json")
9+
set(features_merger "${SWIFT_SOURCE_DIR}/utils/merge-features.py")
10+
set(features_file_swift_src "${CMAKE_CURRENT_SOURCE_DIR}/features.json")
11+
set(features_file_clang_src "${LLVM_MAIN_SRC_DIR}/../clang/tools/driver/features.json")
1012
set(features_file_dest "${CMAKE_BINARY_DIR}/share/swift/features.json")
1113

1214
add_custom_command(
1315
OUTPUT
1416
${features_file_dest}
1517
COMMAND
16-
${CMAKE_COMMAND} -E copy ${features_file_src} ${features_file_dest}
18+
${features_merger} -f ${features_file_swift_src} -p \"\" -f ${features_file_clang_src} -p clang- ${features_file_dest}
1719
DEPENDS
18-
${features_file_src}
20+
${features_merger}
21+
${features_file_swift_src}
22+
${features_file_clang_src}
1923
)
2024

2125
add_custom_target(swift-features-file DEPENDS ${features_file_dest})

utils/merge-features.py

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#!/usr/bin/env python3
2+
3+
import argparse
4+
import json
5+
import sys
6+
7+
8+
def error(message):
9+
sys.stderr.write(message)
10+
sys.stderr.write("\n")
11+
sys.exit(1)
12+
13+
14+
def invalid_file(features_file, message):
15+
error(f"Invalid features file '{features_file}': {message}")
16+
17+
18+
def parse_args():
19+
parser = argparse.ArgumentParser(
20+
formatter_class=argparse.RawDescriptionHelpFormatter,
21+
description="""
22+
Merges the given feature files together into DEST (or stdout if DEST
23+
is not given). Each file FILE must be given a corresponding PREFIX to
24+
prefix the name of each entry in its features list, though these could
25+
be empty if no prefix is required.
26+
27+
Note that the files and prefixes are treated as an ordered list, ie.
28+
the first FILE corresponds to the first PREFIX.
29+
""")
30+
31+
parser.add_argument(
32+
"--file", "-f", action="append", dest="files",
33+
help="path of a file to merge"
34+
)
35+
parser.add_argument(
36+
"--prefix", "-p", action="append", dest="prefixes",
37+
help="prefix to prepend to the name of each feature"
38+
)
39+
parser.add_argument(
40+
"dest", nargs="?",
41+
help="path to store the merged file"
42+
)
43+
44+
return parser.parse_known_args()
45+
46+
47+
def read_features(from_file, add_prefix):
48+
with open(from_file, "r") as f:
49+
features_dict = json.load(f)
50+
51+
if "features" not in features_dict:
52+
invalid_file(from_file, "missing 'features' key")
53+
54+
features = []
55+
for feature in features_dict["features"]:
56+
if "name" not in feature:
57+
invalid_file(from_file, "missing name in features list")
58+
59+
features.append({"name": add_prefix + feature["name"]})
60+
return features
61+
62+
63+
def main():
64+
(args, _) = parse_args()
65+
66+
if not args.files:
67+
error("No files to merge were provided")
68+
69+
if len(args.files) != len(args.prefixes):
70+
error("Must supply the same number of files and prefixes")
71+
72+
features = []
73+
for i, (f, prefix) in enumerate(zip(args.files, args.prefixes)):
74+
features.extend(read_features(f, prefix))
75+
76+
data = {
77+
"features": features
78+
}
79+
80+
if args.dest:
81+
with open(args.dest, "w") as f:
82+
json.dump(data, f, indent=2)
83+
else:
84+
sys.stdout.write(json.dumps(data, indent=2))
85+
86+
87+
if __name__ == '__main__':
88+
main()

0 commit comments

Comments
 (0)