forked from videolan/vlc-android
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompile.sh
executable file
·415 lines (379 loc) · 13.1 KB
/
compile.sh
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
#! /bin/sh
set -e
#############
# FUNCTIONS #
#############
diagnostic()
{
echo "$@" 1>&2;
}
fail()
{
diagnostic "$1"
exit 1
}
# Try to check whether a patch file has already been applied to the current directory tree
# Warning: this function assumes:
# - The patch file contains a Message-Id header. This can be generated with `git format-patch --thread ...` option
# - The patch has been applied with `git am --message-id ...` option to keep the Message-Id in the commit description
check_patch_is_applied()
{
patch_file=$1
diagnostic "Checking presence of patch $1"
message_id=$(grep -E '^Message-Id: [^ ]+' "$patch_file" | sed 's/^Message-Id: \([^\ ]+\)/\1/')
if [ -z "$message_id" ]; then
diagnostic "Error: patch $patch_file does not contain a Message-Id."
diagnostic "Please consider generating your patch files with the 'git format-patch --thread ...' option."
diagnostic ""
exit 1
fi
if [ -z "$(git log --grep="$message_id")" ]; then
diagnostic "Cannot find patch $patch_file in tree, aborting."
diagnostic "There can be two reasons for that:"
diagnostic "- you forgot to apply the patch on this tree, or"
diagnostic "- you applied the patch without the 'git am --message-id ...' option."
diagnostic ""
exit 1
fi
}
# Read the Android Wiki http://wiki.videolan.org/AndroidCompile
# Setup all that stuff correctly.
# Get the latest Android SDK Platform or modify numbers in configure.sh and libvlc/default.properties.
RELEASE=0
while [ $# -gt 0 ]; do
case $1 in
help|--help|-h)
echo "Use -a to set the ARCH:"
echo " ARM: (armeabi-v7a|arm)"
echo " ARM64: (arm64-v8a|arm64)"
echo " X86: x86, x86_64"
echo "Use --release to build in release mode"
echo "Use --signrelease to build in release mode and sign apk, see vlc-android/build.gradle"
echo "Use -s to set your keystore file and -p for the password"
echo "Use -c to get a ChromeOS build"
echo "Use -l to build only LibVLC"
echo "Use -b to bypass libvlc source checks (vlc custom sources)"
exit 0
;;
a|-a)
ANDROID_ABI=$2
shift
;;
-r|release|--release)
RELEASE=1
;;
signrelease|--signrelease)
SIGNED_RELEASE=1
RELEASE=1
;;
-s|--signature)
KEYSTORE_FILE=$2
shift
;;
-p|--password)
PASSWORD_KEYSTORE=$2
shift
;;
-l)
BUILD_LIBVLC=1
NO_ML=1
;;
-ml)
BUILD_MEDIALIB=1
;;
run)
RUN=1
;;
test)
TEST=1
;;
--no-ml)
NO_ML=1
;;
--publish)
RELEASE=1
PUBLISH=1
;;
--init)
GRADLE_SETUP=1
;;
-b)
BYPASS_VLC_SRC_CHECKS=1
;;
*)
diagnostic "$0: Invalid option '$1'."
diagnostic "$0: Try --help for more information."
exit 1
;;
esac
shift
done
if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
diagnostic "You must define ANDROID_NDK, ANDROID_SDK before starting."
diagnostic "They must point to your NDK and SDK directories."
exit 1
fi
if [ -z "$ANDROID_ABI" ]; then
diagnostic "*** No ANDROID_ABI defined architecture: using ARMv7"
ANDROID_ABI="armeabi-v7a"
fi
if [ "$ANDROID_ABI" = "armeabi-v7a" -o "$ANDROID_ABI" = "arm" ]; then
ANDROID_ABI="armeabi-v7a"
GRADLE_ABI="ARMv7"
elif [ "$ANDROID_ABI" = "arm64-v8a" -o "$ANDROID_ABI" = "arm64" ]; then
ANDROID_ABI="arm64-v8a"
GRADLE_ABI="ARMv8"
elif [ "$ANDROID_ABI" = "x86" ]; then
GRADLE_ABI="x86"
elif [ "$ANDROID_ABI" = "x86_64" ]; then
GRADLE_ABI="x86_64"
elif [ "$ANDROID_ABI" = "all" ]; then
GRADLE_ABI="all"
else
diagnostic "Invalid arch specified: '$ANDROID_ABI'."
diagnostic "Try --help for more information"
exit 1
fi
####################
# Configure gradle #
####################
if [ -z "$KEYSTORE_FILE" ]; then
KEYSTORE_FILE="$HOME/.android/debug.keystore"
STOREALIAS="androiddebugkey"
else
if [ -z "$PASSWORD_KEYSTORE" ]; then
diagnostic "No password"
exit 1
fi
rm -f gradle.properties
STOREALIAS="vlc"
fi
if [ ! -f gradle.properties ]; then
echo android.enableJetifier=true > gradle.properties
echo android.useAndroidX=true >> gradle.properties
echo kapt.incremental.apt=true >> gradle.properties
echo kapt.use.worker.api=true >> gradle.properties
echo kapt.include.compile.classpath=false >> gradle.properties
echo keyStoreFile=$KEYSTORE_FILE >> gradle.properties
echo storealias=$STOREALIAS >> gradle.properties
if [ -z "$PASSWORD_KEYSTORE" ]; then
echo storepwd=android >> gradle.properties
fi
fi
init_local_props() {
(
# initialize the local.properties file,
# or fix it if it was modified (by Android Studio, for example).
echo_props() {
echo "sdk.dir=$ANDROID_SDK"
echo "ndk.dir=$ANDROID_NDK"
}
# first check if the file just needs to be created for the first time
if [ ! -f "$1" ]; then
echo_props > "$1"
return 0
fi
# escape special chars to get regex that matches string
make_regex() {
echo "$1" | sed -e 's/\([[\^$.*]\)/\\\1/g' -
}
android_sdk_regex=`make_regex "${ANDROID_SDK}"`
android_ndk_regex=`make_regex "${ANDROID_NDK}"`
# check for lines setting the SDK directory
sdk_line_start="^sdk\.dir="
total_sdk_count=`grep -c "${sdk_line_start}" "$1"`
good_sdk_count=`grep -c "${sdk_line_start}${android_sdk_regex}\$" "$1"`
# check for lines setting the NDK directory
ndk_line_start="^ndk\.dir="
total_ndk_count=`grep -c "${ndk_line_start}" "$1"`
good_ndk_count=`grep -c "${ndk_line_start}${android_ndk_regex}\$" "$1"`
# if one of each is found and both match the environment vars, no action needed
if [ "$total_sdk_count" -eq "1" -a "$good_sdk_count" -eq "1" \
-a "$total_ndk_count" -eq "1" -a "$good_ndk_count" -eq "1" ]
then
return 0
fi
# if neither property is set they can simply be appended to the file
if [ "$total_sdk_count" -eq "0" -a "$total_ndk_count" -eq "0" ]; then
echo_props >> "$1"
return 0
fi
# if a property is set incorrectly or too many times,
# remove all instances of both properties and append correct ones.
replace_props() {
temp_props="$1.tmp"
while IFS= read -r LINE || [ -n "$LINE" ]; do
line_sdk_dir="${LINE#sdk.dir=}"
line_ndk_dir="${LINE#ndk.dir=}"
if [ "x$line_sdk_dir" = "x$LINE" -a "x$line_ndk_dir" = "x$LINE" ]; then
echo "$LINE"
fi
done <"$1" >"$temp_props"
echo_props >> "$temp_props"
mv -f -- "$temp_props" "$1"
}
echo "local.properties: Contains incompatible sdk.dir and/or ndk.dir properties. Replacing..."
replace_props "$1"
echo "local.properties: Finished replacing sdk.dir and/or ndk.dir with current environment variables."
)
}
init_local_props local.properties || { echo "Error initializing local.properties"; exit $?; }
if [ ! -d "$ANDROID_SDK/licenses" ]; then
mkdir "$ANDROID_SDK/licenses"
echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" > "$ANDROID_SDK/licenses/android-sdk-license"
echo "d56f5187479451eabf01fb78af6dfcb131a6481e" >> "$ANDROID_SDK/licenses/android-sdk-license"
fi
##########
# GRADLE #
##########
if [ ! -d "gradle/wrapper" ]; then
diagnostic "Downloading gradle"
GRADLE_VERSION=5.4.1
GRADLE_URL=https://download.videolan.org/pub/contrib/gradle/gradle-${GRADLE_VERSION}-bin.zip
wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL} || fail "gradle: download failed"
unzip -o gradle-${GRADLE_VERSION}-bin.zip || fail "gradle: unzip failed"
./gradle-${GRADLE_VERSION}/bin/gradle wrapper || fail "gradle: wrapper failed"
./gradlew -version || fail "gradle: wrapper failed"
chmod a+x gradlew
rm -rf gradle-${GRADLE_VERSION}-bin.zip
fi
if [ "$GRADLE_SETUP" = 1 ]; then
exit 0
fi
####################
# Fetch VLC source #
####################
TESTED_HASH=f25d3ba
VLC_REPOSITORY=https://git.videolan.org/git/vlc/vlc-3.0.git
if [ ! -d "vlc" ]; then
diagnostic "VLC sources: not found, cloning"
git clone "${VLC_REPOSITORY}" vlc || fail "VLC sources: git clone failed"
cd vlc
diagnostic "VLC sources: resetting to the TESTED_HASH commit (${TESTED_HASH})"
git reset --hard ${TESTED_HASH} || fail "VLC sources: TESTED_HASH ${TESTED_HASH} not found"
diagnostic "VLC sources: applying custom patches"
# Keep Message-Id inside commits description to track them afterwards
git am --message-id ../libvlc/patches/vlc3/*.patch || fail "VLC sources: cannot apply custom patches"
cd ..
else
diagnostic "VLC source: found sources, leaving untouched"
fi
if [ "$BYPASS_VLC_SRC_CHECKS" = 1 ]; then
diagnostic "VLC sources: Bypassing checks (required by option)"
else
diagnostic "VLC sources: Checking TESTED_HASH and patches presence"
diagnostic "NOTE: checks can be bypass by adding '-b' option to this script."
cd vlc
git cat-file -e ${TESTED_HASH} 2> /dev/null || \
fail "Error: Your vlc checkout does not contain the latest tested commit: ${TESTED_HASH}"
for patch_file in ../libvlc/patches/vlc3/*.patch; do
check_patch_is_applied "$patch_file"
done
cd ..
fi
############
# Make VLC #
############
diagnostic "Configuring"
compile() {
# Build LibVLC if asked for it, or needed by medialibrary
copy_tmp="$1"
OUT_DBG_DIR=.dbg/${ANDROID_ABI}
mkdir -p $OUT_DBG_DIR
if [ "$BUILD_MEDIALIB" != 1 -o ! -d "libvlc/jni/libs/$1" ]; then
AVLC_SOURCED=1 . ./compile-libvlc.sh
avlc_build
$NDK_BUILD -C libvlc \
VLC_SRC_DIR="$VLC_SRC_DIR" \
VLC_BUILD_DIR="$VLC_BUILD_DIR" \
VLC_OUT_LDLIBS="$VLC_OUT_LDLIBS" \
APP_BUILD_SCRIPT=jni/Android.mk \
APP_PLATFORM=android-${ANDROID_API} \
APP_ABI=${ANDROID_ABI} \
NDK_PROJECT_PATH=jni \
NDK_TOOLCHAIN_VERSION=clang \
NDK_DEBUG=${NDK_DEBUG}
if [ "$copy_tmp" = "--copy-tmp=libvlc" ];then
cp -r $VLC_OUT_PATH/libs/${ANDROID_ABI} libvlc/jni/libs/${ANDROID_ABI} build/tmp
fi
cp -a $VLC_OUT_PATH/obj/local/${ANDROID_ABI}/*.so ${OUT_DBG_DIR}
cp -a ./libvlc/jni/obj/local/${ANDROID_ABI}/*.so ${OUT_DBG_DIR}
fi
if [ "$NO_ML" != 1 ]; then
ANDROID_ABI=$ANDROID_ABI RELEASE=$RELEASE ./compile-medialibrary.sh
if [ "$copy_tmp" = "--copy-tmp=medialibrary" ];then
cp -r medialibrary/jni/libs/${ANDROID_ABI} build/tmp
fi
cp -a medialibrary/jni/obj/local/${ANDROID_ABI}/*.so ${OUT_DBG_DIR}
fi
}
if [ "$ANDROID_ABI" = "all" ]; then
if [ -d build/tmp ]; then
rm -rf build/tmp
fi
mkdir -p build/tmp
LIB_DIR="libvlc"
if [ "$NO_ML" != 1 ]; then
LIB_DIR="medialibrary"
fi
copy_tmp="--copy-tmp=$LIB_DIR"
# The compile function is sourcing ./compile-libvlc.sh and is configured
# with env variables (ANDROID_ABI), therefore it need to be run from a new
# context for each ABI
(ANDROID_ABI=armeabi-v7a RELEASE=$RELEASE compile $copy_tmp)
(ANDROID_ABI=arm64-v8a RELEASE=$RELEASE compile $copy_tmp)
(ANDROID_ABI=x86 RELEASE=$RELEASE compile $copy_tmp)
(ANDROID_ABI=x86_64 RELEASE=$RELEASE compile $copy_tmp)
rm -rf $LIB_DIR/jni/libs/
mv build/tmp $LIB_DIR/jni/libs/
GRADLE_VLC_SRC_DIRS="''"
else
compile
GRADLE_VLC_SRC_DIRS="$VLC_OUT_PATH/libs"
fi
##################
# Compile the UI #
##################
BUILDTYPE="Dev"
if [ "$SIGNED_RELEASE" = 1 ]; then
BUILDTYPE="signedRelease"
elif [ "$RELEASE" = 1 ]; then
BUILDTYPE="Release"
fi
if [ "$BUILD_LIBVLC" = 1 ];then
GRADLE_VLC_SRC_DIRS="$GRADLE_VLC_SRC_DIRS" GRADLE_ABI=$GRADLE_ABI ./gradlew -p libvlc assemble${BUILDTYPE}
RUN=0
if [ "$PUBLISH" = 1 ];then
GRADLE_VLC_SRC_DIRS="$GRADLE_VLC_SRC_DIRS" GRADLE_ABI=$GRADLE_ABI ./gradlew -p libvlc install bintrayUpload
fi
elif [ "$BUILD_MEDIALIB" = 1 ]; then
GRADLE_ABI=$GRADLE_ABI ./gradlew -p medialibrary assemble${BUILDTYPE}
RUN=0
if [ "$PUBLISH" = 1 ];then
GRADLE_ABI=$GRADLE_ABI ./gradlew -p medialibrary install bintrayUpload
fi
else
if [ "$RUN" = 1 ]; then
ACTION="install"
else
ACTION="assemble"
fi
TARGET="${ACTION}${BUILDTYPE}"
GRADLE_VLC_SRC_DIRS="$GRADLE_VLC_SRC_DIRS" CLI="" GRADLE_ABI=$GRADLE_ABI ./gradlew $TARGET
fi
#######
# RUN #
#######
if [ "$RUN" = 1 ]; then
export PATH="${ANDROID_SDK}/platform-tools/:$PATH"
EXTRA=""
if [ "$TEST" = 1 ]; then
EXTRA="--ez 'extra_test_stubs' true"
fi
adb wait-for-device
if [ "$RELEASE" = 1 ]; then
adb shell am start -n org.videolan.vlc/org.videolan.vlc.StartActivity $EXTRA
else
adb shell am start -n org.videolan.vlc.debug/org.videolan.vlc.StartActivity $EXTRA
fi
fi