xref: /aosp_15_r20/external/capstone/make.sh (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
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