blob: 746666a66a334124d98f9b4fa54311c9725bd869 [file] [log] [blame]
#!/bin/bash
#-------------------------------------------------------------------------------------------------------
# Copyright (C) Microsoft. All rights reserved.
# Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
#-------------------------------------------------------------------------------------------------------
SAFE_RUN() {
local SF_RETURN_VALUE=$($1 2>&1)
if [[ $? != 0 ]]; then
>&2 echo $SF_RETURN_VALUE
exit 1
fi
echo $SF_RETURN_VALUE
}
ERROR_EXIT() {
if [[ $? != 0 ]]; then
echo $($1 2>&1)
exit 1;
fi
}
ERROR_CLANG() {
echo "ERROR: clang++ not found."
echo -e "\nYou could use clang++ from a custom location.\n"
PRINT_USAGE
exit 1
}
PRINT_USAGE() {
echo ""
echo "[ChakraCore Build Script Help]"
echo ""
echo "build.sh [options]"
echo ""
echo "options:"
echo " --arch[=S] Set target arch (arm, x86, amd64)"
echo " --cc=PATH Path to Clang (see example below)"
echo " --cxx=PATH Path to Clang++ (see example below)"
echo " --create-deb[=V] Create .deb package with given V version."
echo " -d, --debug Debug build. Default: Release"
echo " --extra-defines=DEF=VAR,DEFINE,..."
echo " Compile with additional defines"
echo " -h, --help Show help"
echo " --custom-icu=PATH The path to ICUUC headers"
echo " If --libs-only --static is not specified,"
echo " PATH/../lib must be the location of ICU libraries"
echo " Example: /usr/local/opt/icu4c/include when using ICU from homebrew"
echo " --system-icu Use the ICU that you installed globally on your machine"
echo " (where ICU headers and libraries are in your system's search path)"
echo " --embed-icu Download ICU 57.1 and link statically with it"
echo " --no-icu Compile without ICU (disables Unicode and Intl features)"
echo " -j[=N], --jobs[=N] Multicore build, allow N jobs at once."
echo " -n, --ninja Build with ninja instead of make."
echo " --no-jit Disable JIT"
echo " --libs-only Do not build CH and GCStress"
echo " --lto Enables LLVM Full LTO"
echo " --lto-thin Enables LLVM Thin LTO - xcode 8+ or clang 3.9+"
echo " --lttng Enables LTTng support for ETW events"
echo " --static Build as static library. Default: shared library"
echo " --sanitize=CHECKS Build with clang -fsanitize checks,"
echo " e.g. undefined,signed-integer-overflow."
echo " -t, --test-build Test build. Enables test flags on a release build."
echo " --target[=S] Target OS (i.e. android)"
echo " --target-path[=S] Output path for compiled binaries. Default: out/"
echo " --trace Enables experimental built-in trace."
echo " --xcode Generate XCode project."
echo " --without-intl Disable Intl (ECMA 402) support"
echo " --without=FEATURE,FEATURE,..."
echo " Disable FEATUREs from JSRT experimental features."
echo " --valgrind Enable Valgrind support"
echo " !!! Disables Concurrent GC (lower performance)"
echo " --ccache[=NAME] Enable ccache, optionally with a custom binary name."
echo " Default: ccache"
echo " -v, --verbose Display verbose output including all options"
echo " --wb-check CPPFILE"
echo " Write-barrier check given CPPFILE (git path)"
echo " --wb-analyze CPPFILE"
echo " Write-barrier analyze given CPPFILE (git path)"
echo " --wb-args=PLUGIN_ARGS"
echo " Write-barrier clang plugin args"
echo " -y Automatically answer Yes to questions asked by"
echo " this script (use at your own risk)"
echo ""
echo "example:"
echo " ./build.sh --cxx=/path/to/clang++ --cc=/path/to/clang -j"
echo "with icu:"
echo " ./build.sh --custom-icu=/usr/local/opt/icu4c"
echo ""
}
pushd `dirname $0` > /dev/null
CHAKRACORE_DIR=`pwd -P`
popd > /dev/null
_CXX=""
_CC=""
VERBOSE="0"
BUILD_TYPE="Release"
CMAKE_GEN=
EXTRA_DEFINES=""
MAKE=make
MULTICORE_BUILD=""
NO_JIT=
CMAKE_ICU="-DICU_SETTINGS_RESET=1"
CMAKE_INTL="-DINTL_ICU_SH=1" # default to enabling intl
USE_LOCAL_ICU=0 # default to using system version of ICU
STATIC_LIBRARY="-DSHARED_LIBRARY_SH=1"
SANITIZE=
WITHOUT_FEATURES=""
CREATE_DEB=0
ARCH="-DCC_USES_SYSTEM_ARCH_SH=1"
OS_LINUX=0
OS_APT_GET=0
OS_UNIX=0
LTO=""
LTTNG=""
TARGET_OS=""
ENABLE_CC_XPLAT_TRACE=""
WB_CHECK=
WB_ANALYZE=
WB_ARGS=
TARGET_PATH=0
VALGRIND=0
# -DCMAKE_EXPORT_COMPILE_COMMANDS=ON useful for clang-query tool
CMAKE_EXPORT_COMPILE_COMMANDS="-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"
LIBS_ONLY_BUILD=
ALWAYS_YES=
CCACHE_NAME=
PYTHON2_BINARY=$(which python2.7 || which python2 || which python 2> /dev/null)
UNAME_S=`uname -s`
if [[ $UNAME_S =~ 'Linux' ]]; then
OS_LINUX=1
PROC_INFO=$(which apt-get)
if [[ ${#PROC_INFO} > 0 && -f "$PROC_INFO" ]]; then
OS_APT_GET=1
fi
elif [[ $UNAME_S =~ "Darwin" ]]; then
OS_UNIX=1
else
echo -e "Warning: Installation script couldn't detect host OS..\n" # exit ?
fi
SET_CUSTOM_ICU() {
ICU_PATH=$1
if [[ ! -d "$ICU_PATH" || ! -d "$ICU_PATH/unicode" ]]; then
ICU_PATH_LOCAL="$CHAKRACORE_DIR/$ICU_PATH"
if [[ ! -d "$ICU_PATH_LOCAL" || ! -d "$ICU_PATH_LOCAL/unicode" ]]; then
# if a path was explicitly provided, do not fallback to no-icu
echo "!!! couldn't find ICU at either $ICU_PATH or $ICU_PATH_LOCAL"
exit 1
else
ICU_PATH="$ICU_PATH_LOCAL"
fi
fi
CMAKE_ICU="-DICU_INCLUDE_PATH_SH=$ICU_PATH"
USE_LOCAL_ICU=0
}
while [[ $# -gt 0 ]]; do
case "$1" in
--arch=*)
ARCH=$1
ARCH="${ARCH:7}"
;;
--cxx=*)
_CXX=$1
_CXX=${_CXX:6}
;;
--cc=*)
_CC=$1
_CC=${_CC:5}
;;
-h | --help)
PRINT_USAGE
exit
;;
-v | --verbose)
VERBOSE="1"
;;
-d | --debug)
BUILD_TYPE="Debug"
;;
--extra-defines=*)
DEFINES=$1
DEFINES=${DEFINES:16} # value after --extra-defines=
for x in ${DEFINES//,/ } # replace comma with space then split
do
if [[ "$EXTRA_DEFINES" == "" ]]; then
EXTRA_DEFINES="-DEXTRA_DEFINES_SH="
else
EXTRA_DEFINES="$EXTRA_DEFINES;"
fi
EXTRA_DEFINES="${EXTRA_DEFINES}-D${x}"
done
;;
-t | --test-build)
BUILD_TYPE="Test"
;;
-j | --jobs)
if [[ "$1" == "-j" && "$2" =~ ^[^-] ]]; then
MULTICORE_BUILD="-j $2"
shift
else
MULTICORE_BUILD="-j $(nproc)"
fi
;;
-j=* | --jobs=*) # -j=N syntax used in CI
MULTICORE_BUILD=$1
if [[ "$1" =~ ^-j= ]]; then
MULTICORE_BUILD="-j ${MULTICORE_BUILD:3}"
else
MULTICORE_BUILD="-j ${MULTICORE_BUILD:7}"
fi
;;
--custom-icu=*)
ICU_PATH=$1
# `eval` used to resolve tilde in the path
eval ICU_PATH="${ICU_PATH:13}"
SET_CUSTOM_ICU $ICU_PATH
;;
# allow legacy --icu flag for compatability
--icu=*)
ICU_PATH=$1
# `eval` used to resolve tilde in the path
eval ICU_PATH="${ICU_PATH:6}"
SET_CUSTOM_ICU $ICU_PATH
;;
--embed-icu)
USE_LOCAL_ICU=1
;;
--system-icu)
CMAKE_ICU="-DSYSTEM_ICU_SH=1"
USE_LOCAL_ICU=0
;;
--no-icu)
CMAKE_ICU="-DNO_ICU_SH=1"
USE_LOCAL_ICU=0
;;
--libs-only)
LIBS_ONLY_BUILD="-DLIBS_ONLY_BUILD_SH=1"
;;
--lto)
LTO="-DENABLE_FULL_LTO_SH=1"
HAS_LTO=1
;;
--lto-thin)
LTO="-DENABLE_THIN_LTO_SH=1"
HAS_LTO=1
;;
--lttng)
LTTNG="-DENABLE_JS_LTTNG_SH=1"
HAS_LTTNG=1
;;
-n | --ninja)
CMAKE_GEN="-G Ninja"
MAKE=ninja
;;
--no-jit)
NO_JIT="-DNO_JIT_SH=1"
;;
--without-intl)
CMAKE_INTL="-DINTL_ICU_SH=0"
;;
--xcode)
CMAKE_GEN="-G Xcode -DCC_XCODE_PROJECT=1"
CMAKE_EXPORT_COMPILE_COMMANDS=""
MAKE=0
;;
--create-deb=*)
CREATE_DEB=$1
CREATE_DEB="${CREATE_DEB:13}"
;;
--static)
STATIC_LIBRARY="-DSTATIC_LIBRARY_SH=1"
;;
--sanitize=*)
SANITIZE=$1
SANITIZE=${SANITIZE:11} # value after --sanitize=
SANITIZE="-DCLANG_SANITIZE_SH=${SANITIZE}"
;;
--target=*)
_TARGET_OS=$1
_TARGET_OS="${_TARGET_OS:9}"
if [[ $_TARGET_OS =~ "android" ]]; then
if [[ -z "$TOOLCHAIN" ]]; then
OLD_PATH=$PATH
export TOOLCHAIN=$PWD/android-toolchain-arm
export PATH=$TOOLCHAIN/bin:$OLD_PATH
export AR=arm-linux-androideabi-ar
export CC=arm-linux-androideabi-clang
export CXX=arm-linux-androideabi-clang++
export LINK=arm-linux-androideabi-clang++
export STRIP=arm-linux-androideabi-strip
# override CXX and CC
_CXX="${TOOLCHAIN}/bin/${CXX}"
_CC="${TOOLCHAIN}/bin/${CC}"
fi
TARGET_OS="-DCC_TARGET_OS_ANDROID_SH=1 -DANDROID_TOOLCHAIN_DIR=${TOOLCHAIN}/arm-linux-androideabi"
# inherit CXX and CC
_CXX="${CXX}"
_CC="${CC}"
fi
;;
--trace)
ENABLE_CC_XPLAT_TRACE="-DENABLE_CC_XPLAT_TRACE_SH=1"
;;
--target-path=*)
TARGET_PATH=$1
TARGET_PATH=${TARGET_PATH:14}
;;
--ccache=*)
CCACHE_NAME="$1"
CCACHE_NAME=${CCACHE_NAME:9}
CCACHE_NAME="-DCCACHE_PROGRAM_NAME_SH=${CCACHE_NAME}"
;;
--ccache)
CCACHE_NAME="-DCCACHE_PROGRAM_NAME_SH=ccache"
;;
--without=*)
FEATURES=$1
FEATURES=${FEATURES:10} # value after --without=
for x in ${FEATURES//,/ } # replace comma with space then split
do
if [[ "$WITHOUT_FEATURES" == "" ]]; then
WITHOUT_FEATURES="-DWITHOUT_FEATURES_SH="
else
WITHOUT_FEATURES="$WITHOUT_FEATURES;"
fi
WITHOUT_FEATURES="${WITHOUT_FEATURES}-DCOMPILE_DISABLE_${x}=1"
done
;;
--wb-check)
if [[ "$2" =~ ^[^-] ]]; then
WB_CHECK="$2"
shift
else
WB_CHECK="*" # check all files
fi
;;
--wb-analyze)
if [[ "$2" =~ ^[^-] ]]; then
WB_ANALYZE="$2"
shift
else
PRINT_USAGE && exit 1
fi
;;
--wb-args=*)
WB_ARGS=$1
WB_ARGS=${WB_ARGS:10}
WB_ARGS=${WB_ARGS// /;} # replace space with ; to generate a cmake list
;;
--valgrind)
VALGRIND="-DENABLE_VALGRIND_SH=1"
;;
-y | -Y)
ALWAYS_YES=-y
;;
*)
echo "Unknown option $1"
PRINT_USAGE
exit -1
;;
esac
shift
done
if [[ $USE_LOCAL_ICU == 1 ]]; then
LOCAL_ICU_DIR="$CHAKRACORE_DIR/deps/Chakra.ICU/icu"
if [[ ! -d $LOCAL_ICU_DIR ]]; then
"$PYTHON2_BINARY" "$CHAKRACORE_DIR/tools/icu/configure.py" 57.1 $ALWAYS_YES
fi
# if there is still no directory, then the user declined the license agreement
if [[ ! -d $LOCAL_ICU_DIR ]]; then
echo "You must accept the ICU license agreement in order to use this configuration"
exit 1
fi
LOCAL_ICU_DIST="$LOCAL_ICU_DIR/output"
if [ ! -d "$LOCAL_ICU_DIST" ]; then
set -e
pushd "$LOCAL_ICU_DIR/source"
./configure --with-data-packaging=static\
--prefix="$LOCAL_ICU_DIST"\
--enable-static\
--disable-shared\
--with-library-bits=64\
--disable-icuio\
--disable-layout\
--disable-tests\
--disable-samples\
CXXFLAGS="-fPIC"\
CFLAGS="-fPIC"
ERROR_EXIT "rm -rf $LOCAL_ICU_DIST"
make STATICCFLAGS="-fPIC" STATICCXXFLAGS="-fPIC" STATICCPPFLAGS="-DPIC" install
ERROR_EXIT "rm -rf $LOCAL_ICU_DIST"
popd
fi
CMAKE_ICU="-DICU_INCLUDE_PATH_SH=$LOCAL_ICU_DIST/include"
fi
if [[ "$MAKE" == "ninja" ]]; then
if [[ "$VERBOSE" == "1" ]]; then
VERBOSE="-v"
else
VERBOSE=""
fi
else
if [[ "$VERBOSE" == "1" ]]; then
VERBOSE="VERBOSE=1"
else
VERBOSE=""
fi
fi
if [[ "$VERBOSE" != "" ]]; then
# echo options back to the user
echo "Printing command line options back to the user:"
echo "_CXX=${_CXX}"
echo "_CC=${_CC}"
echo "BUILD_TYPE=${BUILD_TYPE}"
echo "MULTICORE_BUILD=${MULTICORE_BUILD}"
echo "CMAKE_ICU=${CMAKE_ICU}"
echo "CMAKE_GEN=${CMAKE_GEN}"
echo "MAKE=${MAKE} $VERBOSE"
echo ""
fi
# if LTO build is enabled and cc-toolchain/clang was compiled, use it instead
if [[ $HAS_LTO == 1 ]]; then
if [[ -f "${CHAKRACORE_DIR}/cc-toolchain/build/bin/clang++" ]]; then
SELF=`pwd`
_CXX="$CHAKRACORE_DIR/cc-toolchain/build/bin/clang++"
_CC="$CHAKRACORE_DIR/cc-toolchain/build/bin/clang"
else
# Linux LD possibly doesn't support LLVM LTO, check.. and compile clang if not
if [[ $OS_LINUX == 1 ]]; then
if [[ ! `ld -v` =~ 'GNU gold' ]]; then
pushd "$CHAKRACORE_DIR" > /dev/null
$CHAKRACORE_DIR/tools/compile_clang.sh
if [[ $? != 0 ]]; then
echo -e "tools/compile_clang.sh has failed.\n"
echo "Try with 'sudo' ?"
popd > /dev/null
exit 1
fi
_CXX="$CHAKRACORE_DIR/cc-toolchain/build/bin/clang++"
_CC="$CHAKRACORE_DIR/cc-toolchain/build/bin/clang"
popd > /dev/null
fi
fi
fi
fi
if [ "${HAS_LTO}${OS_LINUX}" == "11" ]; then
echo "lto: ranlib disabled"
export RANLIB=/bin/true
fi
CLANG_PATH=
if [[ ${#_CXX} > 0 || ${#_CC} > 0 ]]; then
if [[ ${#_CXX} == 0 || ${#_CC} == 0 ]]; then
echo "ERROR: '-cxx' and '-cc' options must be used together."
exit 1
fi
echo "Custom CXX ${_CXX}"
echo "Custom CC ${_CC}"
if [[ ! -f $_CXX || ! -f $_CC ]]; then
echo "ERROR: Custom compiler not found on given path"
exit 1
fi
CLANG_PATH=$_CXX
else
RET_VAL=$(SAFE_RUN 'c++ --version')
if [[ ! $RET_VAL =~ "clang" ]]; then
echo "Searching for Clang..."
if [[ -f /usr/bin/clang++ ]]; then
echo "Clang++ found at /usr/bin/clang++"
_CXX=/usr/bin/clang++
_CC=/usr/bin/clang
CLANG_PATH=$_CXX
else
# try env CXX and CC
if [[ ! -f $CXX || ! -f $CC ]]; then
ERROR_CLANG
fi
_CXX=$CXX
_CC=$CC
CLANG_PATH=$CXX
VERSION=$($CXX --version)
if [[ ! $VERSION =~ "clang" ]]; then
ERROR_CLANG
fi
echo -e "Clang++ not found on PATH.\nTrying CCX -> ${CCX} and CC -> ${CC}"
fi
else
CLANG_PATH=c++
fi
fi
# check clang version (min required 3.7)
VERSION=$($CLANG_PATH --version | grep "version [0-9]*\.[0-9]*" --o -i | grep "[0-9]*\.[0-9]*" --o)
VERSION=${VERSION/./}
if [[ $VERSION -lt 37 ]]; then
echo "ERROR: Minimum required Clang version is 3.7"
exit 1
fi
CC_PREFIX=""
if [[ ${#_CXX} > 0 ]]; then
CC_PREFIX="-DCMAKE_CXX_COMPILER=$_CXX -DCMAKE_C_COMPILER=$_CC"
fi
RELATIVE_BUILD_PATH="../.."
if [[ $TARGET_PATH == 0 ]]; then
TARGET_PATH="$CHAKRACORE_DIR/out"
else
if [[ $TARGET_PATH =~ "~/" ]]; then
echo "Do not use '~/' for '--target-path'"
echo -e "\nAborting Build."
exit 1
fi
fi
export TARGET_PATH
if [[ $HAS_LTTNG == 1 ]]; then
CHAKRACORE_ROOT=`dirname $0`
"$PYTHON2_BINARY" $CHAKRACORE_ROOT/tools/lttng.py --man $CHAKRACORE_ROOT/manifests/Microsoft-Scripting-Chakra-Instrumentation.man --intermediate $TARGET_PATH/intermediate
mkdir -p $TARGET_PATH/lttng
(diff -q $TARGET_PATH/intermediate/lttng/jscriptEtw.h $TARGET_PATH/lttng/jscriptEtw.h && echo "jscriptEtw.h up to date; skipping") || cp $TARGET_PATH/intermediate/lttng/* $TARGET_PATH/lttng/
fi
BUILD_DIRECTORY="${TARGET_PATH}/${BUILD_TYPE:0}"
echo "Build path: ${BUILD_DIRECTORY}"
BUILD_RELATIVE_DIRECTORY=$("$PYTHON2_BINARY" -c "import os.path;print \
os.path.relpath('${CHAKRACORE_DIR}', '$BUILD_DIRECTORY')")
################# Write-barrier check/analyze run #################
WB_FLAG=
WB_TARGET=
if [[ $WB_CHECK || $WB_ANALYZE ]]; then
# build software write barrier checker clang plugin
$CHAKRACORE_DIR/tools/RecyclerChecker/build.sh --cxx=$_CXX || exit 1
if [[ $WB_CHECK && $WB_ANALYZE ]]; then
echo "Please run only one of --wb-check or --wb-analyze" && exit 1
fi
if [[ $WB_CHECK ]]; then
WB_FLAG="-DWB_CHECK_SH=1"
WB_FILE=$WB_CHECK
fi
if [[ $WB_ANALYZE ]]; then
WB_FLAG="-DWB_ANALYZE_SH=1"
WB_FILE=$WB_ANALYZE
fi
if [[ $WB_ARGS ]]; then
if [[ $WB_ARGS =~ "-fix" ]]; then
MULTICORE_BUILD="-j 1" # 1 job only if doing write barrier fix
fi
WB_ARGS="-DWB_ARGS_SH=$WB_ARGS"
fi
# support --wb-check ONE_CPP_FILE
if [[ $WB_FILE != "*" ]]; then
if [[ $MAKE != 'ninja' ]]; then
echo "--wb-check/wb-analyze ONE_FILE only works with --ninja" && exit 1
fi
if [[ -f $CHAKRACORE_DIR/$WB_FILE ]]; then
touch $CHAKRACORE_DIR/$WB_FILE
else
echo "$CHAKRACORE_DIR/$WB_FILE not found. Please use full git path for $WB_FILE." && exit 1
fi
WB_FILE_DIR=`dirname $WB_FILE`
WB_FILE_BASE=`basename $WB_FILE`
WB_FILE_CMAKELISTS="$CHAKRACORE_DIR/$WB_FILE_DIR/CMakeLists.txt"
if [[ -f $WB_FILE_CMAKELISTS ]]; then
SUBDIR=$(grep -i add_library $WB_FILE_CMAKELISTS | sed "s/.*(\([^ ]*\) .*/\1/")
else
echo "$WB_FILE_CMAKELISTS not found." && exit 1
fi
WB_TARGET="$WB_FILE_DIR/CMakeFiles/$SUBDIR.dir/$WB_FILE_BASE.o"
fi
fi
# prepare DbgController.js.h
CH_DIR="${CHAKRACORE_DIR}/bin/ch"
"${CH_DIR}/jstoc.py" "${CH_DIR}/DbgController.js" controllerScript
if [[ $? != 0 ]]; then
exit 1
fi
if [ ! -d "$BUILD_DIRECTORY" ]; then
SAFE_RUN `mkdir -p $BUILD_DIRECTORY`
fi
pushd $BUILD_DIRECTORY > /dev/null
if [[ $ARCH =~ "x86" ]]; then
ARCH="-DCC_TARGETS_X86_SH=1"
echo "Compile Target : x86"
elif [[ $ARCH =~ "arm" ]]; then
ARCH="-DCC_TARGETS_ARM_SH=1"
echo "Compile Target : arm"
elif [[ $ARCH =~ "amd64" ]]; then
ARCH="-DCC_TARGETS_AMD64_SH=1"
echo "Compile Target : amd64"
else
ARCH="-DCC_USES_SYSTEM_ARCH_SH=1"
echo "Compile Target : System Default"
fi
echo Generating $BUILD_TYPE makefiles
echo $EXTRA_DEFINES
cmake $CMAKE_GEN $CC_PREFIX $CMAKE_ICU $LTO $LTTNG $STATIC_LIBRARY $ARCH $TARGET_OS \
$ENABLE_CC_XPLAT_TRACE $EXTRA_DEFINES -DCMAKE_BUILD_TYPE=$BUILD_TYPE $SANITIZE $NO_JIT $CMAKE_INTL \
$WITHOUT_FEATURES $WB_FLAG $WB_ARGS $CMAKE_EXPORT_COMPILE_COMMANDS $LIBS_ONLY_BUILD\
$VALGRIND $BUILD_RELATIVE_DIRECTORY $CCACHE_NAME
_RET=$?
if [[ $? == 0 ]]; then
if [[ $MAKE != 0 ]]; then
if [[ $MAKE != 'ninja' ]]; then
# $MFLAGS comes from host `make` process. Sub `make` process needs this (recursional make runs)
TEST_MFLAGS="${MFLAGS}*!"
if [[ $TEST_MFLAGS != "*!" ]]; then
# Get -j flag from the host
MULTICORE_BUILD=""
fi
$MAKE $MFLAGS $MULTICORE_BUILD $VERBOSE $WB_TARGET 2>&1 | tee build.log
else
$MAKE $MULTICORE_BUILD $VERBOSE $WB_TARGET 2>&1 | tee build.log
fi
_RET=${PIPESTATUS[0]}
else
echo "Visit given folder above for xcode project file ----^"
fi
fi
if [[ $_RET != 0 ]]; then
echo "See error details above. Exit code was $_RET"
else
if [[ $CREATE_DEB != 0 ]]; then
DEB_FOLDER=`realpath .`
DEB_FOLDER="${DEB_FOLDER}/chakracore_${CREATE_DEB}"
mkdir -p $DEB_FOLDER/usr/local/bin
mkdir -p $DEB_FOLDER/DEBIAN
cp $DEB_FOLDER/../ch $DEB_FOLDER/usr/local/bin/
if [[ $STATIC_LIBRARY == "-DSHARED_LIBRARY_SH=1" ]]; then
cp $DEB_FOLDER/../*.so $DEB_FOLDER/usr/local/bin/
fi
echo -e "Package: ChakraCore"\
"\nVersion: ${CREATE_DEB}"\
"\nSection: base"\
"\nPriority: optional"\
"\nArchitecture: amd64"\
"\nDepends: libc6 (>= 2.19), uuid-dev (>> 0), libicu-dev (>> 0)"\
"\nMaintainer: ChakraCore <chakracore@microsoft.com>"\
"\nDescription: Chakra Core"\
"\n Open source Core of Chakra Javascript Engine"\
> $DEB_FOLDER/DEBIAN/control
dpkg-deb --build $DEB_FOLDER
_RET=$?
if [[ $_RET == 0 ]]; then
echo ".deb package is available under $BUILD_DIRECTORY"
fi
fi
fi
popd > /dev/null
exit $_RET