build.sh 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. #!/bin/bash
  2. #-------------------------------------------------------------------------------------------------------
  3. # Copyright (C) Microsoft. All rights reserved.
  4. # Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  5. #-------------------------------------------------------------------------------------------------------
  6. SAFE_RUN() {
  7. local SF_RETURN_VALUE=$($1 2>&1)
  8. if [[ $? != 0 ]]; then
  9. >&2 echo $SF_RETURN_VALUE
  10. exit 1
  11. fi
  12. echo $SF_RETURN_VALUE
  13. }
  14. ERROR_EXIT() {
  15. if [[ $? != 0 ]]; then
  16. echo $($1 2>&1)
  17. exit 1;
  18. fi
  19. }
  20. ERROR_CLANG() {
  21. echo "ERROR: clang++ not found."
  22. echo -e "\nYou could use clang++ from a custom location.\n"
  23. PRINT_USAGE
  24. exit 1
  25. }
  26. PRINT_USAGE() {
  27. echo ""
  28. echo "[ChakraCore Build Script Help]"
  29. echo ""
  30. echo "build.sh [options]"
  31. echo ""
  32. echo "options:"
  33. echo " --arch[=S] Set target arch (arm, x86, amd64)"
  34. echo " --cc=PATH Path to Clang (see example below)"
  35. echo " --cxx=PATH Path to Clang++ (see example below)"
  36. echo " --create-deb[=V] Create .deb package with given V version."
  37. echo " -d, --debug Debug build. Default: Release"
  38. echo " --embed-icu Download and embed ICU-57 statically."
  39. echo " --extra-defines=DEF=VAR,DEFINE,..."
  40. echo " Compile with additional defines"
  41. echo " -h, --help Show help"
  42. echo " --icu=PATH Path to ICU include folder (see example below)"
  43. echo " -j[=N], --jobs[=N] Multicore build, allow N jobs at once."
  44. echo " -n, --ninja Build with ninja instead of make."
  45. echo " --no-icu Compile without unicode/icu support."
  46. echo " --no-jit Disable JIT"
  47. echo " --libs-only Do not build CH and GCStress"
  48. echo " --lto Enables LLVM Full LTO"
  49. echo " --lto-thin Enables LLVM Thin LTO - xcode 8+ or clang 3.9+"
  50. echo " --static Build as static library. Default: shared library"
  51. echo " --sanitize=CHECKS Build with clang -fsanitize checks,"
  52. echo " e.g. undefined,signed-integer-overflow."
  53. echo " -t, --test-build Test build. Enables test flags on a release build."
  54. echo " --target[=S] Target OS (i.e. android)"
  55. echo " --target-path[=S] Output path for compiled binaries. Default: out/"
  56. echo " --trace Enables experimental built-in trace."
  57. echo " --xcode Generate XCode project."
  58. echo " --with-intl Include the Intl object (requires ICU)."
  59. echo " --without=FEATURE,FEATURE,..."
  60. echo " Disable FEATUREs from JSRT experimental features."
  61. echo " --valgrind Enable Valgrind support"
  62. echo " !!! Disables Concurrent GC (lower performance)"
  63. echo " -v, --verbose Display verbose output including all options"
  64. echo " --wb-check CPPFILE"
  65. echo " Write-barrier check given CPPFILE (git path)"
  66. echo " --wb-analyze CPPFILE"
  67. echo " Write-barrier analyze given CPPFILE (git path)"
  68. echo " --wb-args=PLUGIN_ARGS"
  69. echo " Write-barrier clang plugin args"
  70. echo " -y Automatically answer Yes to questions asked by \
  71. script (at your own risk)"
  72. echo ""
  73. echo "example:"
  74. echo " ./build.sh --cxx=/path/to/clang++ --cc=/path/to/clang -j"
  75. echo "with icu:"
  76. echo " ./build.sh --icu=/usr/local/opt/icu4c/include"
  77. echo ""
  78. }
  79. pushd `dirname $0` > /dev/null
  80. CHAKRACORE_DIR=`pwd -P`
  81. popd > /dev/null
  82. _CXX=""
  83. _CC=""
  84. _VERBOSE=""
  85. BUILD_TYPE="Release"
  86. CMAKE_GEN=
  87. EXTRA_DEFINES=""
  88. MAKE=make
  89. MULTICORE_BUILD=""
  90. NO_JIT=
  91. ICU_PATH="-DICU_SETTINGS_RESET=1"
  92. STATIC_LIBRARY="-DSHARED_LIBRARY_SH=1"
  93. SANITIZE=
  94. WITHOUT_FEATURES=""
  95. CREATE_DEB=0
  96. ARCH="-DCC_USES_SYSTEM_ARCH_SH=1"
  97. OS_LINUX=0
  98. OS_APT_GET=0
  99. OS_UNIX=0
  100. LTO=""
  101. TARGET_OS=""
  102. ENABLE_CC_XPLAT_TRACE=""
  103. WB_CHECK=
  104. WB_ANALYZE=
  105. WB_ARGS=
  106. TARGET_PATH=0
  107. VALGRIND=0
  108. # -DCMAKE_EXPORT_COMPILE_COMMANDS=ON useful for clang-query tool
  109. CMAKE_EXPORT_COMPILE_COMMANDS="-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"
  110. LIBS_ONLY_BUILD=
  111. SHOULD_EMBED_ICU=0
  112. ALWAYS_YES=0
  113. UNAME_S=`uname -s`
  114. if [[ $UNAME_S =~ 'Linux' ]]; then
  115. OS_LINUX=1
  116. PROC_INFO=$(which apt-get)
  117. if [[ ${#PROC_INFO} > 0 && -f "$PROC_INFO" ]]; then
  118. OS_APT_GET=1
  119. fi
  120. elif [[ $UNAME_S =~ "Darwin" ]]; then
  121. OS_UNIX=1
  122. else
  123. echo -e "Warning: Installation script couldn't detect host OS..\n" # exit ?
  124. fi
  125. while [[ $# -gt 0 ]]; do
  126. case "$1" in
  127. --arch=*)
  128. ARCH=$1
  129. ARCH="${ARCH:7}"
  130. ;;
  131. --cxx=*)
  132. _CXX=$1
  133. _CXX=${_CXX:6}
  134. ;;
  135. --cc=*)
  136. _CC=$1
  137. _CC=${_CC:5}
  138. ;;
  139. -h | --help)
  140. PRINT_USAGE
  141. exit
  142. ;;
  143. -v | --verbose)
  144. _VERBOSE="VERBOSE=1"
  145. ;;
  146. -d | --debug)
  147. BUILD_TYPE="Debug"
  148. ;;
  149. --embed-icu)
  150. SHOULD_EMBED_ICU=1
  151. ;;
  152. --extra-defines=*)
  153. DEFINES=$1
  154. DEFINES=${DEFINES:16} # value after --extra-defines=
  155. for x in ${DEFINES//,/ } # replace comma with space then split
  156. do
  157. if [[ "$EXTRA_DEFINES" == "" ]]; then
  158. EXTRA_DEFINES="-DEXTRA_DEFINES_SH="
  159. else
  160. EXTRA_DEFINES="$EXTRA_DEFINES;"
  161. fi
  162. EXTRA_DEFINES="${EXTRA_DEFINES}-D${x}"
  163. done
  164. ;;
  165. -t | --test-build)
  166. BUILD_TYPE="Test"
  167. ;;
  168. -j | --jobs)
  169. if [[ "$1" == "-j" && "$2" =~ ^[^-] ]]; then
  170. MULTICORE_BUILD="-j $2"
  171. shift
  172. else
  173. MULTICORE_BUILD="-j $(nproc)"
  174. fi
  175. ;;
  176. -j=* | --jobs=*) # -j=N syntax used in CI
  177. MULTICORE_BUILD=$1
  178. if [[ "$1" =~ ^-j= ]]; then
  179. MULTICORE_BUILD="-j ${MULTICORE_BUILD:3}"
  180. else
  181. MULTICORE_BUILD="-j ${MULTICORE_BUILD:7}"
  182. fi
  183. ;;
  184. --icu=*)
  185. ICU_PATH=$1
  186. # resolve tilde on path
  187. eval ICU_PATH="${ICU_PATH:6}"
  188. if [[ ! -d ${ICU_PATH} ]]; then
  189. if [[ -d "${CHAKRACORE_DIR}/${ICU_PATH}" ]]; then
  190. ICU_PATH="${CHAKRACORE_DIR}/${ICU_PATH}"
  191. else
  192. # if ICU_PATH is given, do not fallback to no-icu
  193. echo "!!! couldn't find ICU at $ICU_PATH"
  194. exit 1
  195. fi
  196. fi
  197. ICU_PATH="-DICU_INCLUDE_PATH_SH=${ICU_PATH}"
  198. ;;
  199. --libs-only)
  200. LIBS_ONLY_BUILD="-DLIBS_ONLY_BUILD_SH=1"
  201. ;;
  202. --lto)
  203. LTO="-DENABLE_FULL_LTO_SH=1"
  204. HAS_LTO=1
  205. ;;
  206. --lto-thin)
  207. LTO="-DENABLE_THIN_LTO_SH=1"
  208. HAS_LTO=1
  209. ;;
  210. -n | --ninja)
  211. CMAKE_GEN="-G Ninja"
  212. MAKE=ninja
  213. ;;
  214. --no-icu)
  215. ICU_PATH="-DNO_ICU_PATH_GIVEN_SH=1"
  216. ;;
  217. --no-jit)
  218. NO_JIT="-DNO_JIT_SH=1"
  219. ;;
  220. --with-intl)
  221. INTL_ICU="-DINTL_ICU_SH=1"
  222. ;;
  223. --xcode)
  224. CMAKE_GEN="-G Xcode -DCC_XCODE_PROJECT=1"
  225. CMAKE_EXPORT_COMPILE_COMMANDS=""
  226. MAKE=0
  227. ;;
  228. --create-deb=*)
  229. CREATE_DEB=$1
  230. CREATE_DEB="${CREATE_DEB:13}"
  231. ;;
  232. --static)
  233. STATIC_LIBRARY="-DSTATIC_LIBRARY_SH=1"
  234. ;;
  235. --sanitize=*)
  236. SANITIZE=$1
  237. SANITIZE=${SANITIZE:11} # value after --sanitize=
  238. SANITIZE="-DCLANG_SANITIZE_SH=${SANITIZE}"
  239. ;;
  240. --target=*)
  241. _TARGET_OS=$1
  242. _TARGET_OS="${_TARGET_OS:9}"
  243. if [[ $_TARGET_OS =~ "android" ]]; then
  244. if [[ -z "$TOOLCHAIN" ]]; then
  245. OLD_PATH=$PATH
  246. export TOOLCHAIN=$PWD/android-toolchain-arm
  247. export PATH=$TOOLCHAIN/bin:$OLD_PATH
  248. export AR=arm-linux-androideabi-ar
  249. export CC=arm-linux-androideabi-clang
  250. export CXX=arm-linux-androideabi-clang++
  251. export LINK=arm-linux-androideabi-clang++
  252. export STRIP=arm-linux-androideabi-strip
  253. # override CXX and CC
  254. _CXX="${TOOLCHAIN}/bin/${CXX}"
  255. _CC="${TOOLCHAIN}/bin/${CC}"
  256. fi
  257. TARGET_OS="-DCC_TARGET_OS_ANDROID_SH=1 -DANDROID_TOOLCHAIN_DIR=${TOOLCHAIN}/arm-linux-androideabi"
  258. # inherit CXX and CC
  259. _CXX="${CXX}"
  260. _CC="${CC}"
  261. fi
  262. ;;
  263. --trace)
  264. ENABLE_CC_XPLAT_TRACE="-DENABLE_CC_XPLAT_TRACE_SH=1"
  265. ;;
  266. --target-path=*)
  267. TARGET_PATH=$1
  268. TARGET_PATH=${TARGET_PATH:14}
  269. ;;
  270. --without=*)
  271. FEATURES=$1
  272. FEATURES=${FEATURES:10} # value after --without=
  273. for x in ${FEATURES//,/ } # replace comma with space then split
  274. do
  275. if [[ "$WITHOUT_FEATURES" == "" ]]; then
  276. WITHOUT_FEATURES="-DWITHOUT_FEATURES_SH="
  277. else
  278. WITHOUT_FEATURES="$WITHOUT_FEATURES;"
  279. fi
  280. WITHOUT_FEATURES="${WITHOUT_FEATURES}-DCOMPILE_DISABLE_${x}=1"
  281. done
  282. ;;
  283. --wb-check)
  284. if [[ "$2" =~ ^[^-] ]]; then
  285. WB_CHECK="$2"
  286. shift
  287. else
  288. WB_CHECK="*" # check all files
  289. fi
  290. ;;
  291. --wb-analyze)
  292. if [[ "$2" =~ ^[^-] ]]; then
  293. WB_ANALYZE="$2"
  294. shift
  295. else
  296. PRINT_USAGE && exit 1
  297. fi
  298. ;;
  299. --wb-args=*)
  300. WB_ARGS=$1
  301. WB_ARGS=${WB_ARGS:10}
  302. WB_ARGS=${WB_ARGS// /;} # replace space with ; to generate a cmake list
  303. ;;
  304. --valgrind)
  305. VALGRIND="-DENABLE_VALGRIND_SH=1"
  306. ;;
  307. -y | -Y)
  308. ALWAYS_YES=1
  309. ;;
  310. *)
  311. echo "Unknown option $1"
  312. PRINT_USAGE
  313. exit -1
  314. ;;
  315. esac
  316. shift
  317. done
  318. if [[ $SHOULD_EMBED_ICU == 1 ]]; then
  319. if [ ! -d "${CHAKRACORE_DIR}/deps/icu/source/output" ]; then
  320. ICU_URL="http://source.icu-project.org/repos/icu/icu/tags/release-57-1"
  321. echo -e "\n----------------------------------------------------------------"
  322. echo -e "\nThis script will download ICU-LIB from\n${ICU_URL}\n"
  323. echo "It is licensed to you by its publisher, not Microsoft."
  324. echo "Microsoft is not responsible for the software."
  325. echo "Your installation and use of ICU-LIB is subject to the publisher's terms available here:"
  326. echo -e "http://www.unicode.org/copyright.html#License\n"
  327. echo -e "----------------------------------------------------------------\n"
  328. echo "If you don't agree, press Ctrl+C to terminate"
  329. WAIT_QUESTION="Hit ENTER to continue (or wait 10 seconds)"
  330. if [[ $ALWAYS_YES == 1 ]]; then
  331. echo "$WAIT_QUESTION : Y"
  332. else
  333. read -t 10 -p "$WAIT_QUESTION"
  334. fi
  335. SAFE_RUN `mkdir -p ${CHAKRACORE_DIR}/deps/`
  336. cd "${CHAKRACORE_DIR}/deps/";
  337. ABS_DIR=`pwd`
  338. if [ ! -d "${ABS_DIR}/icu/" ]; then
  339. echo "Downloading ICU ${ICU_URL}"
  340. if [ ! -f "/usr/bin/svn" ]; then
  341. echo -e "\nYou should install 'svn' client in order to use this feature"
  342. if [ $OS_APT_GET == 1 ]; then
  343. echo "tip: Try 'sudo apt-get install subversion'"
  344. fi
  345. exit 1
  346. fi
  347. svn export -q $ICU_URL icu
  348. ERROR_EXIT "rm -rf ${ABS_DIR}/icu/"
  349. fi
  350. cd "${ABS_DIR}/icu/source";./configure --with-data-packaging=static\
  351. --prefix="${ABS_DIR}/icu/source/output/"\
  352. --enable-static --disable-shared --with-library-bits=64\
  353. --disable-icuio --disable-layout\
  354. CXXFLAGS="-fPIC" CFLAGS="-fPIC"
  355. ERROR_EXIT "rm -rf ${ABS_DIR}/icu/source/output/"
  356. make STATICCFLAGS="-fPIC" STATICCXXFLAGS="-fPIC" STATICCPPFLAGS="-DPIC" install
  357. ERROR_EXIT "rm -rf ${ABS_DIR}/icu/source/output/"
  358. cd "${ABS_DIR}/../"
  359. fi
  360. ICU_PATH="-DCC_EMBED_ICU_SH=1"
  361. fi
  362. if [[ ${#_VERBOSE} > 0 ]]; then
  363. # echo options back to the user
  364. echo "Printing command line options back to the user:"
  365. echo "_CXX=${_CXX}"
  366. echo "_CC=${_CC}"
  367. echo "BUILD_TYPE=${BUILD_TYPE}"
  368. echo "MULTICORE_BUILD=${MULTICORE_BUILD}"
  369. echo "ICU_PATH=${ICU_PATH}"
  370. echo "CMAKE_GEN=${CMAKE_GEN}"
  371. echo "MAKE=${MAKE} $_VERBOSE"
  372. echo ""
  373. fi
  374. # if LTO build is enabled and cc-toolchain/clang was compiled, use it instead
  375. if [[ $HAS_LTO == 1 ]]; then
  376. if [[ -f "${CHAKRACORE_DIR}/cc-toolchain/build/bin/clang++" ]]; then
  377. SELF=`pwd`
  378. _CXX="$CHAKRACORE_DIR/cc-toolchain/build/bin/clang++"
  379. _CC="$CHAKRACORE_DIR/cc-toolchain/build/bin/clang"
  380. else
  381. # Linux LD possibly doesn't support LLVM LTO, check.. and compile clang if not
  382. if [[ $OS_LINUX == 1 ]]; then
  383. if [[ ! `ld -v` =~ 'GNU gold' ]]; then
  384. pushd "$CHAKRACORE_DIR" > /dev/null
  385. $CHAKRACORE_DIR/tools/compile_clang.sh
  386. if [[ $? != 0 ]]; then
  387. echo -e "tools/compile_clang.sh has failed.\n"
  388. echo "Try with 'sudo' ?"
  389. popd > /dev/null
  390. exit 1
  391. fi
  392. _CXX="$CHAKRACORE_DIR/cc-toolchain/build/bin/clang++"
  393. _CC="$CHAKRACORE_DIR/cc-toolchain/build/bin/clang"
  394. popd > /dev/null
  395. fi
  396. fi
  397. fi
  398. fi
  399. if [ "${HAS_LTO}${OS_LINUX}" == "11" ]; then
  400. echo "lto: ranlib disabled"
  401. export RANLIB=/bin/true
  402. fi
  403. CLANG_PATH=
  404. if [[ ${#_CXX} > 0 || ${#_CC} > 0 ]]; then
  405. if [[ ${#_CXX} == 0 || ${#_CC} == 0 ]]; then
  406. echo "ERROR: '-cxx' and '-cc' options must be used together."
  407. exit 1
  408. fi
  409. echo "Custom CXX ${_CXX}"
  410. echo "Custom CC ${_CC}"
  411. if [[ ! -f $_CXX || ! -f $_CC ]]; then
  412. echo "ERROR: Custom compiler not found on given path"
  413. exit 1
  414. fi
  415. CLANG_PATH=$_CXX
  416. else
  417. RET_VAL=$(SAFE_RUN 'c++ --version')
  418. if [[ ! $RET_VAL =~ "clang" ]]; then
  419. echo "Searching for Clang..."
  420. if [[ -f /usr/bin/clang++ ]]; then
  421. echo "Clang++ found at /usr/bin/clang++"
  422. _CXX=/usr/bin/clang++
  423. _CC=/usr/bin/clang
  424. CLANG_PATH=$_CXX
  425. else
  426. # try env CXX and CC
  427. if [[ ! -f $CXX || ! -f $CC ]]; then
  428. ERROR_CLANG
  429. fi
  430. _CXX=$CXX
  431. _CC=$CC
  432. CLANG_PATH=$CXX
  433. VERSION=$($CXX --version)
  434. if [[ ! $VERSION =~ "clang" ]]; then
  435. ERROR_CLANG
  436. fi
  437. echo -e "Clang++ not found on PATH.\nTrying CCX -> ${CCX} and CC -> ${CC}"
  438. fi
  439. else
  440. CLANG_PATH=c++
  441. fi
  442. fi
  443. # check clang version (min required 3.7)
  444. VERSION=$($CLANG_PATH --version | grep "version [0-9]*\.[0-9]*" --o -i | grep "[0-9]\.[0-9]*" --o)
  445. VERSION=${VERSION/./}
  446. if [[ $VERSION -lt 37 ]]; then
  447. echo "ERROR: Minimum required Clang version is 3.7"
  448. exit 1
  449. fi
  450. CC_PREFIX=""
  451. if [[ ${#_CXX} > 0 ]]; then
  452. CC_PREFIX="-DCMAKE_CXX_COMPILER=$_CXX -DCMAKE_C_COMPILER=$_CC"
  453. fi
  454. RELATIVE_BUILD_PATH="../.."
  455. if [[ $TARGET_PATH == 0 ]]; then
  456. TARGET_PATH="$CHAKRACORE_DIR/out"
  457. else
  458. if [[ $TARGET_PATH =~ "~/" ]]; then
  459. echo "Do not use '~/' for '--target-path'"
  460. echo -e "\nAborting Build."
  461. exit 1
  462. fi
  463. fi
  464. BUILD_DIRECTORY="${TARGET_PATH}/${BUILD_TYPE:0}"
  465. echo "Build path: ${BUILD_DIRECTORY}"
  466. BUILD_RELATIVE_DIRECTORY=$(python -c "import os.path;print \
  467. os.path.relpath('${CHAKRACORE_DIR}', '$BUILD_DIRECTORY')")
  468. ################# Write-barrier check/analyze run #################
  469. WB_FLAG=
  470. WB_TARGET=
  471. if [[ $WB_CHECK || $WB_ANALYZE ]]; then
  472. # build software write barrier checker clang plugin
  473. $CHAKRACORE_DIR/tools/RecyclerChecker/build.sh --cxx=$_CXX || exit 1
  474. if [[ $WB_CHECK && $WB_ANALYZE ]]; then
  475. echo "Please run only one of --wb-check or --wb-analyze" && exit 1
  476. fi
  477. if [[ $WB_CHECK ]]; then
  478. WB_FLAG="-DWB_CHECK_SH=1"
  479. WB_FILE=$WB_CHECK
  480. fi
  481. if [[ $WB_ANALYZE ]]; then
  482. WB_FLAG="-DWB_ANALYZE_SH=1"
  483. WB_FILE=$WB_ANALYZE
  484. fi
  485. if [[ $WB_ARGS ]]; then
  486. if [[ $WB_ARGS =~ "-fix" ]]; then
  487. MULTICORE_BUILD="-j 1" # 1 job only if doing write barrier fix
  488. fi
  489. WB_ARGS="-DWB_ARGS_SH=$WB_ARGS"
  490. fi
  491. # support --wb-check ONE_CPP_FILE
  492. if [[ $WB_FILE != "*" ]]; then
  493. if [[ $MAKE != 'ninja' ]]; then
  494. echo "--wb-check/wb-analyze ONE_FILE only works with --ninja" && exit 1
  495. fi
  496. if [[ -f $CHAKRACORE_DIR/$WB_FILE ]]; then
  497. touch $CHAKRACORE_DIR/$WB_FILE
  498. else
  499. echo "$CHAKRACORE_DIR/$WB_FILE not found. Please use full git path for $WB_FILE." && exit 1
  500. fi
  501. WB_FILE_DIR=`dirname $WB_FILE`
  502. WB_FILE_BASE=`basename $WB_FILE`
  503. WB_FILE_CMAKELISTS="$CHAKRACORE_DIR/$WB_FILE_DIR/CMakeLists.txt"
  504. if [[ -f $WB_FILE_CMAKELISTS ]]; then
  505. SUBDIR=$(grep -i add_library $WB_FILE_CMAKELISTS | sed "s/.*(\([^ ]*\) .*/\1/")
  506. else
  507. echo "$WB_FILE_CMAKELISTS not found." && exit 1
  508. fi
  509. WB_TARGET="$WB_FILE_DIR/CMakeFiles/$SUBDIR.dir/$WB_FILE_BASE.o"
  510. fi
  511. fi
  512. # prepare DbgController.js.h
  513. CH_DIR="${CHAKRACORE_DIR}/bin/ch"
  514. "${CH_DIR}/jstoc.py" "${CH_DIR}/DbgController.js" controllerScript
  515. if [[ $? != 0 ]]; then
  516. exit 1
  517. fi
  518. if [ ! -d "$BUILD_DIRECTORY" ]; then
  519. SAFE_RUN `mkdir -p $BUILD_DIRECTORY`
  520. fi
  521. pushd $BUILD_DIRECTORY > /dev/null
  522. if [[ $ARCH =~ "x86" ]]; then
  523. ARCH="-DCC_TARGETS_X86_SH=1"
  524. echo "Compile Target : x86"
  525. elif [[ $ARCH =~ "arm" ]]; then
  526. ARCH="-DCC_TARGETS_ARM_SH=1"
  527. echo "Compile Target : arm"
  528. elif [[ $ARCH =~ "amd64" ]]; then
  529. ARCH="-DCC_TARGETS_AMD64_SH=1"
  530. echo "Compile Target : amd64"
  531. else
  532. echo "Compile Target : System Default"
  533. fi
  534. echo Generating $BUILD_TYPE makefiles
  535. echo $EXTRA_DEFINES
  536. cmake $CMAKE_GEN $CC_PREFIX $ICU_PATH $LTO $STATIC_LIBRARY $ARCH $TARGET_OS \
  537. $ENABLE_CC_XPLAT_TRACE $EXTRA_DEFINES -DCMAKE_BUILD_TYPE=$BUILD_TYPE $SANITIZE $NO_JIT $INTL_ICU \
  538. $WITHOUT_FEATURES $WB_FLAG $WB_ARGS $CMAKE_EXPORT_COMPILE_COMMANDS $LIBS_ONLY_BUILD\
  539. $VALGRIND $BUILD_RELATIVE_DIRECTORY
  540. _RET=$?
  541. if [[ $? == 0 ]]; then
  542. if [[ $MAKE != 0 ]]; then
  543. if [[ $MAKE != 'ninja' ]]; then
  544. # $MFLAGS comes from host `make` process. Sub `make` process needs this (recursional make runs)
  545. TEST_MFLAGS="${MFLAGS}*!"
  546. if [[ $TEST_MFLAGS != "*!" ]]; then
  547. # Get -j flag from the host
  548. MULTICORE_BUILD=""
  549. fi
  550. $MAKE $MFLAGS $MULTICORE_BUILD $_VERBOSE $WB_TARGET 2>&1 | tee build.log
  551. else
  552. $MAKE $MULTICORE_BUILD $_VERBOSE $WB_TARGET 2>&1 | tee build.log
  553. fi
  554. _RET=${PIPESTATUS[0]}
  555. else
  556. echo "Visit given folder above for xcode project file ----^"
  557. fi
  558. fi
  559. if [[ $_RET != 0 ]]; then
  560. echo "See error details above. Exit code was $_RET"
  561. else
  562. if [[ $CREATE_DEB != 0 ]]; then
  563. DEB_FOLDER=`realpath .`
  564. DEB_FOLDER="${DEB_FOLDER}/chakracore_${CREATE_DEB}"
  565. mkdir -p $DEB_FOLDER/usr/local/bin
  566. mkdir -p $DEB_FOLDER/DEBIAN
  567. cp $DEB_FOLDER/../ch $DEB_FOLDER/usr/local/bin/
  568. if [[ $STATIC_LIBRARY == "-DSHARED_LIBRARY_SH=1" ]]; then
  569. cp $DEB_FOLDER/../*.so $DEB_FOLDER/usr/local/bin/
  570. fi
  571. echo -e "Package: ChakraCore"\
  572. "\nVersion: ${CREATE_DEB}"\
  573. "\nSection: base"\
  574. "\nPriority: optional"\
  575. "\nArchitecture: amd64"\
  576. "\nDepends: libc6 (>= 2.19), uuid-dev (>> 0), libicu-dev (>> 0)"\
  577. "\nMaintainer: ChakraCore <[email protected]>"\
  578. "\nDescription: Chakra Core"\
  579. "\n Open source Core of Chakra Javascript Engine"\
  580. > $DEB_FOLDER/DEBIAN/control
  581. dpkg-deb --build $DEB_FOLDER
  582. _RET=$?
  583. if [[ $_RET == 0 ]]; then
  584. echo ".deb package is available under $BUILD_DIRECTORY"
  585. fi
  586. fi
  587. fi
  588. popd > /dev/null
  589. exit $_RET