compile.sh 8.87 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
            diagnostic "$0: Invalid option '$1'."
            diagnostic "$0: Try --help for more information."
74 75
            exit 1
            ;;
76
    esac
77
    shift
78 79
done

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

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

91
if [ "$ANDROID_ABI" = "armeabi-v7a" -o "$ANDROID_ABI" = "arm" ]; then
92
    GRADLE_ABI="ARMv7"
93
elif [ "$ANDROID_ABI" = "arm64-v8a" -o "$ANDROID_ABI" = "arm64" ]; then
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
    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

109 110 111
##########
# GRADLE #
##########
Rémi Duraffort's avatar
Rémi Duraffort committed
112

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

120
    unzip -o gradle-${GRADLE_VERSION}-bin.zip
121
    checkfail "gradle: unzip failed"
122

123
    cd gradle-${GRADLE_VERSION}
124

125 126
    ./bin/gradle wrapper
    checkfail "gradle: wrapper failed"
Rémi Duraffort's avatar
Rémi Duraffort committed
127

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

138 139 140
####################
# Configure gradle #
####################
Rémi Duraffort's avatar
Rémi Duraffort committed
141

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

154 155 156
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
157
    if [ -z "$PASSWORD_KEYSTORE" ]; then
158 159
        echo storepwd=android >> gradle.properties
    fi
160
fi
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

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

215 216 217 218 219
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
220

221 222 223
####################
# Fetch VLC source #
####################
224

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

247

248 249 250
############
# Make VLC #
############
251

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

264
./compile-libvlc.sh $OPTS
265

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

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

#########################
# Chrome OS repackaging #
#########################
# You need to run the armv7 version first, then relaunch this script for x86
310
if [ "$CHROME_OS" = 1 -a "$ANDROID_ABI" = "x86" ]; then
311 312 313 314 315 316
    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