|
4 | 4 | "errors"
|
5 | 5 | "fmt"
|
6 | 6 | "io/ioutil"
|
7 |
| - "log" |
8 | 7 | "os"
|
9 | 8 | "os/exec"
|
10 | 9 | "path/filepath"
|
@@ -86,17 +85,27 @@ func envInit() (err error) {
|
86 | 85 | androidEnv = make(map[string][]string)
|
87 | 86 | for arch, toolchain := range ndk {
|
88 | 87 | clang := toolchain.Path(ndkRoot, "clang")
|
| 88 | + clangpp := toolchain.Path(ndkRoot, "clang++") |
89 | 89 | if !buildN {
|
90 |
| - _, err = os.Stat(clang) |
91 |
| - if err != nil { |
92 |
| - 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) |
| 90 | + tools := []string{clang, clangpp} |
| 91 | + if runtime.GOOS == "windows" { |
| 92 | + // Because of https://github.com/android-ndk/ndk/issues/920, |
| 93 | + // we require r19c, not just r19b. Fortunately, the clang++.cmd |
| 94 | + // script only exists in r19c. |
| 95 | + tools = append(tools, clangpp+".cmd") |
| 96 | + } |
| 97 | + for _, tool := range tools { |
| 98 | + _, err = os.Stat(tool) |
| 99 | + if err != nil { |
| 100 | + 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) |
| 101 | + } |
93 | 102 | }
|
94 | 103 | }
|
95 | 104 | androidEnv[arch] = []string{
|
96 | 105 | "GOOS=android",
|
97 | 106 | "GOARCH=" + arch,
|
98 | 107 | "CC=" + clang,
|
99 |
| - "CXX=" + toolchain.Path(ndkRoot, "clang++"), |
| 108 | + "CXX=" + clangpp, |
100 | 109 | "CGO_ENABLED=1",
|
101 | 110 | }
|
102 | 111 | if arch == "arm" {
|
@@ -273,41 +282,13 @@ func (tc *ndkToolchain) Path(ndkRoot, toolName string) string {
|
273 | 282 | var pref string
|
274 | 283 | switch toolName {
|
275 | 284 | case "clang", "clang++":
|
276 |
| - if runtime.GOOS == "windows" { |
277 |
| - return tc.createNDKr19bWorkaroundTool(ndkRoot, toolName) |
278 |
| - } |
279 | 285 | pref = tc.clangPrefix
|
280 | 286 | default:
|
281 | 287 | pref = tc.toolPrefix
|
282 | 288 | }
|
283 | 289 | return filepath.Join(ndkRoot, "toolchains", "llvm", "prebuilt", archNDK(), "bin", pref+"-"+toolName)
|
284 | 290 | }
|
285 | 291 |
|
286 |
| -// createNDKr19bWorkaroundTool creates a Windows wrapper script for clang or clang++. |
287 |
| -// The scripts included in r19b are broken on Windows: https://github.com/android-ndk/ndk/issues/920. |
288 |
| -// TODO: Remove this when r19c is out; the code inside is hacky and panicky. |
289 |
| -func (tc *ndkToolchain) createNDKr19bWorkaroundTool(ndkRoot, toolName string) string { |
290 |
| - toolCmd := filepath.Join(tmpdir, fmt.Sprintf("%s-%s.cmd", tc.arch, toolName)) |
291 |
| - tool, err := os.Create(toolCmd) |
292 |
| - if err != nil { |
293 |
| - log.Fatal(err) |
294 |
| - } |
295 |
| - defer func() { |
296 |
| - if err := tool.Close(); err != nil { |
297 |
| - log.Fatal(err) |
298 |
| - } |
299 |
| - }() |
300 |
| - tcBin := filepath.Join(ndkRoot, "toolchains", "llvm", "prebuilt", archNDK(), "bin") |
301 |
| - // Adapted from the NDK cmd wrappers. |
302 |
| - toolCmdContent := fmt.Sprintf(`@echo off |
303 |
| -set _BIN_DIR=%s\ |
304 |
| -%%_BIN_DIR%%%s.exe --target=%s -fno-addrsig %%*"`, tcBin, toolName, tc.clangPrefix) |
305 |
| - if _, err = tool.Write([]byte(toolCmdContent)); err != nil { |
306 |
| - log.Fatal(err) |
307 |
| - } |
308 |
| - return toolCmd |
309 |
| -} |
310 |
| - |
311 | 292 | type ndkConfig map[string]ndkToolchain // map: GOOS->androidConfig.
|
312 | 293 |
|
313 | 294 | func (nc ndkConfig) Toolchain(arch string) ndkToolchain {
|
|
0 commit comments