2
0

build.sh 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #-------------------------------------------------------------------------------------------------------
  2. # Copyright (C) Microsoft. All rights reserved.
  3. # Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. #-------------------------------------------------------------------------------------------------------
  5. SAFE_RUN() {
  6. local SF_RETURN_VALUE=$($1 2>&1)
  7. if [[ $? != 0 ]]; then
  8. >&2 echo $SF_RETURN_VALUE
  9. exit 1
  10. fi
  11. echo $SF_RETURN_VALUE
  12. }
  13. PRINT_USAGE() {
  14. echo ""
  15. echo "[ChakraCore Build Script Help]"
  16. echo ""
  17. echo "build.sh [options]"
  18. echo ""
  19. echo "options:"
  20. echo " --cxx=PATH Path to Clang++ (see example below)"
  21. echo " --cc=PATH Path to Clang (see example below)"
  22. echo " -d, --debug Debug build (by default Release build)"
  23. echo " -h, --help Show help"
  24. echo " --icu=PATH Path to ICU include folder (see example below)"
  25. echo " -j [N], --jobs[=N] Multicore build, allow N jobs at once"
  26. echo " -n, --ninja Build with ninja instead of make"
  27. echo " --xcode Generate XCode project"
  28. echo " -t, --test-build Test build (by default Release build)"
  29. echo " --static Build as static library (by default shared library)"
  30. echo " -v, --verbose Display verbose output including all options"
  31. echo ""
  32. echo "example:"
  33. echo " ./build.sh --cxx=/path/to/clang++ --cc=/path/to/clang -j"
  34. echo "with icu:"
  35. echo " ./build.sh --icu=/usr/local/Cellar/icu4c/version/include/"
  36. echo ""
  37. }
  38. CHAKRACORE_DIR=`dirname $0`
  39. _CXX=""
  40. _CC=""
  41. VERBOSE=""
  42. BUILD_TYPE="Release"
  43. CMAKE_GEN=
  44. MAKE=make
  45. MULTICORE_BUILD=""
  46. ICU_PATH=""
  47. STATIC_LIBRARY=""
  48. while [[ $# -gt 0 ]]; do
  49. case "$1" in
  50. --cxx=*)
  51. _CXX=$1
  52. _CXX=${_CXX:6}
  53. ;;
  54. --cc=*)
  55. _CC=$1
  56. _CC=${_CC:5}
  57. ;;
  58. -h | --help)
  59. PRINT_USAGE
  60. exit
  61. ;;
  62. -v | --verbose)
  63. _VERBOSE="verbose"
  64. ;;
  65. -d | --debug)
  66. BUILD_TYPE="Debug"
  67. ;;
  68. -t | --test-build)
  69. BUILD_TYPE="Test"
  70. ;;
  71. -j | --jobs)
  72. if [[ "$1" == "-j" && "$2" =~ ^[^-] ]]; then
  73. MULTICORE_BUILD="-j $2"
  74. shift
  75. else
  76. MULTICORE_BUILD="-j $(nproc)"
  77. fi
  78. ;;
  79. -j=* | --jobs=*) # -j=N syntax used in CI
  80. MULTICORE_BUILD=$1
  81. if [[ "$1" =~ ^-j= ]]; then
  82. MULTICORE_BUILD="-j ${MULTICORE_BUILD:3}"
  83. else
  84. MULTICORE_BUILD="-j ${MULTICORE_BUILD:7}"
  85. fi
  86. ;;
  87. --icu=*)
  88. ICU_PATH=$1
  89. ICU_PATH="-DICU_INCLUDE_PATH=${ICU_PATH:6}"
  90. ;;
  91. -n | --ninja)
  92. CMAKE_GEN="-G Ninja"
  93. MAKE=ninja
  94. ;;
  95. --xcode)
  96. CMAKE_GEN="-G Xcode -DCC_XCODE_PROJECT=1"
  97. MAKE=0
  98. ;;
  99. --static)
  100. STATIC_LIBRARY="-DSTATIC_LIBRARY=1"
  101. ;;
  102. *)
  103. echo "Unknown option $1"
  104. PRINT_USAGE
  105. exit -1
  106. ;;
  107. esac
  108. shift
  109. done
  110. if [[ ${#_VERBOSE} > 0 ]]; then
  111. # echo options back to the user
  112. echo "Printing command line options back to the user:"
  113. echo "_CXX=${_CXX}"
  114. echo "_CC=${_CC}"
  115. echo "BUILD_TYPE=${BUILD_TYPE}"
  116. echo "MULTICORE_BUILD=${MULTICORE_BUILD}"
  117. echo "ICU_PATH=${ICU_PATH}"
  118. echo "CMAKE_GEN=${CMAKE_GEN}"
  119. echo "MAKE=${MAKE}"
  120. echo ""
  121. fi
  122. CLANG_PATH=
  123. if [[ ${#_CXX} > 0 || ${#_CC} > 0 ]]; then
  124. if [[ ${#_CXX} == 0 || ${#_CC} == 0 ]]; then
  125. echo "ERROR: '-cxx' and '-cc' options must be used together."
  126. exit 1
  127. fi
  128. echo "Custom CXX ${_CXX}"
  129. echo "Custom CC ${_CC}"
  130. if [[ ! -f $_CXX || ! -f $_CC ]]; then
  131. echo "ERROR: Custom compiler not found on given path"
  132. exit 1
  133. fi
  134. CLANG_PATH=$_CXX
  135. else
  136. RET_VAL=$(SAFE_RUN 'c++ --version')
  137. if [[ ! $RET_VAL =~ "clang" ]]; then
  138. echo "Searching for Clang..."
  139. if [[ -f /usr/bin/clang++ ]]; then
  140. echo "Clang++ found at /usr/bin/clang++"
  141. _CXX=/usr/bin/clang++
  142. _CC=/usr/bin/clang
  143. CLANG_PATH=$_CXX
  144. else
  145. echo "ERROR: clang++ not found at /usr/bin/clang++"
  146. echo ""
  147. echo "You could use clang++ from a custom location."
  148. PRINT_USAGE
  149. exit 1
  150. fi
  151. else
  152. CLANG_PATH=c++
  153. fi
  154. fi
  155. # check clang version (min required 3.7)
  156. VERSION=$($CLANG_PATH --version | grep "version [0-9]*\.[0-9]*" --o -i | grep "[0-9]\.[0-9]*" --o)
  157. VERSION=${VERSION/./}
  158. if [[ $VERSION -lt 37 ]]; then
  159. echo "ERROR: Minimum required Clang version is 3.7"
  160. exit 1
  161. fi
  162. CC_PREFIX=""
  163. if [[ ${#_CXX} > 0 ]]; then
  164. CC_PREFIX="-DCMAKE_CXX_COMPILER=$_CXX -DCMAKE_C_COMPILER=$_CC"
  165. fi
  166. build_directory="$CHAKRACORE_DIR/BuildLinux/${BUILD_TYPE:0}"
  167. if [ ! -d "$build_directory" ]; then
  168. SAFE_RUN `mkdir -p $build_directory`
  169. fi
  170. pushd $build_directory > /dev/null
  171. echo Generating $BUILD_TYPE makefiles
  172. cmake $CMAKE_GEN $CC_PREFIX $ICU_PATH $STATIC_LIBRARY -DCMAKE_BUILD_TYPE=$BUILD_TYPE ../..
  173. _RET=$?
  174. if [[ $? == 0 ]]; then
  175. if [[ $MAKE != 0 ]]; then
  176. $MAKE $MULTICORE_BUILD 2>&1 | tee build.log
  177. _RET=${PIPESTATUS[0]}
  178. else
  179. echo "Visit given folder above for xcode project file ----^"
  180. fi
  181. fi
  182. if [[ $_RET != 0 ]]; then
  183. echo "See error details above. Exit code was $_RET"
  184. fi
  185. popd > /dev/null
  186. exit $_RET