#!/usr/bin/env python
# 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.

# Build script for a Go app.

import argparse
import os
import subprocess
import sys


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--fuchsia-root', help='Path to root of Fuchsia project',
                        required=True)
    parser.add_argument('--root-out-dir', help='Path to root of build output',
                        required=True)
    parser.add_argument('--depfile', help='The path to the depfile',
                        required=True)
    parser.add_argument('--current-cpu', help='Target arch, x64 or arm64.',
                        required=True)
    parser.add_argument('--go-tool', help='The go tool to use for builds')
    parser.add_argument('--is-test', help='True if the target is a go test',
                        default=False)
    parser.add_argument('--binname', help='Output file')
    parser.add_argument('package', help='The package name')
    args = parser.parse_args()

    if args.current_cpu == "x64":
        goarch = "amd64"
    elif args.current_cpu == "arm64":
        goarch = "arm64"
    else:
        print("unknown current_cpu: ", args.current_cpu)
        return 1

    sympaths = {
        'apps': 'apps',
        'apps/amber': 'github.com/flynn/go-tuf',
        'apps/thinfs': 'fuchsia.googlesource.com/thinfs',
        'lib/fidl/go/src/fidl' : 'fidl',
        'third_party/golang/crypto': 'golang.org/x/crypto',
        'third_party/golibs/github.com/dustin/go-humanize': 'github.com/dustin/go-humanize',
        'third_party/golibs/github.com/flynn/go-docopt': 'github.com/flynn/go-docopt',
        'third_party/golibs/github.com/golang/snappy': 'github.com/golang/snappy',
        'third_party/golibs/github.com/syndtr/goleveldb/leveldb': 'github.com/syndtr/goleveldb/leveldb',
        'third_party/golibs/github.com/tent/canonical-json-go': 'github.com/tent/canonical-json-go',
        'third_party/netstack': 'github.com/google/netstack'
    }

    gopath = args.root_out_dir
    for src in sympaths:
        dst = os.path.join(gopath, "src", sympaths[src])
        try:
            os.makedirs(os.path.dirname(dst))
        except OSError, e:
            if e.errno == os.errno.EEXIST:
                pass # ignore, already have directory
            else:
                print("could not mkdir for path: ", dst, ": ", e)
                return 1
        try:
            os.symlink(os.path.join(args.fuchsia_root, src), dst)
        except OSError, e:
            if e.errno == os.errno.EEXIST:
                pass # ignore, already have symlink
            else:
                print("could not link: ", src, ": ", e)
                return 1

    os.environ['CGO_ENABLED'] = '1'
    os.environ['GOPATH'] = gopath + ":" + os.path.join(args.root_out_dir, "gen/go")
    os.environ['GOOS'] = 'fuchsia'
    os.environ['GOARCH'] = goarch
    if 'GOBIN' in os.environ:
        del os.environ['GOBIN']
    if 'GOROOT' in os.environ:
        del os.environ['GOROOT']
    godepfile = os.path.join(args.fuchsia_root, 'buildtools/godepfile')

    if args.is_test:
        retcode = subprocess.call([args.go_tool, 'test', '-c', '-o', args.binname,
                                  args.package], env=os.environ)
    else:
        retcode = subprocess.call([args.go_tool, 'install', args.package],
                                  env=os.environ)

    if retcode == 0:
        if args.is_test:
            binname = args.binname
        else:
            # For regular Go binaries, they are placed in a "bin/fuchsia_ARCH"
            # output directory; this relocates them to the root of the
            # gopath. Tests are not impacted.
            binname = os.path.basename(args.package)
            src = os.path.join(gopath, "bin", "fuchsia_"+goarch, binname)
            if args.binname:
                dst = os.path.join(gopath, args.binname)
            else:
                dst = os.path.join(gopath, binname)
            os.rename(src, dst)

        if args.depfile is not None:
            with open(args.depfile, "wb") as out:
                os.environ['GOROOT'] = os.path.join(args.fuchsia_root, "third_party/go")
                subprocess.Popen([godepfile, '-o', binname, args.package], stdout=out, env=os.environ)
    return retcode


if __name__ == '__main__':
    sys.exit(main())
