compile.sh 8.85 KB
Newer Older
Rémi Duraffort's avatar
Rémi Duraffort committed
1
#! /bin/sh
2
set -e
Rémi Duraffort's avatar
Rémi Duraffort committed
3

4 5 6 7
#############
# FUNCTIONS #
#############

8 9 10 11 12
diagnostic()
{
    echo "$@" 1>&2;
}

13 14 15 16 17 18 19 20
checkfail()
{
    if [ ! $? -eq 0 ];then
        diagnostic "$1"
        exit 1
    fi
}

Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
21 22
# Read the Android Wiki http://wiki.videolan.org/AndroidCompile
# Setup all that stuff correctly.
23
# Get the latest Android SDK Platform or modify numbers in configure.sh and libvlc/default.properties.
Rafaël Carré's avatar
Rafaël Carré committed
24

25 26
while [ $# -gt 0 ]; do
    case $1 in
Thomas Guillem's avatar
Thomas Guillem committed
27
        help|--help|-h)
28
            echo "Use -a to set the ARCH:"
29 30
            echo "  ARM:     (armeabi-v7a|arm)"
            echo "  ARM64:   (arm64-v8a|arm64)"
31 32
            echo "  X86:     x86, x86_64"
            echo "  MIPS:    mips, mips64."
33
            echo "Use --release to build in release mode"
34
            echo "Use --signrelease to build in release mode and sign apk, see vlc-android/build.gradle"
35
            echo "Use -s to set your keystore file and -p for the password"
Thomas Guillem's avatar
Thomas Guillem committed
36
            echo "Use -c to get a ChromeOS build"
37
            echo "Use -l to build only LibVLC"
38
            exit 0
39 40 41 42 43
            ;;
        a|-a)
            ANDROID_ABI=$2
            shift
            ;;
Thomas Guillem's avatar
Thomas Guillem committed
44 45 46
        -c)
            CHROME_OS=1
            ;;
47 48 49
        -r|release|--release)
            RELEASE=1
            ;;
50 51 52 53
        signrelease|--signrelease)
            SIGNED_RELEASE=1
            RELEASE=1
            ;;
54 55 56 57 58 59 60 61
        -s|--signature)
            KEYSTORE_FILE=$2
            shift
            ;;
        -p|--password)
            PASSWORD_KEYSTORE=$2
            shift
            ;;
62 63 64
        -l)
            BUILD_LIBVLC=1
            ;;
65 66 67
        run)
            RUN=1
            ;;
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
68 69 70
        --asan)
            ASAN=1
            ;;
71 72 73
        --no-ml)
            NO_ML=1
            ;;
74
        *)
75 76
            diagnostic "$0: Invalid option '$1'."
            diagnostic "$0: Try --help for more information."
77 78
            exit 1
            ;;
79
    esac
80
    shift
81 82
done

83
if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
84 85
   diagnostic "You must define ANDROID_NDK, ANDROID_SDK before starting."
   diagnostic "They must point to your NDK and SDK directories."
86 87 88
   exit 1
fi

89
if [ -z "$ANDROID_ABI" ]; then
90
   diagnostic "*** No ANDROID_ABI defined architecture: using ARMv7"
91
   ANDROID_ABI="armeabi-v7a"
92 93
fi

94
if [ "$ANDROID_ABI" = "armeabi-v7a" -o "$ANDROID_ABI" = "arm" ]; then
95
    GRADLE_ABI="ARMv7"
96
elif [ "$ANDROID_ABI" = "arm64-v8a" -o "$ANDROID_ABI" = "arm64" ]; then
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
    GRADLE_ABI="ARMv8"
elif [ "$ANDROID_ABI" = "x86" ]; then
    GRADLE_ABI="x86"
elif [ "$ANDROID_ABI" = "x86_64" ]; then
    GRADLE_ABI="x86_64"
elif [ "$ANDROID_ABI" = "mips" ]; then
    GRADLE_ABI="MIPS"
elif [ "$ANDROID_ABI" = "mips64" ]; then
    GRADLE_ABI="MIPS64"
else
    diagnostic "Invalid arch specified: '$ANDROID_ABI'."
    diagnostic "Try --help for more information"
    exit 1
fi

112 113 114
##########
# GRADLE #
##########
Rémi Duraffort's avatar
Rémi Duraffort committed
115

116
if [ ! -d "gradle/wrapper" ]; then
117
    diagnostic "Downloading gradle"
Geoffrey Métais's avatar
Geoffrey Métais committed
118
    GRADLE_VERSION=3.4.1
119
    GRADLE_URL=https://download.videolan.org/pub/contrib/gradle/gradle-${GRADLE_VERSION}-bin.zip
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
120
    wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL}
121
    checkfail "gradle: download failed"
122

123
    unzip -o gradle-${GRADLE_VERSION}-bin.zip
124
    checkfail "gradle: unzip failed"
125

126
    cd gradle-${GRADLE_VERSION}
127

128 129
    ./bin/gradle wrapper
    checkfail "gradle: wrapper failed"
Rémi Duraffort's avatar
Rémi Duraffort committed
130

131 132 133 134 135 136
    ./gradlew -version
    checkfail "gradle: wrapper failed"
    cd ..
    mkdir -p gradle
    mv gradle-${GRADLE_VERSION}/gradle/wrapper/ gradle
    mv gradle-${GRADLE_VERSION}/gradlew .
137
    chmod a+x gradlew
138
    rm -rf gradle-${GRADLE_VERSION}-bin.zip
139
fi
140

141 142 143
####################
# Configure gradle #
####################
Rémi Duraffort's avatar
Rémi Duraffort committed
144

145 146 147 148 149
if [ -z "$KEYSTORE_FILE" ]; then
    KEYSTORE_FILE="$HOME/.android/debug.keystore"
    STOREALIAS="androiddebugkey"
else
    if [ -z "$PASSWORD_KEYSTORE" ]; then
150
        diagnostic "No password"
151 152 153 154 155 156
        exit 1
    fi
    rm -f gradle.properties
    STOREALIAS="vlc"
fi

157 158 159
if [ ! -f gradle.properties ]; then
    echo keyStoreFile=$KEYSTORE_FILE > gradle.properties
    echo storealias=$STOREALIAS >> gradle.properties
Geoffrey Métais's avatar
Geoffrey Métais committed
160
    if [ -z "$PASSWORD_KEYSTORE" ]; then
161 162
        echo storepwd=android >> gradle.properties
    fi
163
fi
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

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
    # 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}\$" "$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}\$" "$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 $?; }

218 219 220 221 222
if [ ! -d "$ANDROID_SDK/licenses" ]; then
    mkdir "$ANDROID_SDK/licenses"
    echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_SDK/licenses/android-sdk-license"
    echo "84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_SDK/licenses/android-sdk-preview-license"
fi
223

224 225 226
####################
# Fetch VLC source #
####################
227

Geoffrey Métais's avatar
Geoffrey Métais committed
228
TESTED_HASH=8a3958c
229
if [ ! -d "vlc" ]; then
230
    diagnostic "VLC source not found, cloning"
231
    git clone http://git.videolan.org/git/vlc.git vlc
232
    checkfail "vlc source: git clone failed"
Geoffrey Métais's avatar
Geoffrey Métais committed
233 234 235 236 237
fi
diagnostic "VLC source found"
cd vlc
if ! git cat-file -e ${TESTED_HASH}; then
    cat 1>&2 << EOF
238 239 240 241
***
*** Error: Your vlc checkout does not contain the latest tested commit: ${TESTED_HASH}
***
EOF
Geoffrey Métais's avatar
Geoffrey Métais committed
242
    exit 1
243
fi
Geoffrey Métais's avatar
Geoffrey Métais committed
244 245 246 247 248
if [ "$RELEASE" = 1 ]; then
    git reset --hard ${TESTED_HASH}
fi
cd ..

249

250 251 252
############
# Make VLC #
############
253

254
diagnostic "Configuring"
255 256
OPTS="-a ${ANDROID_ABI}"
if [ "$RELEASE" = 1 ]; then
Geoffrey Métais's avatar
Geoffrey Métais committed
257
    OPTS="$OPTS release"
258
fi
Thomas Guillem's avatar
Thomas Guillem committed
259 260 261
if [ "$CHROME_OS" = 1 ]; then
    OPTS="$OPTS -c"
fi
Thomas Guillem's avatar
Thomas Guillem committed
262 263 264
if [ "$ASAN" = 1 ]; then
    OPTS="$OPTS --asan"
fi
265 266 267
if [ "$NO_ML" = 1 ]; then
    OPTS="$OPTS --no-ml"
fi
268

269
./compile-libvlc.sh $OPTS
270

271 272 273
##################
# Compile the UI #
##################
274
PLATFORM="Vanilla"
275
BUILDTYPE="Debug"
276 277 278
if [ "$SIGNED_RELEASE" = 1 ]; then
    BUILDTYPE="signedRelease"
elif [ "$RELEASE" = 1 ]; then
279 280
    BUILDTYPE="Release"
fi
281 282 283
if [ "$CHROME_OS" = 1 ]; then
    PLATFORM="Chrome"
fi
284 285 286 287 288
if [ "$BUILD_LIBVLC" = 1 ];then
    ./gradlew -p libvlc assemble${BUILDTYPE}
    RUN=0
    CHROME_OS=0
else
289 290 291 292 293
    if [ "$RUN" = 1 ]; then
        ACTION="install"
    else
        ACTION="assemble"
    fi
294
    TARGET="${ACTION}${PLATFORM}${GRADLE_ABI}${BUILDTYPE}"
295
    CLI="" ./gradlew $TARGET
296
fi
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
297

298 299 300 301
#######
# RUN #
#######
if [ "$RUN" = 1 ]; then
302
    export PATH="${ANDROID_SDK}/platform-tools/:$PATH"
303 304
    adb wait-for-device
    if [ "$RELEASE" = 1 ]; then
305
        adb shell am start -n org.videolan.vlc/org.videolan.vlc.StartActivity
306
    else
307
        adb shell am start -n org.videolan.vlc.debug/org.videolan.vlc.StartActivity
308 309
    fi
fi
310 311 312 313 314

#########################
# Chrome OS repackaging #
#########################
# You need to run the armv7 version first, then relaunch this script for x86
315
if [ "$CHROME_OS" = 1 -a "$ANDROID_ABI" = "x86" ]; then
316 317 318 319 320 321
    unzip -o vlc-android/build/outputs/apk/VLC-Android-CHROME-*-ARMv7.apk lib/armeabi-v7a/libvlcjni.so
    zip -rv vlc-android/build/outputs/apk/VLC-Android-CHROME-*-x86.apk lib/armeabi-v7a/libvlcjni.so
    rm -rf lib/
    apk_to_crx.py --zip vlc-android/build/outputs/apk/VLC-Android-CHROME-*-x86.apk --metadata vlc-android/flavors/chrome/VLC-Android-CHROME.crx.json
    mv vlc-android/build/outputs/apk/VLC-Android-CHROME-*-x86.zip vlc-android/build/outputs/apk/VLC-Android-CHROME-ALL.zip
fi