2
0
mirror of synced 2025-02-24 07:18:15 +00:00
mobile/cmd/gomobile/version.go
Elias Naur e7109766ab cmd/gomobile: test for XCode in gomobile init
Previously, gomobile init assumed that the XCode developer tools
were available when running on darwin. That is not always the case,
in particular for Android developers on macOS.

Replace the GOOS check with an explicit check for the xcrun binary.

Change-Id: Ie5ae917288932cc641a17f904ed9822a105367cc
Reviewed-on: https://go-review.googlesource.com/35852
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
2017-01-28 13:36:49 +00:00

81 lines
2.2 KiB
Go

// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"bytes"
"fmt"
"os"
"os/exec"
"path/filepath"
)
var cmdVersion = &command{
run: runVersion,
Name: "version",
Usage: "",
Short: "print version",
Long: `
Version prints versions of the gomobile binary and tools
`,
}
func runVersion(cmd *command) (err error) {
// Check this binary matches the version in golang.org/x/mobile/cmd/gomobile
// source code in GOPATH. If they don't match, currently there is no
// way to reliably identify the revision number this binary was built
// against.
version, err := func() (string, error) {
bin, err := exec.LookPath(os.Args[0])
if err != nil {
return "", err
}
bindir := filepath.Dir(bin)
cmd := exec.Command("go", "install", "-x", "-n", "golang.org/x/mobile/cmd/gomobile")
cmd.Env = append(os.Environ(), "GOBIN="+bindir)
out, err := cmd.CombinedOutput()
if err != nil {
return "", fmt.Errorf("cannot test gomobile binary: %v, %s", err, out)
}
if len(out) != 0 {
return "", fmt.Errorf("binary is out of date, re-install it")
}
return mobileRepoRevision()
}()
if err != nil {
fmt.Printf("gomobile version unknown: %v\n", err)
return nil
}
// Supported platforms
platforms := "android"
if xcodeAvailable() {
platforms = "android,ios"
}
// ANDROID_HOME, sdk build tool version
androidapi, _ := androidAPIPath()
fmt.Printf("gomobile version %s (%s); androidSDK=%s\n", version, platforms, androidapi)
return nil
}
func mobileRepoRevision() (rev string, err error) {
b, err := exec.Command("go", "list", "-f", "{{.Dir}}", "golang.org/x/mobile/app").CombinedOutput()
if err != nil {
return "", fmt.Errorf("mobile repo not found: %v, %s", err, b)
}
repo := filepath.Dir(string(b))
if err := os.Chdir(repo); err != nil {
return "", fmt.Errorf("mobile repo %q not accessible: %v", repo, err)
}
revision, err := exec.Command("git", "log", "-n", "1", "--format=format: +%h %cd", "HEAD").CombinedOutput()
if err != nil {
return "", fmt.Errorf("mobile repo git log failed: %v, %s", err, revision)
}
return string(bytes.Trim(revision, " \t\r\n")), nil
}