diff options
Diffstat (limited to 'python/mozbuild/mozbuild/generated_sources.py')
-rw-r--r-- | python/mozbuild/mozbuild/generated_sources.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/generated_sources.py b/python/mozbuild/mozbuild/generated_sources.py new file mode 100644 index 0000000000..e22e71e5f6 --- /dev/null +++ b/python/mozbuild/mozbuild/generated_sources.py @@ -0,0 +1,75 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import hashlib +import json +import os + +import mozpack.path as mozpath +from mozpack.files import FileFinder + +GENERATED_SOURCE_EXTS = (".rs", ".c", ".h", ".cc", ".cpp") + + +def sha512_digest(data): + """ + Generate the SHA-512 digest of `data` and return it as a hex string. + """ + return hashlib.sha512(data).hexdigest() + + +def get_filename_with_digest(name, contents): + """ + Return the filename that will be used to store the generated file + in the S3 bucket, consisting of the SHA-512 digest of `contents` + joined with the relative path `name`. + """ + digest = sha512_digest(contents) + return mozpath.join(digest, name) + + +def get_generated_sources(): + """ + Yield tuples of `(objdir-rel-path, file)` for generated source files + in this objdir, where `file` is either an absolute path to the file or + a `mozpack.File` instance. + """ + import buildconfig + + # First, get the list of generated sources produced by the build backend. + gen_sources = os.path.join(buildconfig.topobjdir, "generated-sources.json") + with open(gen_sources, "r") as f: + data = json.load(f) + for f in data["sources"]: + # Exclute symverscript + if mozpath.basename(f) != "symverscript": + yield f, mozpath.join(buildconfig.topobjdir, f) + # Next, return all the files in $objdir/ipc/ipdl/_ipdlheaders. + base = "ipc/ipdl/_ipdlheaders" + finder = FileFinder(mozpath.join(buildconfig.topobjdir, base)) + for p, f in finder.find("**/*.h"): + yield mozpath.join(base, p), f + # Next, return any source files that were generated into the Rust + # object directory. + rust_build_kind = "debug" if buildconfig.substs.get("MOZ_DEBUG_RUST") else "release" + base = mozpath.join(buildconfig.substs["RUST_TARGET"], rust_build_kind, "build") + finder = FileFinder(mozpath.join(buildconfig.topobjdir, base)) + for p, f in finder: + if p.endswith(GENERATED_SOURCE_EXTS): + yield mozpath.join(base, p), f + + +def get_s3_region_and_bucket(): + """ + Return a tuple of (region, bucket) giving the AWS region and S3 + bucket to which generated sources should be uploaded. + """ + region = "us-west-2" + level = os.environ.get("MOZ_SCM_LEVEL", "1") + bucket = { + "1": "gecko-generated-sources-l1", + "2": "gecko-generated-sources-l2", + "3": "gecko-generated-sources", + }[level] + return (region, bucket) |