mirror of https://github.com/grpc/grpc.git
parent
9b1f8e4274
commit
1b54364aca
6 changed files with 1360 additions and 13 deletions
@ -0,0 +1,29 @@ |
||||
#!/usr/bin/env python2.7 |
||||
|
||||
# Copyright 2019 gRPC authors. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
|
||||
import os |
||||
import yaml |
||||
|
||||
BUILDS_YAML_PATH = os.path.join( |
||||
os.path.dirname(os.path.abspath(__file__)), 'preprocessed_builds.yaml') |
||||
with open(BUILDS_YAML_PATH) as f: |
||||
builds = yaml.load(f) |
||||
|
||||
for build in builds: |
||||
build['build'] = 'private' |
||||
build['build_system'] = [] |
||||
build['language'] = 'c' |
||||
print(yaml.dump({'libs': builds})) |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,130 @@ |
||||
#!/usr/bin/env python3 |
||||
|
||||
# Copyright 2019 gRPC authors. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
|
||||
import collections |
||||
import os |
||||
import subprocess |
||||
import xml.etree.ElementTree as ET |
||||
import yaml |
||||
|
||||
ABSEIL_PATH = "third_party/abseil-cpp" |
||||
OUTPUT_PATH = "src/abseil-cpp/preprocessed_builds.yaml" |
||||
|
||||
# Rule object representing the rule of Bazel BUILD. |
||||
Rule = collections.namedtuple( |
||||
"Rule", "type name package srcs hdrs textual_hdrs deps visibility testonly") |
||||
|
||||
|
||||
def get_elem_value(elem, name): |
||||
"""Returns the value of XML element with the given name.""" |
||||
for child in elem: |
||||
if child.attrib.get("name") == name: |
||||
if child.tag == "string": |
||||
return child.attrib.get("value") |
||||
elif child.tag == "boolean": |
||||
return child.attrib.get("value") == "true" |
||||
elif child.tag == "list": |
||||
return [nested_child.attrib.get("value") for nested_child in child] |
||||
else: |
||||
raise "Cannot recognize tag: " + child.tag |
||||
return None |
||||
|
||||
|
||||
def normalize_paths(paths): |
||||
"""Returns the list of normalized path.""" |
||||
# e.g. ["//absl/strings:dir/header.h"] -> ["absl/strings/dir/header.h"] |
||||
return [path.lstrip("/").replace(":", "/") for path in paths] |
||||
|
||||
|
||||
def parse_rule(elem, package): |
||||
"""Returns a rule from bazel XML rule.""" |
||||
return Rule( |
||||
type=elem.attrib["class"], |
||||
name=get_elem_value(elem, "name"), |
||||
package=package, |
||||
srcs=normalize_paths(get_elem_value(elem, "srcs") or []), |
||||
hdrs=normalize_paths(get_elem_value(elem, "hdrs") or []), |
||||
textual_hdrs=normalize_paths(get_elem_value(elem, "textual_hdrs") or []), |
||||
deps=get_elem_value(elem, "deps") or [], |
||||
visibility=get_elem_value(elem, "visibility") or [], |
||||
testonly=get_elem_value(elem, "testonly") or False) |
||||
|
||||
|
||||
def read_build(package): |
||||
"""Runs bazel query on given package file and returns all cc rules.""" |
||||
result = subprocess.check_output( |
||||
["bazel", "query", package + ":all", "--output", "xml"]) |
||||
root = ET.fromstring(result) |
||||
return [ |
||||
parse_rule(elem, package) |
||||
for elem in root |
||||
if elem.tag == "rule" and elem.attrib["class"].startswith("cc_") |
||||
] |
||||
|
||||
|
||||
def collect_rules(root_path): |
||||
"""Collects and returns all rules from root path recursively.""" |
||||
rules = [] |
||||
for cur, _, _ in os.walk(root_path): |
||||
build_path = os.path.join(cur, "BUILD.bazel") |
||||
if os.path.exists(build_path): |
||||
rules.extend(read_build("//" + cur)) |
||||
return rules |
||||
|
||||
|
||||
def resolve_hdrs(files): |
||||
return [ |
||||
ABSEIL_PATH + "/" + f for f in files if f.endswith((".h", ".inc")) |
||||
] |
||||
|
||||
|
||||
def resolve_srcs(files): |
||||
return [ |
||||
ABSEIL_PATH + "/" + f for f in files if f.endswith(".cc") |
||||
] |
||||
|
||||
|
||||
def resolve_deps(targets): |
||||
return [(t[2:] if t.startswith("//") else t) for t in targets] |
||||
|
||||
|
||||
def generate_builds(root_path): |
||||
"""Generates builds from all BUILD files under absl directory.""" |
||||
rules = filter(lambda r: r.type == "cc_library" and not r.testonly, |
||||
collect_rules(root_path)) |
||||
builds = [] |
||||
for rule in sorted(rules, key=lambda r: r.package[2:] + ":" + r.name): |
||||
p = { |
||||
"name": rule.package[2:] + ":" + rule.name, |
||||
"headers": sorted(resolve_hdrs(rule.srcs + rule.hdrs + rule.textual_hdrs)), |
||||
"src": sorted(resolve_srcs(rule.srcs + rule.hdrs + rule.textual_hdrs)), |
||||
"deps": sorted(resolve_deps(rule.deps)), |
||||
} |
||||
builds.append(p) |
||||
return builds |
||||
|
||||
|
||||
def main(): |
||||
previous_dir = os.getcwd() |
||||
os.chdir(ABSEIL_PATH) |
||||
builds = generate_builds("absl") |
||||
os.chdir(previous_dir) |
||||
with open(OUTPUT_PATH, 'w') as outfile: |
||||
outfile.write(yaml.dump(builds, indent=2, sort_keys=True)) |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
main() |
Loading…
Reference in new issue