|
1 |
| -#!/bin/bash |
2 |
| - |
3 |
| -# In order to cross-compile node for Android using NDK, run: |
4 |
| -# source android-configure <path_to_ndk> [arch] |
5 |
| -# |
6 |
| -# By running android-configure with source, will allow environment variables to |
7 |
| -# be persistent in current session. This is useful for installing native node |
8 |
| -# modules with npm. Also, don't forget to set the arch in npm config using |
9 |
| -# 'npm config set arch=<arch>' |
10 |
| - |
11 |
| -if [ $# -ne 3 ]; then |
12 |
| - echo "$0 should have 3 parameters: ndk_path, target_arch and sdk_version" |
13 |
| - return 1 |
14 |
| -fi |
15 |
| - |
16 |
| -NDK_PATH=$1 |
17 |
| -ARCH="$2" |
18 |
| -ANDROID_SDK_VERSION=$3 |
19 |
| - |
20 |
| -if [ $ANDROID_SDK_VERSION -lt 24 ]; then |
21 |
| - echo "$ANDROID_SDK_VERSION should equal or later than 24 (Android 7.0)" |
22 |
| -fi |
23 |
| - |
24 |
| -case $ARCH in |
25 |
| - arm) |
26 |
| - DEST_CPU="arm" |
27 |
| - TOOLCHAIN_NAME="armv7a-linux-androideabi" |
28 |
| - ;; |
29 |
| - x86) |
30 |
| - DEST_CPU="ia32" |
31 |
| - TOOLCHAIN_NAME="i686-linux-android" |
32 |
| - ;; |
33 |
| - x86_64) |
34 |
| - DEST_CPU="x64" |
35 |
| - TOOLCHAIN_NAME="x86_64-linux-android" |
36 |
| - ARCH="x64" |
37 |
| - ;; |
38 |
| - arm64|aarch64) |
39 |
| - DEST_CPU="arm64" |
40 |
| - TOOLCHAIN_NAME="aarch64-linux-android" |
41 |
| - ARCH="arm64" |
42 |
| - ;; |
43 |
| - *) |
44 |
| - echo "Unsupported architecture provided: $ARCH" |
45 |
| - return 1 |
46 |
| - ;; |
47 |
| -esac |
48 |
| - |
49 |
| -HOST_OS="linux" |
50 |
| -HOST_ARCH="x86_64" |
51 |
| -export CC_host=$(command -v gcc) |
52 |
| -export CXX_host=$(command -v g++) |
53 |
| - |
54 |
| -host_gcc_version=$($CC_host --version | grep gcc | awk '{print $NF}') |
55 |
| -major=$(echo $host_gcc_version | awk -F . '{print $1}') |
56 |
| -minor=$(echo $host_gcc_version | awk -F . '{print $2}') |
57 |
| -if [ -z $major ] || [ -z $minor ] || [ $major -lt 6 ] || ( [ $major -eq 6 ] && [ $minor -lt 3 ] ); then |
58 |
| - echo "host gcc $host_gcc_version is too old, need gcc 6.3.0" |
59 |
| - return 1 |
60 |
| -fi |
61 |
| - |
62 |
| -SUFFIX="$TOOLCHAIN_NAME$ANDROID_SDK_VERSION" |
63 |
| -TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/$HOST_OS-$HOST_ARCH |
64 |
| - |
65 |
| -export PATH=$TOOLCHAIN/bin:$PATH |
66 |
| -export CC=$TOOLCHAIN/bin/$SUFFIX-clang |
67 |
| -export CXX=$TOOLCHAIN/bin/$SUFFIX-clang++ |
68 |
| - |
69 |
| - |
70 |
| -GYP_DEFINES="target_arch=$ARCH" |
71 |
| -GYP_DEFINES+=" v8_target_arch=$ARCH" |
72 |
| -GYP_DEFINES+=" android_target_arch=$ARCH" |
73 |
| -GYP_DEFINES+=" host_os=$HOST_OS OS=android" |
74 |
| -export GYP_DEFINES |
75 |
| - |
76 |
| -if [ -f "configure" ]; then |
77 |
| - ./configure \ |
78 |
| - --dest-cpu=$DEST_CPU \ |
79 |
| - --dest-os=android \ |
80 |
| - --without-snapshot \ |
81 |
| - --openssl-no-asm \ |
82 |
| - --cross-compiling |
83 |
| -fi |
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +# Locate an acceptable Python interpreter and then re-execute the script. |
| 4 | +# Note that the mix of single and double quotes is intentional, |
| 5 | +# as is the fact that the ] goes on a new line. |
| 6 | +_=[ 'exec' '/bin/sh' '-c' ''' |
| 7 | +command -v python3.10 >/dev/null && exec python3.10 "$0" "$@" |
| 8 | +command -v python3.9 >/dev/null && exec python3.9 "$0" "$@" |
| 9 | +command -v python3.8 >/dev/null && exec python3.8 "$0" "$@" |
| 10 | +command -v python3.7 >/dev/null && exec python3.7 "$0" "$@" |
| 11 | +command -v python3.6 >/dev/null && exec python3.6 "$0" "$@" |
| 12 | +command -v python3 >/dev/null && exec python3 "$0" "$@" |
| 13 | +exec python "$0" "$@" |
| 14 | +''' "$0" "$@" |
| 15 | +] |
| 16 | +del _ |
| 17 | + |
| 18 | +import sys |
| 19 | +try: |
| 20 | + from shutil import which |
| 21 | +except ImportError: |
| 22 | + from distutils.spawn import find_executable as which |
| 23 | + |
| 24 | +print('Node.js android configure: Found Python {}.{}.{}...'.format(*sys.version_info)) |
| 25 | +acceptable_pythons = ((3, 10), (3, 9), (3, 8), (3, 7), (3, 6)) |
| 26 | +if sys.version_info[:2] in acceptable_pythons: |
| 27 | + import android_configure |
| 28 | +else: |
| 29 | + python_cmds = ['python{}.{}'.format(*vers) for vers in acceptable_pythons] |
| 30 | + sys.stderr.write('Please use {}.\n'.format(' or '.join(python_cmds))) |
| 31 | + for python_cmd in python_cmds: |
| 32 | + python_cmd_path = which(python_cmd) |
| 33 | + if python_cmd_path and 'pyenv/shims' not in python_cmd_path: |
| 34 | + sys.stderr.write('\t{} {}\n'.format(python_cmd_path, ' '.join(sys.argv[:1]))) |
| 35 | + sys.exit(1) |
0 commit comments