| // 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" |
| "io/ioutil" |
| "log" |
| "os" |
| "os/exec" |
| "path/filepath" |
| "time" |
| ) |
| |
| var ( |
| bootstrapGoroot = flag.String("bootstrap-goroot", "", "Path to go root used for bootstrap") |
| gocache = flag.String("gocache", "", "Path to GOCACHE") |
| goroot = flag.String("goroot", "", "Path to the output GOROOT") |
| |
| depfilePath = flag.String("depfile", "", "depfile to write into") |
| stampPath = flag.String("stamp-file", "", "Path of a file to create upon completion") |
| ) |
| |
| func main() { |
| log.SetFlags(log.Lshortfile) |
| flag.Parse() |
| |
| src := filepath.Join(*goroot, "src") |
| |
| abs, err := filepath.Abs(filepath.Join(src, "make.bash")) |
| if err != nil { |
| log.Fatal(err) |
| } |
| cmd := exec.Command(abs) |
| cmd.Dir = src |
| cmd.Env = []string{ |
| "PATH=" + os.Getenv("PATH"), |
| "GOROOT_BOOTSTRAP=" + *bootstrapGoroot, |
| "GOCACHE=" + *gocache, |
| } |
| if tmp, ok := os.LookupEnv("TMPDIR"); ok { |
| cmd.Env = append(cmd.Env, "TMPDIR=" + tmp) |
| } |
| if out, err := cmd.CombinedOutput(); err != nil { |
| log.Fatalf("%s failed: %s\n%s", cmd.Args, err, out) |
| } |
| |
| var buf bytes.Buffer |
| buf.WriteString(*stampPath) |
| buf.WriteByte(':') |
| if err := filepath.Walk(*goroot, func(path string, info os.FileInfo, err error) error { |
| if err != nil { |
| return err |
| } |
| if !info.IsDir() { |
| buf.WriteByte(' ') |
| buf.WriteString(path) |
| } |
| return nil |
| }); err != nil { |
| log.Fatal(err) |
| } |
| |
| buf.WriteByte('\n') |
| |
| if err := ioutil.WriteFile(*depfilePath, buf.Bytes(), os.ModePerm); err != nil { |
| log.Fatal(err) |
| } |
| |
| f, err := os.OpenFile(*stampPath, os.O_CREATE|os.O_TRUNC, os.ModePerm) |
| if err != nil { |
| log.Fatal(err) |
| } |
| if err := f.Close(); err != nil { |
| log.Fatal(err) |
| } |
| now := time.Now() |
| if err := os.Chtimes(*stampPath, now, now); err != nil { |
| log.Fatal(err) |
| } |
| } |