@annadata/capacitor-mqtt-quic 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +399 -0
- package/android/NGTCP2_BUILD_INSTRUCTIONS.md +319 -0
- package/android/build-nghttp3.sh +182 -0
- package/android/build-ngtcp2.sh +289 -0
- package/android/build-openssl.sh +302 -0
- package/android/build.gradle +75 -0
- package/android/gradle.properties +3 -0
- package/android/proguard-rules.pro +2 -0
- package/android/settings.gradle +1 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/assets/mqttquic_ca.pem +5 -0
- package/android/src/main/cpp/CMakeLists.txt +157 -0
- package/android/src/main/cpp/ngtcp2_jni.cpp +928 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/MqttQuicPlugin.kt +232 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/client/MQTTClient.kt +339 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5Properties.kt +250 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5Protocol.kt +281 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTT5ReasonCodes.kt +109 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTTProtocol.kt +249 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/mqtt/MQTTTypes.kt +47 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/NGTCP2Client.kt +184 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicClientStub.kt +54 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/quic/QuicTypes.kt +21 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/transport/QUICStreamAdapter.kt +37 -0
- package/android/src/main/kotlin/ai/annadata/mqttquic/transport/StreamTransport.kt +91 -0
- package/android/src/test/kotlin/ai/annadata/mqttquic/mqtt/MQTTProtocolTest.kt +92 -0
- package/dist/esm/definitions.d.ts +66 -0
- package/dist/esm/definitions.d.ts.map +1 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +28 -0
- package/dist/esm/web.d.ts.map +1 -0
- package/dist/esm/web.js +183 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +217 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +215 -0
- package/dist/plugin.js.map +1 -0
- package/ios/MqttQuicPlugin.podspec +34 -0
- package/ios/NGTCP2_BUILD_INSTRUCTIONS.md +302 -0
- package/ios/Sources/MqttQuicPlugin/Client/MQTTClient.swift +343 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5Properties.swift +280 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5Protocol.swift +333 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTT5ReasonCodes.swift +113 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTTProtocol.swift +322 -0
- package/ios/Sources/MqttQuicPlugin/MQTT/MQTTTypes.swift +54 -0
- package/ios/Sources/MqttQuicPlugin/MqttQuicPlugin.swift +229 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Bridge.h +29 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Bridge.mm +865 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/NGTCP2Client.swift +262 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/QuicClientStub.swift +66 -0
- package/ios/Sources/MqttQuicPlugin/QUIC/QuicTypes.swift +23 -0
- package/ios/Sources/MqttQuicPlugin/Resources/mqttquic_ca.pem +5 -0
- package/ios/Sources/MqttQuicPlugin/Transport/QUICStreamAdapter.swift +50 -0
- package/ios/Sources/MqttQuicPlugin/Transport/StreamTransport.swift +105 -0
- package/ios/Tests/MQTTProtocolTests.swift +82 -0
- package/ios/build-nghttp3.sh +173 -0
- package/ios/build-ngtcp2.sh +278 -0
- package/ios/build-openssl.sh +405 -0
- package/package.json +63 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Build script for nghttp3 on Android
|
|
4
|
+
#
|
|
5
|
+
# This script builds nghttp3 as a static library for Android using NDK.
|
|
6
|
+
# It requires:
|
|
7
|
+
# - Android NDK r25+
|
|
8
|
+
# - CMake 3.20+
|
|
9
|
+
#
|
|
10
|
+
# Usage:
|
|
11
|
+
# ./build-nghttp3.sh [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--prefix PATH]
|
|
12
|
+
#
|
|
13
|
+
# Example:
|
|
14
|
+
# ./build-nghttp3.sh --ndk-path ~/Android/Sdk/ndk/25.2.9519653 --abi arm64-v8a --platform android-21
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
set -e
|
|
18
|
+
|
|
19
|
+
# Default values
|
|
20
|
+
ANDROID_NDK="${ANDROID_NDK:-}"
|
|
21
|
+
ANDROID_ABI="${ANDROID_ABI:-arm64-v8a}"
|
|
22
|
+
ANDROID_PLATFORM="${ANDROID_PLATFORM:-android-21}"
|
|
23
|
+
BUILD_TYPE="${BUILD_TYPE:-Release}"
|
|
24
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
25
|
+
if [ -n "$PROJECT_DIR" ]; then
|
|
26
|
+
REF_CODE_DIR="$(cd "$PROJECT_DIR/ref-code" && pwd)"
|
|
27
|
+
else
|
|
28
|
+
REF_CODE_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
29
|
+
fi
|
|
30
|
+
INSTALL_PREFIX="${INSTALL_PREFIX:-$SCRIPT_DIR/install/nghttp3-android}"
|
|
31
|
+
|
|
32
|
+
# Parse arguments
|
|
33
|
+
while [[ $# -gt 0 ]]; do
|
|
34
|
+
case $1 in
|
|
35
|
+
--ndk-path)
|
|
36
|
+
ANDROID_NDK="$2"
|
|
37
|
+
shift 2
|
|
38
|
+
;;
|
|
39
|
+
--abi)
|
|
40
|
+
ANDROID_ABI="$2"
|
|
41
|
+
shift 2
|
|
42
|
+
;;
|
|
43
|
+
--platform)
|
|
44
|
+
ANDROID_PLATFORM="$2"
|
|
45
|
+
shift 2
|
|
46
|
+
;;
|
|
47
|
+
--build-type)
|
|
48
|
+
BUILD_TYPE="$2"
|
|
49
|
+
shift 2
|
|
50
|
+
;;
|
|
51
|
+
--prefix)
|
|
52
|
+
INSTALL_PREFIX="$2"
|
|
53
|
+
shift 2
|
|
54
|
+
;;
|
|
55
|
+
*)
|
|
56
|
+
echo "Unknown option: $1"
|
|
57
|
+
echo "Usage: $0 [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--prefix PATH]"
|
|
58
|
+
exit 1
|
|
59
|
+
;;
|
|
60
|
+
esac
|
|
61
|
+
done
|
|
62
|
+
|
|
63
|
+
# Check prerequisites
|
|
64
|
+
if ! command -v cmake &> /dev/null; then
|
|
65
|
+
echo "Error: CMake is not installed. Please install CMake 3.20+"
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
# Find Android NDK
|
|
70
|
+
if [ -z "$ANDROID_NDK" ]; then
|
|
71
|
+
if [ -d "$HOME/Android/Sdk/ndk" ]; then
|
|
72
|
+
LATEST_NDK=$(ls -d "$HOME/Android/Sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
|
|
73
|
+
if [ -n "$LATEST_NDK" ]; then
|
|
74
|
+
ANDROID_NDK="$LATEST_NDK"
|
|
75
|
+
fi
|
|
76
|
+
elif [ -d "$HOME/Library/Android/sdk/ndk" ]; then
|
|
77
|
+
LATEST_NDK=$(ls -d "$HOME/Library/Android/sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
|
|
78
|
+
if [ -n "$LATEST_NDK" ]; then
|
|
79
|
+
ANDROID_NDK="$LATEST_NDK"
|
|
80
|
+
fi
|
|
81
|
+
fi
|
|
82
|
+
if [ -z "$ANDROID_NDK" ]; then
|
|
83
|
+
echo "Error: Android NDK not found. Please specify --ndk-path"
|
|
84
|
+
echo "Or set ANDROID_NDK environment variable"
|
|
85
|
+
exit 1
|
|
86
|
+
fi
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
if [ ! -d "$ANDROID_NDK" ]; then
|
|
90
|
+
echo "Error: Android NDK directory not found: $ANDROID_NDK"
|
|
91
|
+
exit 1
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
echo "Building nghttp3 for Android"
|
|
95
|
+
echo " NDK Path: $ANDROID_NDK"
|
|
96
|
+
echo " ABI: $ANDROID_ABI"
|
|
97
|
+
echo " Platform: $ANDROID_PLATFORM"
|
|
98
|
+
echo " Build Type: $BUILD_TYPE"
|
|
99
|
+
if [[ "$INSTALL_PREFIX" != *"/$ANDROID_ABI" ]]; then
|
|
100
|
+
INSTALL_PREFIX="$INSTALL_PREFIX/$ANDROID_ABI"
|
|
101
|
+
fi
|
|
102
|
+
echo " Install Prefix: $INSTALL_PREFIX"
|
|
103
|
+
|
|
104
|
+
# Check if nghttp3 source exists
|
|
105
|
+
if [ -n "$NGHTTP3_SOURCE_DIR" ]; then
|
|
106
|
+
if [[ "$NGHTTP3_SOURCE_DIR" != /* ]]; then
|
|
107
|
+
NGHTTP3_SOURCE_DIR="$REF_CODE_DIR/$NGHTTP3_SOURCE_DIR"
|
|
108
|
+
fi
|
|
109
|
+
else
|
|
110
|
+
NGHTTP3_SOURCE_DIR="$REF_CODE_DIR/nghttp3"
|
|
111
|
+
fi
|
|
112
|
+
if [ ! -d "$NGHTTP3_SOURCE_DIR" ] && [ -d "$REF_CODE_DIR/nghttp3" ]; then
|
|
113
|
+
echo "Warning: NGHTTP3_SOURCE_DIR not found; using $REF_CODE_DIR/nghttp3"
|
|
114
|
+
NGHTTP3_SOURCE_DIR="$REF_CODE_DIR/nghttp3"
|
|
115
|
+
fi
|
|
116
|
+
if [ ! -d "$NGHTTP3_SOURCE_DIR" ]; then
|
|
117
|
+
echo "Error: nghttp3 source directory not found: $NGHTTP3_SOURCE_DIR"
|
|
118
|
+
echo "Please set NGHTTP3_SOURCE_DIR environment variable or clone nghttp3:"
|
|
119
|
+
echo " git clone --recurse-submodules https://github.com/ngtcp2/nghttp3.git $NGHTTP3_SOURCE_DIR"
|
|
120
|
+
exit 1
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# Ensure required submodules are present (sfparse, munit)
|
|
124
|
+
if [ ! -f "$NGHTTP3_SOURCE_DIR/sfparse/sfparse.c" ] || [ ! -f "$NGHTTP3_SOURCE_DIR/munit/munit.c" ]; then
|
|
125
|
+
if [ -d "$NGHTTP3_SOURCE_DIR/.git" ]; then
|
|
126
|
+
echo "Initializing nghttp3 submodules..."
|
|
127
|
+
(cd "$NGHTTP3_SOURCE_DIR" && git submodule update --init --recursive) || {
|
|
128
|
+
echo "Error: Failed to initialize nghttp3 submodules"
|
|
129
|
+
exit 1
|
|
130
|
+
}
|
|
131
|
+
else
|
|
132
|
+
echo "Error: nghttp3 submodules are missing (sfparse/munit)"
|
|
133
|
+
echo "Please clone with submodules:"
|
|
134
|
+
echo " git clone --recurse-submodules https://github.com/ngtcp2/nghttp3.git $NGHTTP3_SOURCE_DIR"
|
|
135
|
+
echo "Or if already cloned:"
|
|
136
|
+
echo " cd $NGHTTP3_SOURCE_DIR && git submodule update --init --recursive"
|
|
137
|
+
exit 1
|
|
138
|
+
fi
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
# Create build directory
|
|
142
|
+
BUILD_DIR="build/nghttp3-android-$ANDROID_ABI"
|
|
143
|
+
mkdir -p "$BUILD_DIR"
|
|
144
|
+
|
|
145
|
+
# Clean build dir if CMake cache points to a different source tree
|
|
146
|
+
if [ -f "$BUILD_DIR/CMakeCache.txt" ]; then
|
|
147
|
+
CMAKE_HOME_DIR=$(grep "^CMAKE_HOME_DIRECTORY:INTERNAL=" "$BUILD_DIR/CMakeCache.txt" | cut -d= -f2-)
|
|
148
|
+
if [ -n "$CMAKE_HOME_DIR" ] && [ "$CMAKE_HOME_DIR" != "$NGHTTP3_SOURCE_DIR" ]; then
|
|
149
|
+
echo "CMake cache source mismatch. Cleaning $BUILD_DIR"
|
|
150
|
+
rm -rf "$BUILD_DIR"
|
|
151
|
+
mkdir -p "$BUILD_DIR"
|
|
152
|
+
fi
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
cd "$BUILD_DIR"
|
|
156
|
+
|
|
157
|
+
# Configure CMake
|
|
158
|
+
CMAKE_ARGS=(
|
|
159
|
+
-DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
|
|
160
|
+
-DANDROID_ABI="$ANDROID_ABI"
|
|
161
|
+
-DANDROID_PLATFORM="$ANDROID_PLATFORM"
|
|
162
|
+
-DCMAKE_BUILD_TYPE="$BUILD_TYPE"
|
|
163
|
+
-DENABLE_LIB_ONLY=ON
|
|
164
|
+
-DCMAKE_INSTALL_PREFIX="$INSTALL_PREFIX"
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
echo ""
|
|
168
|
+
echo "Configuring CMake..."
|
|
169
|
+
cmake "$NGHTTP3_SOURCE_DIR" "${CMAKE_ARGS[@]}"
|
|
170
|
+
|
|
171
|
+
echo ""
|
|
172
|
+
echo "Building nghttp3..."
|
|
173
|
+
cmake --build . --config "$BUILD_TYPE" -j$(nproc 2>/dev/null || sysctl -n hw.ncpu)
|
|
174
|
+
|
|
175
|
+
echo ""
|
|
176
|
+
echo "Installing..."
|
|
177
|
+
cmake --install .
|
|
178
|
+
|
|
179
|
+
echo ""
|
|
180
|
+
echo "Build complete!"
|
|
181
|
+
echo "Library: $INSTALL_PREFIX/lib/libnghttp3.a"
|
|
182
|
+
echo "Headers: $INSTALL_PREFIX/include"
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#
|
|
3
|
+
# Build script for ngtcp2 on Android
|
|
4
|
+
#
|
|
5
|
+
# This script builds ngtcp2 as a native library for Android using NDK.
|
|
6
|
+
# It requires:
|
|
7
|
+
# - Android NDK r25+
|
|
8
|
+
# - CMake 3.20+
|
|
9
|
+
# - OpenSSL 3.0+ (built for Android)
|
|
10
|
+
#
|
|
11
|
+
# Usage:
|
|
12
|
+
# ./build-ngtcp2.sh [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--openssl-path PATH] [--prefix PATH] [--quictls]
|
|
13
|
+
#
|
|
14
|
+
# Example:
|
|
15
|
+
# ./build-ngtcp2.sh --ndk-path ~/Android/Sdk/ndk/25.2.9519653 --abi arm64-v8a --platform android-21
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
set -e
|
|
19
|
+
|
|
20
|
+
# Default values
|
|
21
|
+
ANDROID_NDK="${ANDROID_NDK:-}"
|
|
22
|
+
ANDROID_ABI="${ANDROID_ABI:-arm64-v8a}"
|
|
23
|
+
ANDROID_PLATFORM="${ANDROID_PLATFORM:-android-21}"
|
|
24
|
+
BUILD_TYPE="${BUILD_TYPE:-Release}"
|
|
25
|
+
OPENSSL_PATH="${OPENSSL_PATH:-}"
|
|
26
|
+
USE_QUICTLS="${USE_QUICTLS:-0}"
|
|
27
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
28
|
+
if [ -n "$PROJECT_DIR" ]; then
|
|
29
|
+
# PROJECT_DIR is the capacitor-mqtt-quic repo root
|
|
30
|
+
REF_CODE_DIR="$(cd "$PROJECT_DIR/ref-code" && pwd)"
|
|
31
|
+
else
|
|
32
|
+
# Fallback: repo root is one level above android/
|
|
33
|
+
REF_CODE_DIR="$(cd "$SCRIPT_DIR/../ref-code" && pwd)"
|
|
34
|
+
fi
|
|
35
|
+
INSTALL_PREFIX="${INSTALL_PREFIX:-$SCRIPT_DIR/install/ngtcp2-android}"
|
|
36
|
+
|
|
37
|
+
# Parse arguments
|
|
38
|
+
while [[ $# -gt 0 ]]; do
|
|
39
|
+
case $1 in
|
|
40
|
+
--ndk-path)
|
|
41
|
+
ANDROID_NDK="$2"
|
|
42
|
+
shift 2
|
|
43
|
+
;;
|
|
44
|
+
--abi)
|
|
45
|
+
ANDROID_ABI="$2"
|
|
46
|
+
shift 2
|
|
47
|
+
;;
|
|
48
|
+
--platform)
|
|
49
|
+
ANDROID_PLATFORM="$2"
|
|
50
|
+
shift 2
|
|
51
|
+
;;
|
|
52
|
+
--build-type)
|
|
53
|
+
BUILD_TYPE="$2"
|
|
54
|
+
shift 2
|
|
55
|
+
;;
|
|
56
|
+
--openssl-path)
|
|
57
|
+
OPENSSL_PATH="$2"
|
|
58
|
+
shift 2
|
|
59
|
+
;;
|
|
60
|
+
--prefix)
|
|
61
|
+
INSTALL_PREFIX="$2"
|
|
62
|
+
shift 2
|
|
63
|
+
;;
|
|
64
|
+
--quictls)
|
|
65
|
+
USE_QUICTLS=1
|
|
66
|
+
shift
|
|
67
|
+
;;
|
|
68
|
+
*)
|
|
69
|
+
echo "Unknown option: $1"
|
|
70
|
+
echo "Usage: $0 [--ndk-path PATH] [--abi ABI] [--platform PLATFORM] [--openssl-path PATH] [--prefix PATH] [--quictls]"
|
|
71
|
+
exit 1
|
|
72
|
+
;;
|
|
73
|
+
esac
|
|
74
|
+
done
|
|
75
|
+
|
|
76
|
+
# Check prerequisites
|
|
77
|
+
if ! command -v cmake &> /dev/null; then
|
|
78
|
+
echo "Error: CMake is not installed. Please install CMake 3.20+"
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# Find Android NDK
|
|
83
|
+
if [ -z "$ANDROID_NDK" ]; then
|
|
84
|
+
# Try common locations (macOS + Linux)
|
|
85
|
+
if [ -d "$HOME/Android/Sdk/ndk" ]; then
|
|
86
|
+
# Find latest NDK version
|
|
87
|
+
LATEST_NDK=$(ls -d "$HOME/Android/Sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
|
|
88
|
+
if [ -n "$LATEST_NDK" ]; then
|
|
89
|
+
ANDROID_NDK="$LATEST_NDK"
|
|
90
|
+
fi
|
|
91
|
+
elif [ -d "$HOME/Library/Android/sdk/ndk" ]; then
|
|
92
|
+
LATEST_NDK=$(ls -d "$HOME/Library/Android/sdk/ndk"/*/ 2>/dev/null | sort -V | tail -1)
|
|
93
|
+
if [ -n "$LATEST_NDK" ]; then
|
|
94
|
+
ANDROID_NDK="$LATEST_NDK"
|
|
95
|
+
fi
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
if [ -z "$ANDROID_NDK" ]; then
|
|
99
|
+
echo "Error: Android NDK not found. Please specify --ndk-path"
|
|
100
|
+
echo "Or set ANDROID_NDK environment variable"
|
|
101
|
+
exit 1
|
|
102
|
+
fi
|
|
103
|
+
fi
|
|
104
|
+
|
|
105
|
+
if [ ! -d "$ANDROID_NDK" ]; then
|
|
106
|
+
echo "Error: Android NDK directory not found: $ANDROID_NDK"
|
|
107
|
+
exit 1
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
echo "Building ngtcp2 for Android"
|
|
111
|
+
echo " NDK Path: $ANDROID_NDK"
|
|
112
|
+
echo " ABI: $ANDROID_ABI"
|
|
113
|
+
echo " Platform: $ANDROID_PLATFORM"
|
|
114
|
+
echo " Build Type: $BUILD_TYPE"
|
|
115
|
+
if [[ "$INSTALL_PREFIX" != *"/$ANDROID_ABI" ]]; then
|
|
116
|
+
INSTALL_PREFIX="$INSTALL_PREFIX/$ANDROID_ABI"
|
|
117
|
+
fi
|
|
118
|
+
echo " Install Prefix: $INSTALL_PREFIX"
|
|
119
|
+
|
|
120
|
+
# Check if ngtcp2 source exists
|
|
121
|
+
if [ -n "$NGTCP2_SOURCE_DIR" ]; then
|
|
122
|
+
if [[ "$NGTCP2_SOURCE_DIR" != /* ]]; then
|
|
123
|
+
NGTCP2_SOURCE_DIR="$REF_CODE_DIR/$NGTCP2_SOURCE_DIR"
|
|
124
|
+
fi
|
|
125
|
+
else
|
|
126
|
+
NGTCP2_SOURCE_DIR="$REF_CODE_DIR/ngtcp2"
|
|
127
|
+
fi
|
|
128
|
+
if [ ! -d "$NGTCP2_SOURCE_DIR" ] && [ -d "$REF_CODE_DIR/ngtcp2" ]; then
|
|
129
|
+
echo "Warning: NGTCP2_SOURCE_DIR not found; using $REF_CODE_DIR/ngtcp2"
|
|
130
|
+
NGTCP2_SOURCE_DIR="$REF_CODE_DIR/ngtcp2"
|
|
131
|
+
fi
|
|
132
|
+
if [ ! -d "$NGTCP2_SOURCE_DIR" ]; then
|
|
133
|
+
echo "Error: ngtcp2 source directory not found: $NGTCP2_SOURCE_DIR"
|
|
134
|
+
echo "Please set NGTCP2_SOURCE_DIR environment variable or clone ngtcp2:"
|
|
135
|
+
echo " git clone https://github.com/ngtcp2/ngtcp2.git $NGTCP2_SOURCE_DIR"
|
|
136
|
+
exit 1
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
# Ensure required submodules are present (munit)
|
|
140
|
+
if [ ! -f "$NGTCP2_SOURCE_DIR/munit/munit.c" ]; then
|
|
141
|
+
if [ -d "$NGTCP2_SOURCE_DIR/.git" ]; then
|
|
142
|
+
echo "Initializing ngtcp2 submodules..."
|
|
143
|
+
(cd "$NGTCP2_SOURCE_DIR" && git submodule update --init --recursive) || {
|
|
144
|
+
echo "Error: Failed to initialize ngtcp2 submodules"
|
|
145
|
+
exit 1
|
|
146
|
+
}
|
|
147
|
+
else
|
|
148
|
+
echo "Warning: ngtcp2 submodules are missing (munit)"
|
|
149
|
+
echo "Tests will be disabled, but if configuration still fails, clone with submodules:"
|
|
150
|
+
echo " git clone --recurse-submodules https://github.com/ngtcp2/ngtcp2.git $NGTCP2_SOURCE_DIR"
|
|
151
|
+
fi
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
# Check OpenSSL
|
|
155
|
+
if [ -z "$OPENSSL_PATH" ]; then
|
|
156
|
+
echo "Warning: OpenSSL path not specified. ngtcp2 will be built without TLS support."
|
|
157
|
+
echo "To build with OpenSSL, use: --openssl-path /path/to/openssl-android"
|
|
158
|
+
echo ""
|
|
159
|
+
echo "You can build OpenSSL for Android using build-openssl.sh"
|
|
160
|
+
fi
|
|
161
|
+
|
|
162
|
+
# Create build directory
|
|
163
|
+
BUILD_DIR="build/android-$ANDROID_ABI"
|
|
164
|
+
mkdir -p "$BUILD_DIR"
|
|
165
|
+
|
|
166
|
+
# Clean build dir if CMake cache points to a different source tree
|
|
167
|
+
if [ -f "$BUILD_DIR/CMakeCache.txt" ]; then
|
|
168
|
+
CMAKE_HOME_DIR=$(grep "^CMAKE_HOME_DIRECTORY:INTERNAL=" "$BUILD_DIR/CMakeCache.txt" | cut -d= -f2-)
|
|
169
|
+
if [ -n "$CMAKE_HOME_DIR" ] && [ "$CMAKE_HOME_DIR" != "$NGTCP2_SOURCE_DIR" ]; then
|
|
170
|
+
echo "CMake cache source mismatch. Cleaning $BUILD_DIR"
|
|
171
|
+
rm -rf "$BUILD_DIR"
|
|
172
|
+
mkdir -p "$BUILD_DIR"
|
|
173
|
+
fi
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
cd "$BUILD_DIR"
|
|
177
|
+
|
|
178
|
+
# Configure CMake
|
|
179
|
+
CMAKE_ARGS=(
|
|
180
|
+
-DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
|
|
181
|
+
-DANDROID_ABI="$ANDROID_ABI"
|
|
182
|
+
-DANDROID_PLATFORM="$ANDROID_PLATFORM"
|
|
183
|
+
-DCMAKE_BUILD_TYPE="$BUILD_TYPE"
|
|
184
|
+
-DENABLE_LIB_ONLY=ON
|
|
185
|
+
-DENABLE_TESTS=OFF
|
|
186
|
+
-DENABLE_EXAMPLES=OFF
|
|
187
|
+
-DCMAKE_INSTALL_PREFIX="$INSTALL_PREFIX"
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
if [ -n "$OPENSSL_PATH" ]; then
|
|
191
|
+
if [[ "$OPENSSL_PATH" != /* ]]; then
|
|
192
|
+
if [ -d "$SCRIPT_DIR/$OPENSSL_PATH" ]; then
|
|
193
|
+
OPENSSL_PATH="$SCRIPT_DIR/$OPENSSL_PATH"
|
|
194
|
+
else
|
|
195
|
+
OPENSSL_PATH="$REF_CODE_DIR/$OPENSSL_PATH"
|
|
196
|
+
fi
|
|
197
|
+
fi
|
|
198
|
+
# If ABI-aware install exists, prefer it
|
|
199
|
+
if [ -d "$OPENSSL_PATH/$ANDROID_ABI" ]; then
|
|
200
|
+
OPENSSL_PATH="$OPENSSL_PATH/$ANDROID_ABI"
|
|
201
|
+
fi
|
|
202
|
+
if [ ! -d "$OPENSSL_PATH" ]; then
|
|
203
|
+
echo "Error: OpenSSL path does not exist: $OPENSSL_PATH"
|
|
204
|
+
exit 1
|
|
205
|
+
fi
|
|
206
|
+
OPENSSL_PATH="$(cd "$OPENSSL_PATH" && pwd)"
|
|
207
|
+
OPENSSL_LIB_DIR="$OPENSSL_PATH/lib"
|
|
208
|
+
OPENSSL_INCLUDE_DIR="$OPENSSL_PATH/include"
|
|
209
|
+
OPENSSL_CRYPTO_LIB="$OPENSSL_LIB_DIR/libcrypto.a"
|
|
210
|
+
OPENSSL_SSL_LIB="$OPENSSL_LIB_DIR/libssl.a"
|
|
211
|
+
|
|
212
|
+
if [ ! -f "$OPENSSL_CRYPTO_LIB" ] || [ ! -f "$OPENSSL_SSL_LIB" ]; then
|
|
213
|
+
echo "Error: OpenSSL static libraries not found in $OPENSSL_LIB_DIR"
|
|
214
|
+
exit 1
|
|
215
|
+
fi
|
|
216
|
+
if [ ! -d "$OPENSSL_INCLUDE_DIR" ]; then
|
|
217
|
+
echo "Error: OpenSSL include directory not found: $OPENSSL_INCLUDE_DIR"
|
|
218
|
+
exit 1
|
|
219
|
+
fi
|
|
220
|
+
|
|
221
|
+
if [ "$USE_QUICTLS" = "1" ]; then
|
|
222
|
+
if ! grep -q "SSL_provide_quic_data" "$OPENSSL_INCLUDE_DIR/openssl/ssl.h" 2>/dev/null; then
|
|
223
|
+
echo "OpenSSL headers at $OPENSSL_INCLUDE_DIR do not include QUIC APIs."
|
|
224
|
+
if [ -x "$SCRIPT_DIR/build-openssl.sh" ]; then
|
|
225
|
+
echo "Attempting to rebuild OpenSSL via build-openssl.sh..."
|
|
226
|
+
OPENSSL_PREFIX="$OPENSSL_PATH"
|
|
227
|
+
if [[ "$OPENSSL_PREFIX" == *"/$ANDROID_ABI" ]]; then
|
|
228
|
+
OPENSSL_PREFIX="${OPENSSL_PREFIX%/$ANDROID_ABI}"
|
|
229
|
+
fi
|
|
230
|
+
"$SCRIPT_DIR/build-openssl.sh" \
|
|
231
|
+
--ndk-path "$ANDROID_NDK" \
|
|
232
|
+
--abi "$ANDROID_ABI" \
|
|
233
|
+
--platform "$ANDROID_PLATFORM" \
|
|
234
|
+
--quictls \
|
|
235
|
+
--prefix "$OPENSSL_PREFIX" || {
|
|
236
|
+
echo "Error: OpenSSL rebuild failed."
|
|
237
|
+
exit 1
|
|
238
|
+
}
|
|
239
|
+
if ! grep -q "SSL_provide_quic_data" "$OPENSSL_INCLUDE_DIR/openssl/ssl.h" 2>/dev/null; then
|
|
240
|
+
echo "Error: OpenSSL headers at $OPENSSL_INCLUDE_DIR still do not include QUIC APIs."
|
|
241
|
+
echo "Ensure OPENSSL_SOURCE_DIR points to a quictls checkout."
|
|
242
|
+
exit 1
|
|
243
|
+
fi
|
|
244
|
+
else
|
|
245
|
+
echo "Error: OpenSSL headers at $OPENSSL_INCLUDE_DIR do not include QUIC APIs."
|
|
246
|
+
echo "Rebuild OpenSSL with --quictls and ensure OPENSSL_SOURCE_DIR points to quictls."
|
|
247
|
+
exit 1
|
|
248
|
+
fi
|
|
249
|
+
fi
|
|
250
|
+
fi
|
|
251
|
+
|
|
252
|
+
CMAKE_ARGS+=(
|
|
253
|
+
-DENABLE_OPENSSL=ON
|
|
254
|
+
-DOPENSSL_ROOT_DIR="$OPENSSL_PATH"
|
|
255
|
+
-DOPENSSL_INCLUDE_DIR="$OPENSSL_INCLUDE_DIR"
|
|
256
|
+
-DOPENSSL_CRYPTO_LIBRARY="$OPENSSL_CRYPTO_LIB"
|
|
257
|
+
-DOPENSSL_SSL_LIBRARY="$OPENSSL_SSL_LIB"
|
|
258
|
+
-DOPENSSL_LIBRARIES="$OPENSSL_SSL_LIB;$OPENSSL_CRYPTO_LIB"
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
if [ "$USE_QUICTLS" = "1" ]; then
|
|
262
|
+
CMAKE_ARGS+=(
|
|
263
|
+
-DENABLE_QUICTLS=ON
|
|
264
|
+
-DHAVE_SSL_PROVIDE_QUIC_DATA=1
|
|
265
|
+
-DHAVE_SSL_SET_QUIC_TLS_CBS=0
|
|
266
|
+
)
|
|
267
|
+
fi
|
|
268
|
+
else
|
|
269
|
+
CMAKE_ARGS+=(
|
|
270
|
+
-DENABLE_OPENSSL=OFF
|
|
271
|
+
)
|
|
272
|
+
fi
|
|
273
|
+
|
|
274
|
+
echo ""
|
|
275
|
+
echo "Configuring CMake..."
|
|
276
|
+
cmake "$NGTCP2_SOURCE_DIR" "${CMAKE_ARGS[@]}"
|
|
277
|
+
|
|
278
|
+
echo ""
|
|
279
|
+
echo "Building ngtcp2..."
|
|
280
|
+
cmake --build . --config "$BUILD_TYPE" -j$(nproc 2>/dev/null || sysctl -n hw.ncpu)
|
|
281
|
+
|
|
282
|
+
echo ""
|
|
283
|
+
echo "Installing..."
|
|
284
|
+
cmake --install .
|
|
285
|
+
|
|
286
|
+
echo ""
|
|
287
|
+
echo "Build complete!"
|
|
288
|
+
echo "Library: $INSTALL_PREFIX/lib/libngtcp2.a"
|
|
289
|
+
echo "Headers: $INSTALL_PREFIX/include"
|