Skip to content

Instantly share code, notes, and snippets.

@Wizermil
Created June 24, 2019 14:02
Show Gist options
  • Save Wizermil/cc22c03d6f59559362fc8b8edb44c663 to your computer and use it in GitHub Desktop.
Save Wizermil/cc22c03d6f59559362fc8b8edb44c663 to your computer and use it in GitHub Desktop.
#!/bin/bash
MINIZIP_VERSION="2.8.8"
ARCHS=("armv7" "arm64" "x86" "x86_64")
ROOT_DIR=$(pwd)
WORKER=$(getconf _NPROCESSORS_ONLN)
BUILD_DIR="build/android/minizip"
LOG_FILE="$ROOT_DIR/$BUILD_DIR/build.log"
if [ -d "$BUILD_DIR/download" ]; then
rm -rf "$BUILD_DIR/download"
fi
if [ -d "$BUILD_DIR/source" ]; then
rm -rf "$BUILD_DIR/source"
fi
if [ -f "$LOG_FILE" ]; then
rm "$LOG_FILE"
touch "$LOG_FILE"
fi
mkdir -p "$BUILD_DIR/download"
mkdir -p "$BUILD_DIR/source"
if [[ -z "$NDK_ROOT" ]]; then
echo "set NDK_ROOT env variable"
exit 1
fi
export ANDROID_TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64"
export PATH="$ANDROID_TOOLCHAIN/bin:$PATH"
error() {
echo "$@" 1>&2
}
fail() {
error "$@"
exit 1
}
compile_c() {
includes=("${!2}")
includeArg=""
if [ ${#includes} -ne 0 ]; then
for i in "${includes[@]}"; do
includeArg+="-I \"$i\" "
done
fi
if [ -f "$1" ]; then
eval "$CC $CFLAGS -c \"$1\" $includeArg -o \"${1%.cpp}.o\"" >> "$LOG_FILE" 2>&1 || fail "$1 compilation error"
else
fail "$1 doesn't exist"
fi
}
ar_c() {
lib_name="$1"
srcs=("${!2}")
objects=""
for f in "${srcs[@]}"; do
filename_obj="${f%.cpp}.o"
if [ ! -f "$filename_obj" ]; then
fail "$filename_obj doesn't exist"
else
objects+="\"$filename_obj\" "
fi
done
# echo "$AR -rcs \"$ROOT/$lib_name.a\" $objects"
eval "$AR -rcs \"$lib_name.a\" $objects" >> "$LOG_FILE" 2>&1 || fail "ar error"
}
build_static_library() {
lib_name="$1"
files=("${!2}")
includes=("${!3}")
N=$WORKER
for f in "${files[@]}"; do
((i=i%N)); ((i++==0)) && wait
compile_c "$f" includes[@] &
done
wait
ar_c "$lib_name" files[@]
}
echo "Downloading: minizip"
curl -Lo "$BUILD_DIR/download/minizip-$MINIZIP_VERSION.tar.gz" "https://github.com/nmoinvaz/minizip/archive/$MINIZIP_VERSION.tar.gz" >> "$LOG_FILE" 2>&1 || fail "Error download minizip"
echo "Downloaded: minizip"
echo " "
echo "Uncompressing: minizip"
tar zxf "$BUILD_DIR/download/minizip-$MINIZIP_VERSION.tar.gz" -C "$BUILD_DIR/source" >> "$LOG_FILE" 2>&1 || fail "Error uncompress minizip"
echo "Uncompressed: minizip"
for ARCH in "${ARCHS[@]}"; do
echo " "
cd "$ROOT_DIR" || exit 1
if [ -d "$BUILD_DIR/output/$ARCH" ]; then
rm -rf "$BUILD_DIR/output/$ARCH"
fi
mkdir -p "$BUILD_DIR/output/$ARCH"
cp -R "$BUILD_DIR/source/minizip-$MINIZIP_VERSION/" "$BUILD_DIR/output/$ARCH"
if [ -d "$BUILD_DIR/install/$ARCH" ]; then
rm -rf "$BUILD_DIR/install/$ARCH"
fi
mkdir -p "$BUILD_DIR/install/$ARCH"
case $ARCH in
armv7)
export HOST="arm-linux-androideabi"
export CC="armv7a-linux-androideabi18-clang"
export CXX="armv7a-linux-androideabi18-clang++"
export AR="arm-linux-androideabi-ar"
export AS="arm-linux-androideabi-as"
export LD="arm-linux-androideabi-ld"
export RANLIB="arm-linux-androideabi-ranlib"
export NM="arm-linux-androideabi-nm"
export STRIP="arm-linux-androideabi-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -march=armv7-a -DANDROID -D__ANDROID_API__=18 -Ofast -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb -Wl,--fix-cortex-a8 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_ZLIB=1 -DMZ_ZIP_NO_COMPRESSION=1 -DMZ_ZIP_NO_ENCRYPTION=1 -DMZ_COMPAT=1 -DMZ_COMPAT_VERSION=288"
;;
arm64)
export HOST="aarch64-linux-android"
export CC="aarch64-linux-android21-clang"
export CXX="aarch64-linux-android21-clang++"
export AR="aarch64-linux-android-ar"
export AS="aarch64-linux-android-as"
export LD="aarch64-linux-android-ld"
export RANLIB="aarch64-linux-android-ranlib"
export NM="aarch64-linux-android-nm"
export STRIP="aarch64-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -DANDROID -D__ANDROID_API__=21 -Ofast -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_ZLIB=1 -DMZ_ZIP_NO_COMPRESSION=1 -DMZ_ZIP_NO_ENCRYPTION=1 -DMZ_COMPAT=1 -DMZ_COMPAT_VERSION=288"
;;
x86)
export HOST="i686-linux-android"
export CC="i686-linux-android18-clang"
export CXX="i686-linux-android18-clang++"
export AR="i686-linux-android-ar"
export AS="i686-linux-android-as"
export LD="i686-linux-android-ld"
export RANLIB="i686-linux-android-ranlib"
export NM="i686-linux-android-nm"
export STRIP="i686-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -DANDROID -D__ANDROID_API__=18 -Ofast -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_ZLIB=1 -DMZ_ZIP_NO_COMPRESSION=1 -DMZ_ZIP_NO_ENCRYPTION=1 -DMZ_COMPAT=1 -DMZ_COMPAT_VERSION=288"
;;
x86_64)
export HOST="x86_64-linux-android"
export CC="x86_64-linux-android21-clang"
export CXX="x86_64-linux-android21-clang++"
export AR="x86_64-linux-android-ar"
export AS="x86_64-linux-android-as"
export LD="x86_64-linux-android-ld"
export RANLIB="x86_64-linux-android-ranlib"
export NM="x86_64-linux-android-nm"
export STRIP="x86_64-linux-android-strip"
export CFLAGS="--sysroot=$ANDROID_TOOLCHAIN/sysroot -fPIC -march=x86-64 -mtune=intel -msse4.2 -mpopcnt -m64 -DANDROID -D__ANDROID_API__=21 -Ofast -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_ZLIB=1 -DMZ_ZIP_NO_COMPRESSION=1 -DMZ_ZIP_NO_ENCRYPTION=1 -DMZ_COMPAT=1 -DMZ_COMPAT_VERSION=288"
;;
esac
cd "$ROOT_DIR/$BUILD_DIR/output/$ARCH" || exit 1
if [ -d "$BUILD_DIR/download" ]; then
rm -rf "$BUILD_DIR/download"
fi
echo "Compiling: minizip $ARCH"
files=(
"mz_crypt.c"
"mz_os.c"
"mz_strm.c"
"mz_strm_buf.c"
"mz_strm_mem.c"
"mz_strm_split.c"
"mz_zip.c"
"mz_zip_rw.c"
"mz_os_posix.c"
"mz_strm_os_posix.c"
"mz_strm_zlib.c"
"mz_compat.c"
)
includes=()
build_static_library "libminizip" files[@] includes[@]
echo "Compiled: minizip $ARCH"
echo " "
echo "Installing: minizip $ARCH"
mkdir -p "$ROOT_DIR/$BUILD_DIR/install/$ARCH/lib"
cp libminizip.a "$ROOT_DIR/$BUILD_DIR/install/$ARCH/lib/libminizip.a"
mkdir -p "$ROOT_DIR/$BUILD_DIR/install/$ARCH/include"
public_headers=(
"mz.h"
"mz_os.h"
"mz_crypt.h"
"mz_strm.h"
"mz_strm_buf.h"
"mz_strm_mem.h"
"mz_strm_split.h"
"mz_strm_os.h"
"mz_zip.h"
"mz_zip_rw.h"
"mz_strm_zlib.h"
"mz_compat.h"
)
for f in "${public_headers[@]}"; do
cp "$f" "$ROOT_DIR/$BUILD_DIR/install/$ARCH/include"
done
echo "Installed: minizip $ARCH"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment