diff options
Diffstat (limited to 'tools/migration/legacy_fields_migrator.py')
-rw-r--r-- | tools/migration/legacy_fields_migrator.py | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/tools/migration/legacy_fields_migrator.py b/tools/migration/legacy_fields_migrator.py new file mode 100644 index 0000000..cc1bb41 --- /dev/null +++ b/tools/migration/legacy_fields_migrator.py @@ -0,0 +1,69 @@ +"""Script migrating legacy CROSSTOOL fields into features. + +This script migrates the CROSSTOOL to use only the features to describe C++ +command lines. It is intended to be added as a last step of CROSSTOOL generation +pipeline. Since it doesn't retain comments, we assume CROSSTOOL owners will want +to migrate their pipeline manually. +""" + +# Tracking issue: https://github.com/bazelbuild/bazel/issues/5187 +# +# Since C++ rules team is working on migrating CROSSTOOL from text proto into +# Starlark, we advise CROSSTOOL owners to wait for the CROSSTOOL -> Starlark +# migrator before they invest too much time into fixing their pipeline. Tracking +# issue for the Starlark effort is +# https://github.com/bazelbuild/bazel/issues/5380. + +from absl import app +from absl import flags +from google.protobuf import text_format +from third_party.com.github.bazelbuild.bazel.src.main.protobuf import crosstool_config_pb2 +from tools.migration.legacy_fields_migration_lib import migrate_legacy_fields +import os + +flags.DEFINE_string("input", None, "Input CROSSTOOL file to be migrated") +flags.DEFINE_string("output", None, + "Output path where to write migrated CROSSTOOL.") +flags.DEFINE_boolean("inline", None, "Overwrite --input file") + + +def main(unused_argv): + crosstool = crosstool_config_pb2.CrosstoolRelease() + + input_filename = flags.FLAGS.input + output_filename = flags.FLAGS.output + inline = flags.FLAGS.inline + + if not input_filename: + raise app.UsageError("ERROR --input unspecified") + if not output_filename and not inline: + raise app.UsageError("ERROR --output unspecified and --inline not passed") + if output_filename and inline: + raise app.UsageError("ERROR both --output and --inline passed") + + with open(to_absolute_path(input_filename), "r") as f: + input_text = f.read() + + text_format.Merge(input_text, crosstool) + + migrate_legacy_fields(crosstool) + output_text = text_format.MessageToString(crosstool) + + resolved_output_filename = to_absolute_path( + input_filename if inline else output_filename) + with open(resolved_output_filename, "w") as f: + f.write(output_text) + +def to_absolute_path(path): + path = os.path.expanduser(path) + if os.path.isabs(path): + return path + else: + if "BUILD_WORKING_DIRECTORY" in os.environ: + return os.path.join(os.environ["BUILD_WORKING_DIRECTORY"], path) + else: + return path + + +if __name__ == "__main__": + app.run(main) |