| """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) |