aboutsummaryrefslogtreecommitdiff
path: root/checkbuild.py
diff options
context:
space:
mode:
authorDan Albert <danalbert@google.com>2018-08-08 16:20:42 -0700
committerDan Albert <danalbert@google.com>2018-08-08 22:21:40 -0700
commit38e325f25aa1d3432691218cf00a60c3c1d81e8a (patch)
tree0aed937d4c492ff41352f4adffe6367219237a73 /checkbuild.py
parentdd0f579a20d0eac7900bd8bdbe0d875d61dcbf3e (diff)
downloadndk-38e325f25aa1d3432691218cf00a60c3c1d81e8a.tar.gz
Install "GCC" wrappers that call Clang.
These are provided to ease porting to new NDKs for projects that are not actually sensitive to changes in compiler, just changes to compiler install path. Test: ./checkbuild.py && path/to/arm-linux-androideabi-gcc --help Bug: https://github.com/android-ndk/ndk/issues/758 Change-Id: I8becbf764c37800b5670f412f63302c638252674
Diffstat (limited to 'checkbuild.py')
-rwxr-xr-xcheckbuild.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/checkbuild.py b/checkbuild.py
index de059e42f..6a4d0aebb 100755
--- a/checkbuild.py
+++ b/checkbuild.py
@@ -37,6 +37,7 @@ import os
import re
import shutil
import site
+import stat
import subprocess
import sys
import tempfile
@@ -458,6 +459,7 @@ class Binutils(ndk.builds.Module):
install_path = self.get_install_path(out_dir, host, arch)
toolchain_path = get_binutils_prebuilt_path(host, arch)
ndk.builds.install_directory(toolchain_path, install_path)
+ self.install_mock_gcc(out_dir, install_path, host, arch)
# We still need libgcc/libatomic. Copy them from the old GCC prebuilts.
for subarch in get_subarches(arch):
@@ -507,6 +509,62 @@ class Binutils(ndk.builds.Module):
libwinpthread = os.path.join(clang_bin, 'libwinpthread-1.dll')
shutil.copy2(libwinpthread, bfd_plugins)
+ def install_mock_gcc(self, out_dir, install_path, host, arch):
+ """Installs gcc scripts that invoke clang.
+
+ These are provided to ease porting to new NDKs for projects that are
+ not actually sensitive to changes in compiler, just changes to compiler
+ install path.
+ """
+ is_win = host.startswith('windows')
+ exe = '.exe' if is_win else ''
+ cmd = '.cmd' if is_win else ''
+ clang_install_path = os.path.relpath(
+ Clang().get_install_path(out_dir, host, arch),
+ os.path.join(install_path, 'bin'))
+
+ shortcuts = {'gcc': 'clang', 'g++': 'clang++'}
+ for src, dst in shortcuts.items():
+ triple = ndk.abis.arch_to_triple(arch)
+ gcc = os.path.join(install_path, 'bin', triple + '-' + src + cmd)
+ clang = os.path.join(clang_install_path, 'bin', dst + exe)
+ if is_win:
+ self.install_cmd_clang_shortcut(gcc, clang, triple)
+ else:
+ self.install_sh_clang_shortcut(gcc, clang, triple)
+
+ def install_cmd_clang_shortcut(self, gcc, clang, triple):
+ clang = clang.replace('/', '\\')
+ with open(gcc, 'w') as gcc_script:
+ gcc_script.write(
+ textwrap.dedent("""\
+ @echo off
+ setlocal
+ call :find_bin
+
+ set "_BIN_DIR=" && %_BIN_DIR%{clang} -target {triple} %*
+ if ERRORLEVEL 1 exit /b 1
+ goto :done
+
+ :find_bin
+ rem Accommodate a quoted arg0, e.g.: "clang"
+ rem https://github.com/android-ndk/ndk/issues/616
+ set _BIN_DIR=%~dp0
+ exit /b
+
+ :done
+ """.format(clang=clang, triple=triple)))
+
+ def install_sh_clang_shortcut(self, gcc, clang, triple):
+ with open(gcc, 'w') as gcc_script:
+ gcc_script.write(
+ textwrap.dedent("""\
+ #!/bin/bash
+ exec `dirname $0`/{clang} -target {triple} "$@"
+ """.format(clang=clang, triple=triple)))
+ mode = os.stat(gcc).st_mode
+ os.chmod(gcc, mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
+
class ShaderTools(ndk.builds.InvokeBuildModule):
name = 'shader-tools'