Skip to content

Instantly share code, notes, and snippets.

@Wizermil
Created June 24, 2019 14:01
Show Gist options
  • Save Wizermil/cbebd6dc5f56ed8c31f4ddd4a9f7baca to your computer and use it in GitHub Desktop.
Save Wizermil/cbebd6dc5f56ed8c31f4ddd4a9f7baca to your computer and use it in GitHub Desktop.
#!/bin/bash
MINIZIP_VERSION="2.8.8"
ARCHS=("i386" "armv7" "armv7s" "arm64" "arm64e" "x86_64")
SDK_VERSION="12.2"
ROOT_DIR=$(pwd)
WORKER=$(getconf _NPROCESSORS_ONLN)
BUILD_DIR="build/ios/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"
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"
if [ "$ARCH" == "i386" ] || [ "$ARCH" == "x86_64" ]; then
PLATFORM="iPhoneSimulator"
MIN_VERSION="-mios-simulator-version-min"
else
PLATFORM="iPhoneOS"
MIN_VERSION="-mios-version-min"
fi
BUILD_SDKROOT="/Applications/Xcode.app/Contents/Developer/Platforms/$PLATFORM.platform/Developer/SDKs/${PLATFORM}${SDK_VERSION}.sdk"
export CFLAGS="-arch $ARCH -pipe -isysroot $BUILD_SDKROOT -fembed-bitcode $MIN_VERSION=10.0 -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"
export CC="clang"
export AR="ar"
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
cd "$ROOT_DIR/$BUILD_DIR" || exit 1
if [ -f "libminizip.a" ]; then
rm -f "libminizip.a"
fi
echo " "
echo "Creating Flat Lib: minizip"
LIPO_CMD="lipo -create"
for ARCH in "${ARCHS[@]}"; do
if [ -f "$ROOT_DIR/$BUILD_DIR/install/$ARCH/lib/libminizip.a" ]; then
LIPO_CMD="$LIPO_CMD $ROOT_DIR/$BUILD_DIR/install/$ARCH/lib/libminizip.a"
fi
done
LIPO_CMD="$LIPO_CMD -output libminizip.a"
eval "$LIPO_CMD" >> "$LOG_FILE" 2>&1 || fail "Error creation flat minizip"
echo "Created Flat Lib: minizip"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment