Repository navigation
Expand file tree
/
Copy pathsetup_android_deps.sh
More file actions
164 lines (143 loc) · 5.04 KB
/
Copy pathsetup_android_deps.sh
File metadata and controls
164 lines (143 loc) · 5.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/bin/bash
set -euo pipefail
# Pre-build script: installs all vcpkg dependencies for all Android ABIs
# Run this ONCE before building with Gradle
# Usage: ./setup_android_deps.sh
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
NDK="${ANDROID_NDK_HOME:-/home/dev/android-sdk/ndk/29.0.13599879}"
NDKBIN="$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin"
VCPKG="${VCPKG_ROOT:-/home/dev/vcpkg}"
LUAJIT_SRC="$SCRIPT_DIR/luajit-src"
# ABI -> vcpkg triplet mapping
declare -A ABI_MAP=(
["arm64-v8a"]="arm64-android"
["armeabi-v7a"]="arm-neon-android"
["x86_64"]="x64-android"
["x86"]="x86-android"
)
# ABI -> NDK cross-compile prefix (CROSS= prefix, without API level)
declare -A CROSS_MAP=(
["arm64-v8a"]="aarch64-linux-android-"
["armeabi-v7a"]="arm-linux-androideabi-"
["x86_64"]="x86_64-linux-android-"
["x86"]="i686-linux-android-"
)
# ABI -> NDK clang prefix (with API level, for STATIC_CC/DYNAMIC_CC/TARGET_LD)
declare -A CC_MAP=(
["arm64-v8a"]="aarch64-linux-android21-"
["armeabi-v7a"]="armv7a-linux-androideabi21-"
["x86_64"]="x86_64-linux-android21-"
["x86"]="i686-linux-android21-"
)
# ABI -> HOST_CC (32-bit ABIs need -m32)
declare -A HOSTCC_MAP=(
["arm64-v8a"]="gcc"
["armeabi-v7a"]="gcc -m32"
["x86_64"]="gcc"
["x86"]="gcc -m32"
)
build_luajit_for_abi() {
local ABI=$1
local TRIPLET=${ABI_MAP[$ABI]}
local CROSS=${CROSS_MAP[$ABI]}
local CC=${CC_MAP[$ABI]}
local HOST_CC="${HOSTCC_MAP[$ABI]}"
local INSTALL_DIR="$SCRIPT_DIR/android/app/libs"
echo "=== Building LuaJIT for $ABI ($TRIPLET) ==="
if [ ! -d "$LUAJIT_SRC/src" ]; then
echo "ERROR: LuaJIT source not found at $LUAJIT_SRC"
echo "Clone it: git clone https://github.com/LuaJIT/LuaJIT.git $LUAJIT_SRC"
exit 1
fi
cd "$LUAJIT_SRC"
make clean 2>/dev/null || true
make -j"$(nproc)" amalg \
HOST_CC="$HOST_CC" \
CROSS="${NDKBIN}/${CROSS}" \
STATIC_CC="${NDKBIN}/${CC}clang" \
DYNAMIC_CC="${NDKBIN}/${CC}clang -fPIC" \
TARGET_LD="${NDKBIN}/${CC}clang" \
TARGET_AR="$NDKBIN/llvm-ar rcus" \
TARGET_STRIP="$NDKBIN/llvm-strip" \
TARGET_CFLAGS="-fPIC -DLUAJIT_UNWIND_EXTERNAL -fno-stack-protector" \
BUILDMODE=static
# Install lib per-ABI
mkdir -p "$INSTALL_DIR/lib/$ABI"
cp src/libluajit.a "$INSTALL_DIR/lib/$ABI/libluajit-5.1.a"
# Install headers (shared across ABIs)
mkdir -p "$INSTALL_DIR/include/luajit"
cp src/lua.h src/lualib.h src/lauxlib.h src/luaconf.h \
src/luajit.h src/luajit_rolling.h "$INSTALL_DIR/include/luajit/"
# Create lua.hpp C++ wrapper if missing
if [ ! -f "$INSTALL_DIR/include/luajit/lua.hpp" ]; then
cat > "$INSTALL_DIR/include/luajit/lua.hpp" << 'LUAHPP'
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
LUAHPP
fi
echo " -> $ABI OK ($(du -h "$INSTALL_DIR/lib/$ABI/libluajit-5.1.a" | cut -f1))"
}
install_vcpkg_deps() {
local TRIPLET=$1
echo "=== Installing vcpkg deps for $TRIPLET ==="
cd "$SCRIPT_DIR"
"$VCPKG/vcpkg" install --triplet "$TRIPLET" --x-manifest-root=. --allow-unsupported 2>&1 | tail -3
}
# Step 1: Build LuaJIT for all ABIs
echo "============================="
echo "Step 1: Building LuaJIT"
echo "============================="
# Check gcc-multilib for 32-bit builds
if ! gcc -m32 -x c -c /dev/null -o /dev/null 2>/dev/null; then
echo "Installing gcc-multilib for 32-bit cross-compilation..."
sudo apt-get install -y gcc-multilib g++-multilib
fi
for ABI in "${!ABI_MAP[@]}"; do
build_luajit_for_abi "$ABI"
done
# Step 2: Install vcpkg deps (LuaJIT excluded from vcpkg, everything else)
echo ""
echo "============================="
echo "Step 2: Installing vcpkg deps"
echo "============================="
for ABI in "${!ABI_MAP[@]}"; do
TRIPLET=${ABI_MAP[$ABI]}
install_vcpkg_deps "$TRIPLET"
done
# Step 3: Generate data.zip asset bundle
echo ""
echo "============================="
echo "Step 3: Generating data.zip"
echo "============================="
mkdir -p "$SCRIPT_DIR/android/app/src/main/assets"
cd "$SCRIPT_DIR"
if command -v zip &>/dev/null; then
zip -r android/app/src/main/assets/data.zip data mods modules init.lua otclientrc.lua
elif command -v python3 &>/dev/null; then
python3 -c "
import zipfile, os
with zipfile.ZipFile('android/app/src/main/assets/data.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
for item in ['data', 'mods', 'modules']:
for root, dirs, files in os.walk(item):
for f in files:
zf.write(os.path.join(root, f))
for f in ['init.lua', 'otclientrc.lua']:
if os.path.exists(f):
zf.write(f)
"
else
echo "ERROR: neither zip nor python3 available to create data.zip"
exit 1
fi
echo "data.zip created: $(du -h android/app/src/main/assets/data.zip | cut -f1)"
echo ""
echo "============================="
echo "All dependencies installed!"
echo "============================="
echo "LuaJIT libs:"
ls -la "$SCRIPT_DIR/android/app/libs/lib/"*/libluajit-5.1.a
echo ""
echo "Now run: cd android && ./gradlew assembleRelease"