// 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"
	"time"
)

var (
	flagBootstrapGoroot = flag.String("bootstrap-goroot", "", "Path to go root used for bootstrap")
	flagGocache         = flag.String("gocache", "", "Path to GOCACHE")
	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 := append(
		os.Environ(),
		"GOROOT_BOOTSTRAP="+*flagBootstrapGoroot,
		"GOCACHE="+*flagGocache,
	)

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