blob: 2c31456dfa5f2b319f316aa06ea51d80cdccde6a [file] [log] [blame]
/*
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!")
}