1*9a0e4156SSadaf Ebrahimi#!/bin/sh 2*9a0e4156SSadaf Ebrahimi 3*9a0e4156SSadaf Ebrahimi# Capstone Disassembly Engine 4*9a0e4156SSadaf Ebrahimi# By Nguyen Anh Quynh <[email protected]>, 2013-2015 5*9a0e4156SSadaf Ebrahimi 6*9a0e4156SSadaf Ebrahimi# Note: to cross-compile "nix32" on Linux, package gcc-multilib is required. 7*9a0e4156SSadaf Ebrahimi 8*9a0e4156SSadaf EbrahimiMAKE_JOBS=$((${MAKE_JOBS}+0)) 9*9a0e4156SSadaf Ebrahimi[ ${MAKE_JOBS} -lt 1 ] && \ 10*9a0e4156SSadaf Ebrahimi MAKE_JOBS=4 11*9a0e4156SSadaf Ebrahimi 12*9a0e4156SSadaf Ebrahimi# build Android lib for only one supported architecture 13*9a0e4156SSadaf Ebrahimibuild_android() { 14*9a0e4156SSadaf Ebrahimi if [ -z "$NDK" ]; then 15*9a0e4156SSadaf Ebrahimi echo "ERROR! Please set \$NDK to point at your Android NDK directory." 16*9a0e4156SSadaf Ebrahimi exit 1 17*9a0e4156SSadaf Ebrahimi fi 18*9a0e4156SSadaf Ebrahimi 19*9a0e4156SSadaf Ebrahimi HOSTOS=$(uname -s | tr 'LD' 'ld') 20*9a0e4156SSadaf Ebrahimi HOSTARCH=$(uname -m) 21*9a0e4156SSadaf Ebrahimi 22*9a0e4156SSadaf Ebrahimi TARGARCH="$1" 23*9a0e4156SSadaf Ebrahimi shift 24*9a0e4156SSadaf Ebrahimi 25*9a0e4156SSadaf Ebrahimi case "$TARGARCH" in 26*9a0e4156SSadaf Ebrahimi arm) 27*9a0e4156SSadaf Ebrahimi [ -n "$APILEVEL" ] || APILEVEL="android-14" # default to ICS 28*9a0e4156SSadaf Ebrahimi CROSS=arm-linux-androideabi 29*9a0e4156SSadaf Ebrahimi ;; 30*9a0e4156SSadaf Ebrahimi arm64) 31*9a0e4156SSadaf Ebrahimi [ -n "$APILEVEL" ] || APILEVEL="android-21" # first with arm64 32*9a0e4156SSadaf Ebrahimi CROSS=aarch64-linux-android 33*9a0e4156SSadaf Ebrahimi ;; 34*9a0e4156SSadaf Ebrahimi 35*9a0e4156SSadaf Ebrahimi *) 36*9a0e4156SSadaf Ebrahimi echo "ERROR! Building for Android on $1 is not currently supported." 37*9a0e4156SSadaf Ebrahimi exit 1 38*9a0e4156SSadaf Ebrahimi ;; 39*9a0e4156SSadaf Ebrahimi esac 40*9a0e4156SSadaf Ebrahimi 41*9a0e4156SSadaf Ebrahimi STANDALONE=`realpath android-ndk-${TARGARCH}-${APILEVEL}` 42*9a0e4156SSadaf Ebrahimi 43*9a0e4156SSadaf Ebrahimi [ -d $STANDALONE ] || { 44*9a0e4156SSadaf Ebrahimi python ${NDK}/build/tools/make_standalone_toolchain.py \ 45*9a0e4156SSadaf Ebrahimi --arch ${TARGARCH} \ 46*9a0e4156SSadaf Ebrahimi --api ${APILEVEL##*-} \ 47*9a0e4156SSadaf Ebrahimi --install-dir ${STANDALONE} 48*9a0e4156SSadaf Ebrahimi } 49*9a0e4156SSadaf Ebrahimi 50*9a0e4156SSadaf Ebrahimi ANDROID=1 CROSS="${STANDALONE}/${CROSS}/bin/" CC=clang CFLAGS="--sysroot=${STANDALONE}/sysroot" ${MAKE} $* 51*9a0e4156SSadaf Ebrahimi} 52*9a0e4156SSadaf Ebrahimi 53*9a0e4156SSadaf Ebrahimi# build iOS lib for all iDevices, or only specific device 54*9a0e4156SSadaf Ebrahimibuild_iOS() { 55*9a0e4156SSadaf Ebrahimi IOS_SDK=`xcrun --sdk iphoneos --show-sdk-path` 56*9a0e4156SSadaf Ebrahimi IOS_CC=`xcrun --sdk iphoneos -f clang` 57*9a0e4156SSadaf Ebrahimi IOS_CFLAGS="-Os -Wimplicit -isysroot $IOS_SDK" 58*9a0e4156SSadaf Ebrahimi IOS_LDFLAGS="-isysroot $IOS_SDK" 59*9a0e4156SSadaf Ebrahimi if [ -z "$1" ]; then 60*9a0e4156SSadaf Ebrahimi # build for all iDevices 61*9a0e4156SSadaf Ebrahimi IOS_ARCHS="armv7 armv7s arm64" 62*9a0e4156SSadaf Ebrahimi else 63*9a0e4156SSadaf Ebrahimi IOS_ARCHS="$1" 64*9a0e4156SSadaf Ebrahimi fi 65*9a0e4156SSadaf Ebrahimi export CC="$IOS_CC" 66*9a0e4156SSadaf Ebrahimi export LIBARCHS="$IOS_ARCHS" 67*9a0e4156SSadaf Ebrahimi CFLAGS="$IOS_CFLAGS" LDFLAGS="$IOS_LDFLAGS" MACOS_UNIVERSAL=yes ${MAKE} 68*9a0e4156SSadaf Ebrahimi} 69*9a0e4156SSadaf Ebrahimi 70*9a0e4156SSadaf Ebrahimiinstall() { 71*9a0e4156SSadaf Ebrahimi # Mac OSX needs to find the right directory for pkgconfig 72*9a0e4156SSadaf Ebrahimi if [ "$UNAME" = Darwin ]; then 73*9a0e4156SSadaf Ebrahimi # we are going to install into /usr/local, so remove old installs under /usr 74*9a0e4156SSadaf Ebrahimi rm -rf /usr/lib/libcapstone.* 75*9a0e4156SSadaf Ebrahimi rm -rf /usr/include/capstone 76*9a0e4156SSadaf Ebrahimi if [ "${HOMEBREW_CAPSTONE}" != 1 ]; then 77*9a0e4156SSadaf Ebrahimi # find the directory automatically, so we can support both Macport & Brew 78*9a0e4156SSadaf Ebrahimi export PKGCFGDIR="$(pkg-config --variable pc_path pkg-config | cut -d ':' -f 1)" 79*9a0e4156SSadaf Ebrahimi fi 80*9a0e4156SSadaf Ebrahimi ${MAKE} install 81*9a0e4156SSadaf Ebrahimi else # not OSX 82*9a0e4156SSadaf Ebrahimi test -d /usr/lib64 && ${MAKE} LIBDIRARCH=lib64 83*9a0e4156SSadaf Ebrahimi ${MAKE} install 84*9a0e4156SSadaf Ebrahimi fi 85*9a0e4156SSadaf Ebrahimi} 86*9a0e4156SSadaf Ebrahimi 87*9a0e4156SSadaf Ebrahimiuninstall() { 88*9a0e4156SSadaf Ebrahimi # Mac OSX needs to find the right directory for pkgconfig 89*9a0e4156SSadaf Ebrahimi if [ "$UNAME" = "Darwin" ]; then 90*9a0e4156SSadaf Ebrahimi # find the directory automatically, so we can support both Macport & Brew 91*9a0e4156SSadaf Ebrahimi export PKGCFGDIR="$(pkg-config --variable pc_path pkg-config | cut -d ':' -f 1)" 92*9a0e4156SSadaf Ebrahimi ${MAKE} uninstall 93*9a0e4156SSadaf Ebrahimi else # not OSX 94*9a0e4156SSadaf Ebrahimi test -d /usr/lib64 && LIBDIRARCH=lib64 95*9a0e4156SSadaf Ebrahimi ${MAKE} uninstall 96*9a0e4156SSadaf Ebrahimi fi 97*9a0e4156SSadaf Ebrahimi} 98*9a0e4156SSadaf Ebrahimi 99*9a0e4156SSadaf Ebrahimiif [ "$UNAME" = SunOS ]; then 100*9a0e4156SSadaf Ebrahimi [ -z "${MAKE}" ] && MAKE=gmake 101*9a0e4156SSadaf Ebrahimi export INSTALL_BIN=ginstall 102*9a0e4156SSadaf Ebrahimi export CC=gcc 103*9a0e4156SSadaf Ebrahimifi 104*9a0e4156SSadaf Ebrahimi 105*9a0e4156SSadaf Ebrahimiif [ -n "`echo "$UNAME" | grep BSD`" ]; then 106*9a0e4156SSadaf Ebrahimi MAKE=gmake 107*9a0e4156SSadaf Ebrahimi export PREFIX=/usr/local 108*9a0e4156SSadaf Ebrahimifi 109*9a0e4156SSadaf Ebrahimi 110*9a0e4156SSadaf Ebrahimi[ -z "${UNAME}" ] && UNAME=$(uname) 111*9a0e4156SSadaf Ebrahimi[ -z "${MAKE}" ] && MAKE=make 112*9a0e4156SSadaf Ebrahimi[ -n "${MAKE_JOBS}" ] && MAKE="$MAKE -j${MAKE_JOBS}" 113*9a0e4156SSadaf Ebrahimi 114*9a0e4156SSadaf EbrahimiTARGET="$1" 115*9a0e4156SSadaf Ebrahimi[ -n "$TARGET" ] && shift 116*9a0e4156SSadaf Ebrahimi 117*9a0e4156SSadaf Ebrahimicase "$TARGET" in 118*9a0e4156SSadaf Ebrahimi "" ) ${MAKE} $*;; 119*9a0e4156SSadaf Ebrahimi "default" ) ${MAKE} $*;; 120*9a0e4156SSadaf Ebrahimi "debug" ) CAPSTONE_USE_SYS_DYN_MEM=yes CAPSTONE_STATIC=yes CFLAGS='-O0 -g -fsanitize=address' LDFLAGS='-fsanitize=address' ${MAKE} $*;; 121*9a0e4156SSadaf Ebrahimi "install" ) install;; 122*9a0e4156SSadaf Ebrahimi "uninstall" ) uninstall;; 123*9a0e4156SSadaf Ebrahimi "nix32" ) CFLAGS=-m32 LDFLAGS=-m32 ${MAKE} $*;; 124*9a0e4156SSadaf Ebrahimi "cross-win32" ) CROSS=i686-w64-mingw32- ${MAKE} $*;; 125*9a0e4156SSadaf Ebrahimi "cross-win64" ) CROSS=x86_64-w64-mingw32- ${MAKE} $*;; 126*9a0e4156SSadaf Ebrahimi "cygwin-mingw32" ) CROSS=i686-pc-mingw32- ${MAKE} $*;; 127*9a0e4156SSadaf Ebrahimi "cygwin-mingw64" ) CROSS=x86_64-w64-mingw32- ${MAKE} $*;; 128*9a0e4156SSadaf Ebrahimi "cross-android" ) build_android $*;; 129*9a0e4156SSadaf Ebrahimi "cross-android64" ) CROSS=aarch64-linux-gnu- ${MAKE} $*;; # Linux cross build 130*9a0e4156SSadaf Ebrahimi "clang" ) CC=clang ${MAKE} $*;; 131*9a0e4156SSadaf Ebrahimi "gcc" ) CC=gcc ${MAKE} $*;; 132*9a0e4156SSadaf Ebrahimi "ios" ) build_iOS $*;; 133*9a0e4156SSadaf Ebrahimi "ios_armv7" ) build_iOS armv7 $*;; 134*9a0e4156SSadaf Ebrahimi "ios_armv7s" ) build_iOS armv7s $*;; 135*9a0e4156SSadaf Ebrahimi "ios_arm64" ) build_iOS arm64 $*;; 136*9a0e4156SSadaf Ebrahimi "osx-kernel" ) CAPSTONE_USE_SYS_DYN_MEM=yes CAPSTONE_HAS_OSXKERNEL=yes CAPSTONE_ARCHS=x86 CAPSTONE_SHARED=no CAPSTONE_BUILD_CORE_ONLY=yes ${MAKE} $*;; 137*9a0e4156SSadaf Ebrahimi "mac-universal" ) MACOS_UNIVERSAL=yes ${MAKE} $*;; 138*9a0e4156SSadaf Ebrahimi "mac-universal-no" ) MACOS_UNIVERSAL=no ${MAKE} $*;; 139*9a0e4156SSadaf Ebrahimi * ) 140*9a0e4156SSadaf Ebrahimi echo "Usage: $0 ["`grep '^ "' $0 | cut -d '"' -f 2 | tr "\\n" "|"`"]" 141*9a0e4156SSadaf Ebrahimi exit 1;; 142*9a0e4156SSadaf Ebrahimiesac 143