| /* |
| The convert_crosstool_to_starlark script takes in a CROSSTOOL file and |
| generates a Starlark rule. |
| |
| See https://github.com/bazelbuild/bazel/issues/5380 |
| |
| Example usage: |
| bazel run \ |
| @rules_cc//tools/migration:convert_crosstool_to_starlark -- \ |
| --crosstool=/path/to/CROSSTOOL \ |
| --output_location=/path/to/cc_config.bzl |
| */ |
| package main |
| |
| import ( |
| "flag" |
| "fmt" |
| "io/ioutil" |
| "os" |
| "os/user" |
| "path" |
| "strings" |
| |
| // Google internal base/go package, commented out by copybara |
| "log" |
| crosstoolpb "third_party/com/github/bazelbuild/bazel/src/main/protobuf/crosstool_config_go_proto" |
| "github.com/golang/protobuf/proto" |
| |
| "tools/migration/crosstooltostarlarklib" |
| ) |
| |
| var ( |
| crosstoolLocation = flag.String( |
| "crosstool", "", "Location of the CROSSTOOL file") |
| outputLocation = flag.String( |
| "output_location", "", "Location of the output .bzl file") |
| ) |
| |
| func toAbsolutePath(pathString string) (string, error) { |
| usr, err := user.Current() |
| if err != nil { |
| return "", err |
| } |
| homeDir := usr.HomeDir |
| |
| if strings.HasPrefix(pathString, "~") { |
| return path.Join(homeDir, pathString[1:]), nil |
| } |
| |
| if path.IsAbs(pathString) { |
| return pathString, nil |
| } |
| |
| workingDirectory := os.Getenv("BUILD_WORKING_DIRECTORY") |
| return path.Join(workingDirectory, pathString), nil |
| } |
| |
| func main() { |
| flag.Parse() |
| |
| if *crosstoolLocation == "" { |
| log.Fatalf("Missing mandatory argument 'crosstool'") |
| } |
| crosstoolPath, err := toAbsolutePath(*crosstoolLocation) |
| if err != nil { |
| log.Fatalf("Error while resolving CROSSTOOL location:", err) |
| } |
| |
| if *outputLocation == "" { |
| log.Fatalf("Missing mandatory argument 'output_location'") |
| } |
| outputPath, err := toAbsolutePath(*outputLocation) |
| if err != nil { |
| log.Fatalf("Error resolving output location:", err) |
| } |
| |
| in, err := ioutil.ReadFile(crosstoolPath) |
| if err != nil { |
| log.Fatalf("Error reading CROSSTOOL file:", err) |
| } |
| crosstool := &crosstoolpb.CrosstoolRelease{} |
| if err := proto.UnmarshalText(string(in), crosstool); err != nil { |
| log.Fatalf("Failed to parse CROSSTOOL:", err) |
| } |
| |
| file, err := os.Create(outputPath) |
| if err != nil { |
| log.Fatalf("Error creating output file:", err) |
| } |
| defer file.Close() |
| |
| rule, err := crosstooltostarlarklib.Transform(crosstool) |
| if err != nil { |
| log.Fatalf("Error converting CROSSTOOL to a Starlark rule:", err) |
| } |
| |
| if _, err := file.WriteString(rule); err != nil { |
| log.Fatalf("Error converting CROSSTOOL to a Starlark rule:", err) |
| } |
| fmt.Println("Success!") |
| } |