Last active
June 7, 2020 06:45
-
-
Save smits/27060b310546ca6f76568f24838118c3 to your computer and use it in GitHub Desktop.
Build and push valgrind for Android devices
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
#set -x | |
function extract() | |
{ | |
if [ -f "$1" ] ; then | |
case "$1" in | |
*.tar.bz2) tar xvjf "$1" ;; | |
*.tar.gz) tar xvzf "$1" ;; | |
*.bz2) bunzip2 "$1" ;; | |
*.rar) unrar x "$1" ;; | |
*.gz) gunzip "$1" ;; | |
*.tar) tar xvf "$1" ;; | |
*.tbz2) tar xvjf "$1" ;; | |
*.tgz) tar xvzf "$1" ;; | |
*.zip) unzip "$1" ;; | |
*.Z) uncompress "$1" ;; | |
*.7z) 7z x "$1" ;; | |
*) echo "$1 cannot be extracted via >extract<" ;; | |
esac | |
else | |
echo "'$1' is not a valid file" | |
fi | |
} | |
VALGRIND_VERSION="3.10.0" | |
VALGRIND_EXTENSION=".tar.bz2" | |
VALGRIND_DIRECTORY="valgrind-${VALGRIND_VERSION}" | |
VALGRIND_TARBALL="valgrind-${VALGRIND_VERSION}${VALGRIND_EXTENSION}" | |
# Only download Valgrind tarball again if not already downloaded | |
if [[ ! -f "${VALGRIND_TARBALL}" ]]; then | |
wget -v -nc "http://valgrind.org/downloads/${VALGRIND_TARBALL}" | |
fi | |
# Only extract Valgrind tarball again if not already extracted | |
if [[ ! -d "$VALGRIND_DIRECTORY" ]]; then | |
extract "$VALGRIND_TARBALL" | |
fi | |
# Ensure ANDROID_NDK is set | |
if [[ ! -z "$ANDROID_NDK" ]]; then | |
export ANDROID_NDK="/opt/android-ndk-linux-r10e" | |
fi | |
# Ensure ANDOID_SDK_HOME is set | |
if [[ ! -z "$ANDROID_SDK" ]]; then | |
export ANDROID_SDK="/opt/android-sdk-linux/" | |
fi | |
if [[ ! -d "$VALGRIND_DIRECTORY" ]]; | |
then | |
echo "Problem with extracting Valgrind from $VALGRIND_TARBALL into $VALGRIND_DIRECTORY!!!" | |
exit -1 | |
fi | |
# Move to extracted directory | |
cd "$VALGRIND_DIRECTORY" | |
# ARM Toolchain | |
ARCH_ABI="arm-linux-androideabi-4.8" | |
export AR="$ANDROID_NDK/toolchains/${ARCH_ABI}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar" | |
export LD="$ANDROID_NDK/toolchains/${ARCH_ABI}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld" | |
export CC="$ANDROID_NDK/toolchains/${ARCH_ABI}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc" | |
export CXX="$ANDROID_NDK/toolchains/${ARCH_ABI}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++" | |
[[ ! -d "$ANDROID_NDK" || ! -f "$AR" || ! -f "$LD" || ! -f "$CC" || ! -f "$CXX" ]] && echo "Make sure AR, LD, CC, CXX variables are defined correctly. Ensure ANDROID_NDK is defined also" && exit -1 | |
# Configure build | |
export HWKIND="yellowstone" | |
ANDROID_PLATFORM=android-19 | |
export CPPFLAGS="--sysroot=$ANDROID_NDK/platforms/${ANDROID_PLATFORM}/arch-arm -DANDROID_HARDWARE_$HWKIND" | |
export CFLAGS="--sysroot=$ANDROID_NDK/platforms/${ANDROID_PLATFORM}/arch-arm" | |
# BUG: For some reason file command is unable to detect if the file does not exist with ! -f , it says it doesn't exist even when it does!!! | |
BUILD=true | |
if [[ "${VALGRIND_DIRECTORY}/Inst/data/local/Inst/bin/valgrind" = *"No such file or directory"* ]]; then | |
BUILD=true | |
fi | |
if [[ "$BUILD" = true ]]; | |
then | |
./configure --prefix="/data/local/Inst" \ | |
--host="armv7-unknown-linux" \ | |
--target="armv7-unknown-linux" \ | |
--with-tmpdir="/sdcard" | |
[[ $? -ne 0 ]] && echo "Can't configure!" && exit -1 | |
# Determine the number of jobs (commands) to be run simultaneously by GNU Make | |
NO_CPU_CORES=$(grep -c ^processor /proc/cpuinfo) | |
if [ $NO_CPU_CORES -le 8 ]; then | |
JOBS=$(($NO_CPU_CORES+1)) | |
else | |
JOBS=${NO_CPU_CORES} | |
fi | |
# Compile Valgrind | |
make -j "${JOBS}" | |
[[ $? -ne 0 ]] && echo "Can't compile!" && exit -1 | |
# Install Valgrind locally | |
make -j "${JOBS}" install DESTDIR="$(pwd)/Inst" | |
[[ $? -ne 0 ]] && echo "Can't install!" && exit -1 | |
fi | |
# Push local Valgrind installtion to the phone | |
if [[ $(adb shell ls -ld /data/local/Inst/bin/valgrind) = *"No such file or directory"* ]]; | |
then | |
adb root | |
adb remount | |
adb shell "[ ! -d /data/local/Inst ] && mkdir /data/local/Inst" | |
adb push Inst / | |
adb shell "ls -l /data/local/Inst" | |
# Ensure Valgrind on the phone is running | |
adb shell "/data/local/Inst/bin/valgrind --version" | |
# Add Valgrind executable to PATH (this might fail) | |
adb shell "export PATH=$PATH:/data/local/Inst/bin/" | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment