| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // The makefuchsia.go script builds a GOROOT in the out/ build directory |
| // using sources from third_party/go. |
| package main |
| |
| import ( |
| "bytes" |
| "flag" |
| "fmt" |
| "io/ioutil" |
| "log" |
| "os" |
| "os/exec" |
| "path/filepath" |
| "strings" |
| "time" |
| ) |
| |
| var ( |
| flagBootstrapGoroot = flag.String("bootstrap-goroot", "", "Path to go root used for bootstrap") |
| flagGoroot = flag.String("goroot", "", "Path to the output GOROOT") |
| |
| flagDepfilePath = flag.String("depfile", "", "depfile to write into") |
| flagDepfileTarget = flag.String("depfile-target", "", "depfile `make` target") |
| flagDepfileRoot = flag.String("depfile-root", "", "Path from which dependency paths should be rooted") |
| |
| flagStampPath = flag.String("stamp-file", "", "Path of a file to create upon completion") |
| ) |
| |
| func join(path ...string) string { return filepath.Join(path...) } |
| |
| func main() { |
| log.SetFlags(0) |
| log.SetPrefix("makefuchsia.go: ") |
| flag.Parse() |
| |
| versionFile := join(*flagGoroot, "VERSION") |
| origVersion, err := ioutil.ReadFile(versionFile) |
| if err != nil { |
| log.Fatal(err) |
| } |
| |
| // Do not repeat the updating of the VERSION file if it was previously performed. |
| if bytes.Index(origVersion, []byte("fuchsia")) == -1 { |
| if err := ioutil.WriteFile(versionFile, []byte(fmt.Sprintf("devel(%s) third_party/go fuchsia", bytes.TrimSpace(origVersion))), os.ModePerm); err != nil { |
| log.Fatal(err) |
| } |
| } |
| |
| env := os.Environ() |
| if *flagBootstrapGoroot == "" { |
| log.Fatal("-bootstrap-goroot is required") |
| } |
| env = append(env, "GOROOT_BOOTSTRAP="+strings.TrimSpace(*flagBootstrapGoroot)) |
| |
| abs, err := filepath.Abs(join(*flagGoroot, "src", "make.bash")) |
| if err != nil { |
| log.Fatal(err) |
| } |
| cmd := exec.Command(abs, "--no-clean") |
| cmd.Dir = join(*flagGoroot, "src") |
| cmd.Env = env |
| buf := new(bytes.Buffer) |
| cmd.Stdout = buf |
| cmd.Stderr = buf |
| if err := cmd.Run(); err != nil { |
| log.Fatalf("make.bash failed: %v\n%s", err, buf.String()) |
| } |
| |
| depfile, err := os.Create(*flagDepfilePath) |
| if err != nil { |
| log.Fatal(err) |
| } |
| fmt.Fprintf(depfile, "%s:", *flagStampPath) |
| |
| if err := filepath.Walk(*flagGoroot, func(path string, info os.FileInfo, err error) error { |
| if err != nil || info.IsDir() { |
| return err |
| } |
| fmt.Fprintf(depfile, " %s", path) |
| return err |
| }); err != nil { |
| log.Fatal(err) |
| } |
| |
| fmt.Fprint(depfile, "\n") |
| |
| if err := ioutil.WriteFile(*flagStampPath, []byte(fmt.Sprintf("%s", time.Now())), os.ModePerm); err != nil { |
| log.Fatal(err) |
| } |
| } |