cmd/gomobile: require NDK r19c and delete workaround for NDK r19b
The prebuilt toolchains introduced in NDK r19b didn't work on Windows.
NDK r19c contains a fix, so remove our workaround and check for r19c
on Windows.
Change-Id: I3bcfedbc156f10c3cab8e74dcbd7de68575669e7
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/168067
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/cmd/gomobile/env.go b/cmd/gomobile/env.go
index 31878bb..dbf9c8c 100644
--- a/cmd/gomobile/env.go
+++ b/cmd/gomobile/env.go
@@ -4,7 +4,6 @@
"errors"
"fmt"
"io/ioutil"
- "log"
"os"
"os/exec"
"path/filepath"
@@ -86,17 +85,27 @@
androidEnv = make(map[string][]string)
for arch, toolchain := range ndk {
clang := toolchain.Path(ndkRoot, "clang")
+ clangpp := toolchain.Path(ndkRoot, "clang++")
if !buildN {
- _, err = os.Stat(clang)
- if err != nil {
- return fmt.Errorf("No compiler for %s was found in the NDK (tried %q). Make sure your NDK version is >= r19b. Use `sdkmanager --update` to update it.", arch, clang)
+ tools := []string{clang, clangpp}
+ if runtime.GOOS == "windows" {
+ // Because of https://github.com/android-ndk/ndk/issues/920,
+ // we require r19c, not just r19b. Fortunately, the clang++.cmd
+ // script only exists in r19c.
+ tools = append(tools, clangpp+".cmd")
+ }
+ for _, tool := range tools {
+ _, err = os.Stat(tool)
+ if err != nil {
+ return fmt.Errorf("No compiler for %s was found in the NDK (tried %s). Make sure your NDK version is >= r19c. Use `sdkmanager --update` to update it.", arch, tool)
+ }
}
}
androidEnv[arch] = []string{
"GOOS=android",
"GOARCH=" + arch,
"CC=" + clang,
- "CXX=" + toolchain.Path(ndkRoot, "clang++"),
+ "CXX=" + clangpp,
"CGO_ENABLED=1",
}
if arch == "arm" {
@@ -273,9 +282,6 @@
var pref string
switch toolName {
case "clang", "clang++":
- if runtime.GOOS == "windows" {
- return tc.createNDKr19bWorkaroundTool(ndkRoot, toolName)
- }
pref = tc.clangPrefix
default:
pref = tc.toolPrefix
@@ -283,31 +289,6 @@
return filepath.Join(ndkRoot, "toolchains", "llvm", "prebuilt", archNDK(), "bin", pref+"-"+toolName)
}
-// createNDKr19bWorkaroundTool creates a Windows wrapper script for clang or clang++.
-// The scripts included in r19b are broken on Windows: https://github.com/android-ndk/ndk/issues/920.
-// TODO: Remove this when r19c is out; the code inside is hacky and panicky.
-func (tc *ndkToolchain) createNDKr19bWorkaroundTool(ndkRoot, toolName string) string {
- toolCmd := filepath.Join(tmpdir, fmt.Sprintf("%s-%s.cmd", tc.arch, toolName))
- tool, err := os.Create(toolCmd)
- if err != nil {
- log.Fatal(err)
- }
- defer func() {
- if err := tool.Close(); err != nil {
- log.Fatal(err)
- }
- }()
- tcBin := filepath.Join(ndkRoot, "toolchains", "llvm", "prebuilt", archNDK(), "bin")
- // Adapted from the NDK cmd wrappers.
- toolCmdContent := fmt.Sprintf(`@echo off
-set _BIN_DIR=%s\
-%%_BIN_DIR%%%s.exe --target=%s -fno-addrsig %%*"`, tcBin, toolName, tc.clangPrefix)
- if _, err = tool.Write([]byte(toolCmdContent)); err != nil {
- log.Fatal(err)
- }
- return toolCmd
-}
-
type ndkConfig map[string]ndkToolchain // map: GOOS->androidConfig.
func (nc ndkConfig) Toolchain(arch string) ndkToolchain {