build.sh 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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. PRINT_USAGE() {
  15. echo ""
  16. echo "[ChakraCore Build Script Help]"
  17. echo ""
  18. echo "build.sh [options]"
  19. echo ""
  20. echo "options:"
  21. echo " --cxx=PATH Path to Clang++ (see example below)"
  22. echo " --cc=PATH Path to Clang (see example below)"
  23. echo " -d, --debug Debug build (by default Release build)"
  24. echo " -h, --help Show help"
  25. echo " --icu=PATH Path to ICU include folder (see example below)"
  26. echo " -j [N], --jobs[=N] Multicore build, allow N jobs at once"
  27. echo " -n, --ninja Build with ninja instead of make"
  28. echo " --xcode Generate XCode project"
  29. echo " -t, --test-build Test build (by default Release build)"
  30. echo " --static Build as static library (by default shared library)"
  31. echo " -v, --verbose Display verbose output including all options"
  32. echo " --create-deb=V Create .deb package with given V version"
  33. echo " --without=FEATURE,FEATURE,..."
  34. echo " Disable FEATUREs from JSRT experimental"
  35. echo " features."
  36. echo ""
  37. echo "example:"
  38. echo " ./build.sh --cxx=/path/to/clang++ --cc=/path/to/clang -j"
  39. echo "with icu:"
  40. echo " ./build.sh --icu=/usr/local/Cellar/icu4c/version/include/"
  41. echo ""
  42. }
  43. CHAKRACORE_DIR=`dirname $0`
  44. _CXX=""
  45. _CC=""
  46. VERBOSE=""
  47. BUILD_TYPE="Release"
  48. CMAKE_GEN=
  49. MAKE=make
  50. MULTICORE_BUILD=""
  51. ICU_PATH=""
  52. STATIC_LIBRARY=""
  53. WITHOUT_FEATURES=""
  54. CREATE_DEB=0
  55. while [[ $# -gt 0 ]]; do
  56. case "$1" in
  57. --cxx=*)
  58. _CXX=$1
  59. _CXX=${_CXX:6}
  60. ;;
  61. --cc=*)
  62. _CC=$1
  63. _CC=${_CC:5}
  64. ;;
  65. -h | --help)
  66. PRINT_USAGE
  67. exit
  68. ;;
  69. -v | --verbose)
  70. _VERBOSE="verbose"
  71. ;;
  72. -d | --debug)
  73. BUILD_TYPE="Debug"
  74. ;;
  75. -t | --test-build)
  76. BUILD_TYPE="Test"
  77. ;;
  78. -j | --jobs)
  79. if [[ "$1" == "-j" && "$2" =~ ^[^-] ]]; then
  80. MULTICORE_BUILD="-j $2"
  81. shift
  82. else
  83. MULTICORE_BUILD="-j $(nproc)"
  84. fi
  85. ;;
  86. -j=* | --jobs=*) # -j=N syntax used in CI
  87. MULTICORE_BUILD=$1
  88. if [[ "$1" =~ ^-j= ]]; then
  89. MULTICORE_BUILD="-j ${MULTICORE_BUILD:3}"
  90. else
  91. MULTICORE_BUILD="-j ${MULTICORE_BUILD:7}"
  92. fi
  93. ;;
  94. --icu=*)
  95. ICU_PATH=$1
  96. ICU_PATH="-DICU_INCLUDE_PATH=${ICU_PATH:6}"
  97. ;;
  98. -n | --ninja)
  99. CMAKE_GEN="-G Ninja"
  100. MAKE=ninja
  101. ;;
  102. --xcode)
  103. CMAKE_GEN="-G Xcode -DCC_XCODE_PROJECT=1"
  104. MAKE=0
  105. ;;
  106. --create-deb=*)
  107. CREATE_DEB=$1
  108. CREATE_DEB="${CREATE_DEB:13}"
  109. ;;
  110. --static)
  111. STATIC_LIBRARY="-DSTATIC_LIBRARY=1"
  112. ;;
  113. --without=*)
  114. FEATURES=$1
  115. FEATURES=${FEATURES:10} # value after --without=
  116. for x in ${FEATURES//,/ } # replace comma with space then split
  117. do
  118. if [[ "$WITHOUT_FEATURES" == "" ]]; then
  119. WITHOUT_FEATURES="-DWITHOUT_FEATURES="
  120. else
  121. WITHOUT_FEATURES="$WITHOUT_FEATURES;"
  122. fi
  123. WITHOUT_FEATURES="${WITHOUT_FEATURES}-DCOMPILE_DISABLE_${x}=1"
  124. done
  125. ;;
  126. *)
  127. echo "Unknown option $1"
  128. PRINT_USAGE
  129. exit -1
  130. ;;
  131. esac
  132. shift
  133. done
  134. if [[ ${#_VERBOSE} > 0 ]]; then
  135. # echo options back to the user
  136. echo "Printing command line options back to the user:"
  137. echo "_CXX=${_CXX}"
  138. echo "_CC=${_CC}"
  139. echo "BUILD_TYPE=${BUILD_TYPE}"
  140. echo "MULTICORE_BUILD=${MULTICORE_BUILD}"
  141. echo "ICU_PATH=${ICU_PATH}"
  142. echo "CMAKE_GEN=${CMAKE_GEN}"
  143. echo "MAKE=${MAKE}"
  144. echo ""
  145. fi
  146. CLANG_PATH=
  147. if [[ ${#_CXX} > 0 || ${#_CC} > 0 ]]; then
  148. if [[ ${#_CXX} == 0 || ${#_CC} == 0 ]]; then
  149. echo "ERROR: '-cxx' and '-cc' options must be used together."
  150. exit 1
  151. fi
  152. echo "Custom CXX ${_CXX}"
  153. echo "Custom CC ${_CC}"
  154. if [[ ! -f $_CXX || ! -f $_CC ]]; then
  155. echo "ERROR: Custom compiler not found on given path"
  156. exit 1
  157. fi
  158. CLANG_PATH=$_CXX
  159. else
  160. RET_VAL=$(SAFE_RUN 'c++ --version')
  161. if [[ ! $RET_VAL =~ "clang" ]]; then
  162. echo "Searching for Clang..."
  163. if [[ -f /usr/bin/clang++ ]]; then
  164. echo "Clang++ found at /usr/bin/clang++"
  165. _CXX=/usr/bin/clang++
  166. _CC=/usr/bin/clang
  167. CLANG_PATH=$_CXX
  168. else
  169. echo "ERROR: clang++ not found at /usr/bin/clang++"
  170. echo ""
  171. echo "You could use clang++ from a custom location."
  172. PRINT_USAGE
  173. exit 1
  174. fi
  175. else
  176. CLANG_PATH=c++
  177. fi
  178. fi
  179. # check clang version (min required 3.7)
  180. VERSION=$($CLANG_PATH --version | grep "version [0-9]*\.[0-9]*" --o -i | grep "[0-9]\.[0-9]*" --o)
  181. VERSION=${VERSION/./}
  182. if [[ $VERSION -lt 37 ]]; then
  183. echo "ERROR: Minimum required Clang version is 3.7"
  184. exit 1
  185. fi
  186. CC_PREFIX=""
  187. if [[ ${#_CXX} > 0 ]]; then
  188. CC_PREFIX="-DCMAKE_CXX_COMPILER=$_CXX -DCMAKE_C_COMPILER=$_CC"
  189. fi
  190. build_directory="$CHAKRACORE_DIR/BuildLinux/${BUILD_TYPE:0}"
  191. if [ ! -d "$build_directory" ]; then
  192. SAFE_RUN `mkdir -p $build_directory`
  193. fi
  194. pushd $build_directory > /dev/null
  195. echo Generating $BUILD_TYPE makefiles
  196. cmake $CMAKE_GEN $CC_PREFIX $ICU_PATH $STATIC_LIBRARY -DCMAKE_BUILD_TYPE=$BUILD_TYPE $WITHOUT_FEATURES ../..
  197. _RET=$?
  198. if [[ $? == 0 ]]; then
  199. if [[ $MAKE != 0 ]]; then
  200. $MAKE $MULTICORE_BUILD 2>&1 | tee build.log
  201. _RET=${PIPESTATUS[0]}
  202. else
  203. echo "Visit given folder above for xcode project file ----^"
  204. fi
  205. fi
  206. if [[ $_RET != 0 ]]; then
  207. echo "See error details above. Exit code was $_RET"
  208. else
  209. if [[ $CREATE_DEB != 0 ]]; then
  210. DEB_FOLDER=`realpath .`
  211. DEB_FOLDER="${DEB_FOLDER}/chakracore_${CREATE_DEB}"
  212. mkdir -p $DEB_FOLDER/usr/local/bin
  213. mkdir -p $DEB_FOLDER/DEBIAN
  214. cp $DEB_FOLDER/../ch $DEB_FOLDER/usr/local/bin/
  215. if [[ $STATIC_LIBRARY == "" ]]; then
  216. cp $DEB_FOLDER/../*.so $DEB_FOLDER/usr/local/bin/
  217. fi
  218. echo -e "Package: ChakraCore"\
  219. "\nVersion: ${CREATE_DEB}"\
  220. "\nSection: base"\
  221. "\nPriority: optional"\
  222. "\nArchitecture: amd64"\
  223. "\nDepends: libc6 (>= 2.19), uuid-dev (>> 0), libunwind-dev (>> 0), libicu-dev (>> 0)"\
  224. "\nMaintainer: ChakraCore <[email protected]>"\
  225. "\nDescription: Chakra Core"\
  226. "\n Open source Core of Chakra Javascript Engine"\
  227. > $DEB_FOLDER/DEBIAN/control
  228. dpkg-deb --build $DEB_FOLDER
  229. _RET=$?
  230. if [[ $_RET == 0 ]]; then
  231. echo ".deb package is available under $build_directory"
  232. fi
  233. fi
  234. fi
  235. popd > /dev/null
  236. exit $_RET