#!/usr/bin/env bash
# Mac C. compile-ios.sh for JQ.

# Defaults
set -e
oniguruma='6.9.10'

unset CFLAGS
unset CXXFLAGS
unset LDFLAGS

# Parse args. 
usage(){
cat << EOF
${0##*/}: usage

    Description:
       This simple script builds oniguruma and jq for all *-apple-darwin devices.

    Arguments:
    --extra-cflags <arg>: Pass defines or includes to clang.
    --extra-ldflags <arg>: Pass libs or includes to ld64.

    --with-oniguruma <arg>: Change default version of onigurma from ${oniguruma}.
EOF
exit 1
}

while (( $# )); do
   case "$1" in
      --with-oniguruma) shift; oniguruma="${1}" ;;

      --extra-cflags) shift; export CFLAGS_="${1}" ;;
      --extra-ldflags) shift; export LDFLAGS_="${1}" ;;

      --help) usage ;;
      *) echo -e "Unknown option: ${1}\n"; usage ;;
   esac
   shift
done 

# Start building.
echo "Building..."
MAKEJOBS="$(sysctl -n hw.ncpu || echo 1)"
CC_="$(xcrun -f clang || echo clang)"

onig_url="https://github.com/kkos/oniguruma/releases/download/v${oniguruma}/onig-${oniguruma}.tar.gz"
builddir="${TMPDIR:-/tmp}/${RANDOM:-'xxxxx'}-compile-ios-build"
cwd="$(realpath ${PWD} 2>/dev/null || echo ${PWD})"

t_exit() {
cat << EOF

A error as occurred.
    oniguruma location: ${builddir}/onig/onig-${oniguruma}
    jq location: ${cwd}

    Provide config.log and console logs when posting a issue.

EOF
}
trap t_exit ERR

#  Onig.
mkdir -p "${builddir}/onig"
cd "${builddir}/"
 curl -L ${onig_url} | tar xz
 for arch in i386 x86_64 armv7 armv7s arm64; do
     if [[ "$arch" = "i386" || "$arch" = "x86_64" ]]; then
         SYSROOT=$(xcrun -f --sdk iphonesimulator --show-sdk-path)
     else
         SYSROOT=$(xcrun -f --sdk iphoneos --show-sdk-path)
     fi
     HOST="${arch}-apple-darwin"
     [[ "${arch}" = "arm64" ]] && HOST="aarch64-apple-darwin"

     CFLAGS="-arch ${arch} -miphoneos-version-min=9.0 -isysroot ${SYSROOT} ${CFLAGS_} -D_REENTRANT"
     LDFLAGS="-arch ${arch} -miphoneos-version-min=9.0 -isysroot ${SYSROOT} ${LDFLAGS_}"
     CC="${CC_} ${CFLAGS}"

     # ./configure; make install
     cd "${builddir}/onig-${oniguruma}"
     CC=${CC} LDFLAGS=${LDFLAGS} \
     ./configure --host=${HOST} --build=$(./config.guess) --enable-shared=no --enable-static=yes --prefix=/
     make -j${MAKEJOBS} install DESTDIR="${cwd}/ios/onig/${arch}"
     make clean
     
     # Jump back to JQ.
     cd ${cwd}
     [[ ! -f ./configure ]] && autoreconf -ivf
     CC=${CC} LDFLAGS=${LDFLAGS} \
     ./configure --host=${HOST} --build=$(./config/config.guess) --enable-docs=no --enable-shared=no --enable-static=yes --prefix=/ --with-oniguruma=${cwd}/ios/onig/${arch} $(test -z ${BISON+x} || echo '--enable-maintainer-mode')
     make -j${MAKEJOBS} install DESTDIR="${cwd}/ios/jq/${arch}"
     make clean
 done

mkdir -p "${cwd}/ios/dest/lib"
# lipo, make a static lib.
lipo -create -output ${cwd}/ios/dest/lib/libonig.a ${cwd}/ios/onig/{i386,x86_64,armv7,armv7s,arm64}/lib/libonig.a
lipo -create -output ${cwd}/ios/dest/lib/libjq.a ${cwd}/ios/jq/{i386,x86_64,armv7,armv7s,arm64}/lib/libjq.a

# Take the arm64 headers- the most common target.
cp -r ${cwd}/ios/jq/arm64/include ${cwd}/ios/dest/
rm -rf ${cwd}/build/ios/{i386,x86_64,armv7,armv7s,arm64}

echo "Output to ${cwd}/ios/dest"
