def find_subninjas_and_includes(contents) -> List[str]:
results = [] def get_path_from_directive(i):
j = contents.find(b'\n', i) if j < 0:
path_bytes = contents[i:] else:
path_bytes = contents[i:j]
path_bytes = path_bytes.removesuffix(b'\r')
path = path_bytes.decode() if'$dist'in path: # Soong uses the $dist variable to control which ninja file to include # for dist targets. Expand the variable to both possible values.
dist = path.replace('$dist', 'dist')
nodist = path.replace('$dist', 'nodist') if'$'in dist:
sys.exit('includes/subninjas with variables are unsupported: '+path) return [dist, nodist] if'$'in path:
sys.exit('includes/subninjas with variables are unsupported: '+path) return [path]
if contents.startswith(b"include "):
results.extend(get_path_from_directive(len(b"include "))) elif contents.startswith(b"subninja "):
results.extend(get_path_from_directive(len(b"subninja ")))
for match in SUBNINJA_OR_INCLUDE_REGEX.finditer(contents):
results.extend(get_path_from_directive(match.end()))
return results
def transitively_included_ninja_files(out_dir: str, ninja_file: str, seen): with open(ninja_file, 'rb') as f:
contents = f.read()
results = [ninja_file]
seen[ninja_file] = True
sub_files = find_subninjas_and_includes(contents) for sub_file in sub_files:
sub_file = os.path.join(out_dir, sub_file.removeprefix('out/')) if sub_file notin seen:
results.extend(transitively_included_ninja_files(out_dir, sub_file, seen))
return results
def hash_ninja_file(out_dir: str, ninja_file: str, hasher): with open(ninja_file, 'rb') as f:
contents = f.read()
sub_files = find_subninjas_and_includes(contents)
hasher.update(contents)
for sub_file in sub_files:
hash_ninja_file(out_dir, os.path.join(out_dir, sub_file.removeprefix('out/')), hasher)
def hash_files(files: List[str]) -> str:
hasher = hashlib.md5() for file in files: with open(file, 'rb') as f:
hasher.update(f.read()) return hasher.hexdigest()
with open(os.path.join(dist_dir, zip_name), 'wb') as f: with zipfile.ZipFile(f, mode='w') as zf: for ninja_file in ninja_files:
zf.write(ninja_file, arcname=os.path.basename(out_dir)+'/out/' + os.path.relpath(ninja_file, out_dir))
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.