blob: 7922bf7c37a5eb8cadc57679febe02a20fca2123 [file] [log] [blame]
Nguyen Anh Quynhc3fd5272014-03-31 16:05:25 +08001#!/usr/bin/env bash
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +08002
Nguyen Anh Quynh6023ef72014-04-29 11:21:04 +08003# Capstone Disassembly Engine
4# By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +08005
6# Note: to cross-compile "nix32" on Linux, package gcc-multilib is required.
7
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +08008
9# build iOS lib for all iDevices, or only specific device
10function build_iOS {
Ole André Vadla Ravnås6583f062014-07-04 23:09:19 +020011 IOS_SDK=`xcrun --sdk iphoneos --show-sdk-path`
12 IOS_CC=`xcrun --sdk iphoneos -f clang`
13 IOS_CFLAGS="-Os -Wimplicit -isysroot $IOS_SDK"
14 IOS_LDFLAGS="-isysroot $IOS_SDK"
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +080015 if (( $# == 0 )); then
16 # build for all iDevices
Ole André Vadla Ravnås6583f062014-07-04 23:09:19 +020017 IOS_ARCHS="armv7 armv7s arm64"
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +080018 else
Ole André Vadla Ravnås6583f062014-07-04 23:09:19 +020019 IOS_ARCHS="$1"
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +080020 fi
Ole André Vadla Ravnås174f9bb2014-07-05 20:29:50 +020021 CC="$IOS_CC" CFLAGS="$IOS_CFLAGS" LDFLAGS="$IOS_LDFLAGS" LIBARCHS="$IOS_ARCHS" ${MAKE}
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +080022}
23
Joshua J. Draked12f5502015-06-17 12:49:51 -050024# build Android lib for only one supported architecture
25function build_android {
26 if [ -z "$NDK" ]; then
27 echo "ERROR! Please set \$NDK to point at your Android NDK directory."
28 exit 1
29 fi
30 HOSTOS=$(uname -s | tr 'LD' 'ld')
31 HOSTARCH=$(uname -m)
32
33 TARGARCH="$1"
34 shift
35
36 case "$TARGARCH" in
37 arm)
38 [ -n "$APILEVEL" ] || APILEVEL="android-14" # default to ICS
39 [ -n "$GCCVER" ] || GCCVER="4.8"
40 CROSS=arm-linux-androideabi-
41 ;;
42 arm64)
43 [ -n "$APILEVEL" ] || APILEVEL="android-21" # first with arm64
44 [ -n "$GCCVER" ] || GCCVER="4.9"
45 CROSS=aarch64-linux-android-
46 ;;
47
48 *)
49 echo "ERROR! Building for Android on $1 is not currently supported."
50 exit 1
51 ;;
52 esac
53
54 TOOLCHAIN="$NDK/toolchains/$CROSS$GCCVER/prebuilt/$HOSTOS-$HOSTARCH"
55 PLATFORM="$NDK/platforms/$APILEVEL/arch-$TARGARCH"
56
Joshua J. Draked12f5502015-06-17 12:49:51 -050057 CROSS="$TOOLCHAIN/bin/$CROSS" CFLAGS="--sysroot=$PLATFORM" LDFLAGS="--sysroot=$PLATFORM" ${MAKE} $*
58}
59
60
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +080061function build {
Ole André Vadla Ravnås39edca12014-07-05 20:31:30 +020062 if [ $(uname -s) = Darwin ]; then
63 export LIBARCHS="i386 x86_64"
64 fi
65
Pranith Kumar07bcd252015-07-13 00:57:33 -040066 if [ -n "$CC" ]; then
67 ${MAKE} CC="$CC" $*
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +080068 else
Joshua J. Drake158599e2015-06-17 11:37:35 -050069 ${MAKE} $*
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +080070 fi
71}
72
73function install {
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +080074 # Mac OSX needs to find the right directory for pkgconfig
75 if [ "$(uname)" == "Darwin" ]; then
Nguyen Anh Quynhbcc6e532014-07-07 11:42:25 +080076 # we are going to install into /usr/local, so remove old installs under /usr
77 rm -rf /usr/lib/libcapstone.*
78 rm -rf /usr/include/capstone
79 # install into /usr/local
80 export PREFIX=/usr/local
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +080081 # find the directory automatically, so we can support both Macport & Brew
82 PKGCFGDIR="$(pkg-config --variable pc_path pkg-config | cut -d ':' -f 1)"
Nguyen Anh Quynhac673ae2014-04-14 23:58:28 +080083 # set PKGCFGDIR only in non-Brew environment & pkg-config is available
84 if [ "$HOMEBREW_CAPSTONE" != "1" ] && [ ${PKGCFGDIR}x != x ]; then
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +080085 if [ ${CC}x != x ]; then
86 ${MAKE} CC=$CC PKGCFGDIR=$PKGCFGDIR install
87 else
88 ${MAKE} PKGCFGDIR=$PKGCFGDIR install
89 fi
90 else
91 if [ ${CC}x != x ]; then
92 ${MAKE} CC=$CC install
93 else
94 ${MAKE} install
95 fi
96 fi
Nguyen Anh Quynh360bf1e2014-04-14 13:36:46 +080097 else # not OSX
98 if test -d /usr/lib64; then
Pranith Kumar07bcd252015-07-13 00:57:33 -040099 if [ -n "$CC" ]; then
100 ${MAKE} LIBDIRARCH=lib64 CC="$CC" install
Nguyen Anh Quynh360bf1e2014-04-14 13:36:46 +0800101 else
102 ${MAKE} LIBDIRARCH=lib64 install
103 fi
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800104 else
Pranith Kumar07bcd252015-07-13 00:57:33 -0400105 if [ -n "$CC" ]; then
106 ${MAKE} CC="$CC" install
Nguyen Anh Quynh360bf1e2014-04-14 13:36:46 +0800107 else
108 ${MAKE} install
109 fi
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800110 fi
111 fi
112}
113
114function uninstall {
115 # Mac OSX needs to find the right directory for pkgconfig
116 if [ "$(uname)" == "Darwin" ]; then
117 # find the directory automatically, so we can support both Macport & Brew
118 PKGCFGDIR="$(pkg-config --variable pc_path pkg-config | cut -d ':' -f 1)"
Nguyen Anh Quynhcf862702014-07-22 21:19:02 +0800119 export PREFIX=/usr/local
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800120 if [ ${PKGCFGDIR}x != x ]; then
121 ${MAKE} PKGCFGDIR=$PKGCFGDIR uninstall
122 else
123 ${MAKE} uninstall
124 fi
Nguyen Anh Quynh360bf1e2014-04-14 13:36:46 +0800125 else # not OSX
126 if test -d /usr/lib64; then
127 ${MAKE} LIBDIRARCH=lib64 uninstall
128 else
129 ${MAKE} uninstall
130 fi
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +0800131 fi
132}
133
Nguyen Anh Quynhaf873932014-01-28 11:14:55 +0800134MAKE=make
Nguyen Anh Quynhd3b30712014-01-17 21:25:18 +0800135if [ "$(uname)" == "SunOS" ]; then
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800136 export MAKE=gmake
137 export INSTALL_BIN=ginstall
138 export CC=gcc
Nguyen Anh Quynhd3b30712014-01-17 21:25:18 +0800139fi
140
Nguyen Anh Quynhf63db272014-01-17 22:12:35 +0800141if [[ "$(uname)" == *BSD* ]]; then
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800142 export MAKE=gmake
143 export PREFIX=/usr/local
Nguyen Anh Quynhf63db272014-01-17 22:12:35 +0800144fi
145
Joshua J. Drake158599e2015-06-17 11:37:35 -0500146TARGET="$1"
147shift
148
149case "$TARGET" in
150 "" ) build $*;;
151 "default" ) build $*;;
152 "debug" ) CAPSTONE_USE_SYS_DYN_MEM=yes CAPSTONE_STATIC=yes CFLAGS='-O0 -g -fsanitize=address' LDFLAGS='-fsanitize=address' build $*;;
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +0800153 "install" ) install;;
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800154 "uninstall" ) uninstall;;
Joshua J. Drake158599e2015-06-17 11:37:35 -0500155 "nix32" ) CFLAGS=-m32 LDFLAGS=-m32 build $*;;
156 "cross-win32" ) CROSS=i686-w64-mingw32- build $*;;
157 "cross-win64" ) CROSS=x86_64-w64-mingw32- build $*;;
158 "cygwin-mingw32" ) CROSS=i686-pc-mingw32- build $*;;
159 "cygwin-mingw64" ) CROSS=x86_64-w64-mingw32- build $*;;
Joshua J. Draked12f5502015-06-17 12:49:51 -0500160 "cross-android" ) build_android $*;;
Joshua J. Drake158599e2015-06-17 11:37:35 -0500161 "clang" ) CC=clang build $*;;
162 "gcc" ) CC=gcc build $*;;
163 "ios" ) build_iOS $*;;
164 "ios_armv7" ) build_iOS armv7 $*;;
165 "ios_armv7s" ) build_iOS armv7s $*;;
166 "ios_arm64" ) build_iOS arm64 $*;;
Pbb8741bd2015-11-10 23:02:26 +0100167 "osx-kernel" ) CAPSTONE_USE_SYS_DYN_MEM=yes CAPSTONE_HAS_OSXKERNEL=yes CAPSTONE_ARCHS=x86 CAPSTONE_SHARED=no CAPSTONE_BUILD_CORE_ONLY=yes build $*;;
Nguyen Anh Quynhfacb90c2015-06-18 21:28:36 +0800168 * ) echo "Usage: make.sh [nix32|cross-win32|cross-win64|cygwin-mingw32|cygwin-mingw64|ios|ios_armv7|ios_armv7s|ios_arm64|cross-android arm|cross-android arm64|clang|gcc|install|uninstall]"; exit 1;;
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +0800169esac