// 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)
	}
}
