blob: 2d4a4977c3d9c35e1b0a348ea791dd4944b029f4 [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 {
11 ${MAKE} clean
Ole André Vadla Ravnås6583f062014-07-04 23:09:19 +020012 IOS_SDK=`xcrun --sdk iphoneos --show-sdk-path`
13 IOS_CC=`xcrun --sdk iphoneos -f clang`
14 IOS_CFLAGS="-Os -Wimplicit -isysroot $IOS_SDK"
15 IOS_LDFLAGS="-isysroot $IOS_SDK"
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +080016 if (( $# == 0 )); then
17 # build for all iDevices
Ole André Vadla Ravnås6583f062014-07-04 23:09:19 +020018 IOS_ARCHS="armv7 armv7s arm64"
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +080019 else
Ole André Vadla Ravnås6583f062014-07-04 23:09:19 +020020 IOS_ARCHS="$1"
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +080021 fi
Ole André Vadla Ravnås174f9bb2014-07-05 20:29:50 +020022 CC="$IOS_CC" CFLAGS="$IOS_CFLAGS" LDFLAGS="$IOS_LDFLAGS" LIBARCHS="$IOS_ARCHS" ${MAKE}
Nguyen Anh Quynh50ebb682014-03-31 21:15:29 +080023}
24
Joshua J. Draked12f5502015-06-17 12:49:51 -050025# build Android lib for only one supported architecture
26function build_android {
27 if [ -z "$NDK" ]; then
28 echo "ERROR! Please set \$NDK to point at your Android NDK directory."
29 exit 1
30 fi
31 HOSTOS=$(uname -s | tr 'LD' 'ld')
32 HOSTARCH=$(uname -m)
33
34 TARGARCH="$1"
35 shift
36
37 case "$TARGARCH" in
38 arm)
39 [ -n "$APILEVEL" ] || APILEVEL="android-14" # default to ICS
40 [ -n "$GCCVER" ] || GCCVER="4.8"
41 CROSS=arm-linux-androideabi-
42 ;;
43 arm64)
44 [ -n "$APILEVEL" ] || APILEVEL="android-21" # first with arm64
45 [ -n "$GCCVER" ] || GCCVER="4.9"
46 CROSS=aarch64-linux-android-
47 ;;
48
49 *)
50 echo "ERROR! Building for Android on $1 is not currently supported."
51 exit 1
52 ;;
53 esac
54
55 TOOLCHAIN="$NDK/toolchains/$CROSS$GCCVER/prebuilt/$HOSTOS-$HOSTARCH"
56 PLATFORM="$NDK/platforms/$APILEVEL/arch-$TARGARCH"
57
58 ${MAKE} clean
59
60 CROSS="$TOOLCHAIN/bin/$CROSS" CFLAGS="--sysroot=$PLATFORM" LDFLAGS="--sysroot=$PLATFORM" ${MAKE} $*
61}
62
63
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +080064function build {
Ole André Vadla Ravnås39edca12014-07-05 20:31:30 +020065 if [ $(uname -s) = Darwin ]; then
66 export LIBARCHS="i386 x86_64"
67 fi
68
Nguyen Anh Quynhfacb90c2015-06-18 21:28:36 +080069 ${MAKE} clean
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +080070
71 if [ ${CC}x != x ]; then
Joshua J. Drake158599e2015-06-17 11:37:35 -050072 ${MAKE} CC=$CC $*
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +080073 else
Joshua J. Drake158599e2015-06-17 11:37:35 -050074 ${MAKE} $*
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +080075 fi
76}
77
78function install {
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +080079 # Mac OSX needs to find the right directory for pkgconfig
80 if [ "$(uname)" == "Darwin" ]; then
Nguyen Anh Quynhbcc6e532014-07-07 11:42:25 +080081 # we are going to install into /usr/local, so remove old installs under /usr
82 rm -rf /usr/lib/libcapstone.*
83 rm -rf /usr/include/capstone
84 # install into /usr/local
85 export PREFIX=/usr/local
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +080086 # find the directory automatically, so we can support both Macport & Brew
87 PKGCFGDIR="$(pkg-config --variable pc_path pkg-config | cut -d ':' -f 1)"
Nguyen Anh Quynhac673ae2014-04-14 23:58:28 +080088 # set PKGCFGDIR only in non-Brew environment & pkg-config is available
89 if [ "$HOMEBREW_CAPSTONE" != "1" ] && [ ${PKGCFGDIR}x != x ]; then
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +080090 if [ ${CC}x != x ]; then
91 ${MAKE} CC=$CC PKGCFGDIR=$PKGCFGDIR install
92 else
93 ${MAKE} PKGCFGDIR=$PKGCFGDIR install
94 fi
95 else
96 if [ ${CC}x != x ]; then
97 ${MAKE} CC=$CC install
98 else
99 ${MAKE} install
100 fi
101 fi
Nguyen Anh Quynh360bf1e2014-04-14 13:36:46 +0800102 else # not OSX
103 if test -d /usr/lib64; then
104 if [ ${CC}x != x ]; then
105 ${MAKE} LIBDIRARCH=lib64 CC=$CC install
106 else
107 ${MAKE} LIBDIRARCH=lib64 install
108 fi
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800109 else
Nguyen Anh Quynh360bf1e2014-04-14 13:36:46 +0800110 if [ ${CC}x != x ]; then
111 ${MAKE} CC=$CC install
112 else
113 ${MAKE} install
114 fi
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800115 fi
116 fi
117}
118
119function uninstall {
120 # Mac OSX needs to find the right directory for pkgconfig
121 if [ "$(uname)" == "Darwin" ]; then
122 # find the directory automatically, so we can support both Macport & Brew
123 PKGCFGDIR="$(pkg-config --variable pc_path pkg-config | cut -d ':' -f 1)"
Nguyen Anh Quynhcf862702014-07-22 21:19:02 +0800124 export PREFIX=/usr/local
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800125 if [ ${PKGCFGDIR}x != x ]; then
126 ${MAKE} PKGCFGDIR=$PKGCFGDIR uninstall
127 else
128 ${MAKE} uninstall
129 fi
Nguyen Anh Quynh360bf1e2014-04-14 13:36:46 +0800130 else # not OSX
131 if test -d /usr/lib64; then
132 ${MAKE} LIBDIRARCH=lib64 uninstall
133 else
134 ${MAKE} uninstall
135 fi
Nguyen Anh Quynh64d40832014-01-17 20:55:21 +0800136 fi
137}
138
Nguyen Anh Quynhaf873932014-01-28 11:14:55 +0800139MAKE=make
Nguyen Anh Quynhd3b30712014-01-17 21:25:18 +0800140if [ "$(uname)" == "SunOS" ]; then
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800141 export MAKE=gmake
142 export INSTALL_BIN=ginstall
143 export CC=gcc
Nguyen Anh Quynhd3b30712014-01-17 21:25:18 +0800144fi
145
Nguyen Anh Quynhf63db272014-01-17 22:12:35 +0800146if [[ "$(uname)" == *BSD* ]]; then
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800147 export MAKE=gmake
148 export PREFIX=/usr/local
Nguyen Anh Quynhf63db272014-01-17 22:12:35 +0800149fi
150
Joshua J. Drake158599e2015-06-17 11:37:35 -0500151TARGET="$1"
152shift
153
154case "$TARGET" in
155 "" ) build $*;;
156 "default" ) build $*;;
157 "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 +0800158 "install" ) install;;
Nguyen Anh Quynhaf0e9372014-04-12 23:10:46 +0800159 "uninstall" ) uninstall;;
Joshua J. Drake158599e2015-06-17 11:37:35 -0500160 "nix32" ) CFLAGS=-m32 LDFLAGS=-m32 build $*;;
161 "cross-win32" ) CROSS=i686-w64-mingw32- build $*;;
162 "cross-win64" ) CROSS=x86_64-w64-mingw32- build $*;;
163 "cygwin-mingw32" ) CROSS=i686-pc-mingw32- build $*;;
164 "cygwin-mingw64" ) CROSS=x86_64-w64-mingw32- build $*;;
Joshua J. Draked12f5502015-06-17 12:49:51 -0500165 "cross-android" ) build_android $*;;
Joshua J. Drake158599e2015-06-17 11:37:35 -0500166 "clang" ) CC=clang build $*;;
167 "gcc" ) CC=gcc build $*;;
168 "ios" ) build_iOS $*;;
169 "ios_armv7" ) build_iOS armv7 $*;;
170 "ios_armv7s" ) build_iOS armv7s $*;;
171 "ios_arm64" ) build_iOS arm64 $*;;
Nguyen Anh Quynhfacb90c2015-06-18 21:28:36 +0800172 * ) 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 +0800173esac