build_env.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #!/bin/bash
  2. ############################################################################
  3. #
  4. # Title: Build Environment Script for macOS
  5. # Authors: CR Oldham, Shane Lee
  6. # Date: December 2015
  7. #
  8. # Description: This script sets up a build environment for Salt on macOS.
  9. #
  10. # Requirements:
  11. # - Xcode Command Line Tools (xcode-select --install)
  12. #
  13. # Usage:
  14. # This script can be passed 1 parameter
  15. # $1 : <test mode> : if this script should be run in test mode, this
  16. # disables the longer optimized compile time of python.
  17. # Please DO NOT set to "true" when building a
  18. # release version.
  19. # (defaults to false)
  20. #
  21. # Example:
  22. # The following will set up an optimized Python build environment for Salt
  23. # on macOS
  24. #
  25. # ./dev_env.sh
  26. #
  27. ############################################################################
  28. ############################################################################
  29. # Make sure the script is launched with sudo
  30. ############################################################################
  31. if [[ $(id -u) -ne 0 ]]
  32. then
  33. exec sudo /bin/bash -c "$(printf '%q ' "$BASH_SOURCE" "$@")"
  34. fi
  35. ############################################################################
  36. # Set to Exit on all Errors
  37. ############################################################################
  38. trap 'quit_on_error $LINENO $BASH_COMMAND' ERR
  39. quit_on_error() {
  40. echo "$(basename $0) caught error on line : $1 command was: $2"
  41. exit -1
  42. }
  43. ############################################################################
  44. # Parameters Required for the script to function properly
  45. ############################################################################
  46. echo -n -e "\033]0;Build_Env: Variables\007"
  47. MACOSX_DEPLOYMENT_TARGET=10.13
  48. export MACOSX_DEPLOYMENT_TARGET
  49. # This is needed to allow the some test suites (zmq) to pass
  50. # taken from https://github.com/zeromq/libzmq/issues/1878
  51. SET_ULIMIT=200000
  52. sysctl -w kern.maxfiles=$SET_ULIMIT
  53. sysctl -w kern.maxfilesperproc=$SET_ULIMIT
  54. launchctl limit maxfiles $SET_ULIMIT $SET_ULIMIT
  55. ulimit -n $SET_ULIMIT
  56. PY_VERSION=3.7
  57. SRCDIR=`git rev-parse --show-toplevel`
  58. SCRIPTDIR=`pwd`
  59. SHADIR=$SCRIPTDIR/shasums
  60. INSTALL_DIR=/opt/salt
  61. PKG_CONFIG=$INSTALL_DIR/bin/pkg-config
  62. PKG_CONFIG_PATH=$INSTALL_DIR/lib/pkgconfig
  63. PYDIR=$INSTALL_DIR/lib/python$PY_VERSION
  64. PYTHON=$INSTALL_DIR/bin/python3
  65. PIP=$INSTALL_DIR/bin/pip3
  66. # needed for python to find pkg-config and have pkg-config properly link
  67. # the python install to the compiled openssl below.
  68. export PKG_CONFIG
  69. export PKG_CONFIG_PATH
  70. ############################################################################
  71. # Determine Which XCode is being used (XCode or XCode Command Line Tools)
  72. ############################################################################
  73. # Prefer Xcode command line tools over any other gcc installed (e.g. MacPorts,
  74. # Fink, Brew)
  75. # Check for Xcode Command Line Tools first
  76. if [ -d '/Library/Developer/CommandLineTools/usr/bin' ]; then
  77. MAKE=/Library/Developer/CommandLineTools/usr/bin/make
  78. elif [ -d '/Applications/Xcode.app/Contents/Developer/usr/bin' ]; then
  79. MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make
  80. else
  81. echo "No installation of XCode found. This script requires XCode."
  82. echo "Try running: xcode-select --install"
  83. exit -1
  84. fi
  85. ############################################################################
  86. # Download Function
  87. # - Downloads and verifies the MD5
  88. ############################################################################
  89. download(){
  90. if [ -z "$1" ]; then
  91. echo "Must pass a URL to the download function"
  92. fi
  93. URL=$1
  94. PKGNAME=${URL##*/}
  95. cd $BUILDDIR
  96. echo "################################################################################"
  97. echo "Retrieving $PKGNAME"
  98. echo "################################################################################"
  99. curl -LO# $URL
  100. echo "################################################################################"
  101. echo "Comparing Sha512 Hash"
  102. echo "################################################################################"
  103. FILESHA=($(shasum -a 512 $PKGNAME))
  104. EXPECTEDSHA=($(cat $SHADIR/$PKGNAME.sha512))
  105. if [ "$FILESHA" != "$EXPECTEDSHA" ]; then
  106. echo "ERROR: Sha Check Failed for $PKGNAME"
  107. return 1
  108. fi
  109. echo "################################################################################"
  110. echo "Unpacking $PKGNAME"
  111. echo "################################################################################"
  112. tar -zxvf $PKGNAME
  113. return $?
  114. }
  115. ############################################################################
  116. # Ensure Paths are present and clean
  117. ############################################################################
  118. echo "################################################################################"
  119. echo "Ensure Paths are present and clean"
  120. echo "################################################################################"
  121. echo -n -e "\033]0;Build_Env: Clean\007"
  122. # Make sure $INSTALL_DIR is clean
  123. rm -rf $INSTALL_DIR
  124. mkdir -p $INSTALL_DIR
  125. chown $USER:staff $INSTALL_DIR
  126. # Make sure build staging is clean
  127. rm -rf build
  128. mkdir -p build
  129. BUILDDIR=$SCRIPTDIR/build
  130. ############################################################################
  131. # Download and install pkg-config
  132. ############################################################################
  133. echo -n -e "\033]0;Build_Env: pkg-config: download\007"
  134. PKGURL="http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz"
  135. PKGDIR="pkg-config-0.29.2"
  136. download $PKGURL
  137. echo "################################################################################"
  138. echo "Building pkg-config"
  139. echo "################################################################################"
  140. cd $PKGDIR
  141. echo -n -e "\033]0;Build_Env: pkg-config: configure\007"
  142. env LDFLAGS="-framework CoreFoundation -framework Carbon" ./configure --prefix=$INSTALL_DIR --with-internal-glib
  143. echo -n -e "\033]0;Build_Env: pkg-config: make\007"
  144. $MAKE
  145. echo -n -e "\033]0;Build_Env: pkg-config: make check\007"
  146. $MAKE check
  147. echo -n -e "\033]0;Build_Env: pkg-config: make install\007"
  148. $MAKE install
  149. ############################################################################
  150. # Download and install libsodium
  151. ############################################################################
  152. echo -n -e "\033]0;Build_Env: libsodium: download\007"
  153. PKGURL="https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz"
  154. PKGDIR="libsodium-1.0.18"
  155. download $PKGURL
  156. echo "################################################################################"
  157. echo "Building libsodium"
  158. echo "################################################################################"
  159. cd $PKGDIR
  160. echo -n -e "\033]0;Build_Env: libsodium: configure\007"
  161. ./configure --prefix=$INSTALL_DIR
  162. echo -n -e "\033]0;Build_Env: libsodium: make\007"
  163. $MAKE
  164. echo -n -e "\033]0;Build_Env: libsodium: make check\007"
  165. $MAKE check
  166. echo -n -e "\033]0;Build_Env: libsodium: make install\007"
  167. $MAKE install
  168. ############################################################################
  169. # Download and install zeromq
  170. ############################################################################
  171. echo -n -e "\033]0;Build_Env: zeromq: download\007"
  172. PKGURL="https://github.com/zeromq/zeromq4-1/releases/download/v4.1.7/zeromq-4.1.7.tar.gz"
  173. PKGDIR="zeromq-4.1.7"
  174. download $PKGURL
  175. echo "################################################################################"
  176. echo "Building zeromq"
  177. echo "################################################################################"
  178. cd $PKGDIR
  179. echo -n -e "\033]0;Build_Env: zeromq: configure\007"
  180. ./configure --prefix=$INSTALL_DIR
  181. echo -n -e "\033]0;Build_Env: zeromq: make\007"
  182. $MAKE
  183. echo -n -e "\033]0;Build_Env: zeromq: make check\007"
  184. # some tests fail occasionally.
  185. $MAKE check
  186. echo -n -e "\033]0;Build_Env: zeromq: make install\007"
  187. $MAKE install
  188. ############################################################################
  189. # Download and install OpenSSL
  190. ############################################################################
  191. echo -n -e "\033]0;Build_Env: OpenSSL: download\007"
  192. PKGURL="http://openssl.org/source/openssl-1.0.2u.tar.gz"
  193. PKGDIR="openssl-1.0.2u"
  194. download $PKGURL
  195. echo "################################################################################"
  196. echo "Building OpenSSL"
  197. echo "################################################################################"
  198. cd $PKGDIR
  199. echo -n -e "\033]0;Build_Env: OpenSSL: configure\007"
  200. ./Configure darwin64-x86_64-cc shared --prefix=$INSTALL_DIR --openssldir=$INSTALL_DIR/openssl
  201. echo -n -e "\033]0;Build_Env: OpenSSL: make\007"
  202. $MAKE
  203. echo -n -e "\033]0;Build_Env: OpenSSL: make test\007"
  204. $MAKE test
  205. echo -n -e "\033]0;Build_Env: OpenSSL: make install\007"
  206. $MAKE install
  207. ############################################################################
  208. # Download and install Python
  209. ############################################################################
  210. echo -n -e "\033]0;Build_Env: Python: download\007"
  211. # if $1 is true the we should remove the --enable-optimizations flag to get a quicker
  212. # build if testing other functions of this script
  213. if [ "$1" == "true" ]; then
  214. PY_CONF="--prefix=$INSTALL_DIR --enable-shared --with-ensurepip=install"
  215. else
  216. PY_CONF="--prefix=$INSTALL_DIR --enable-shared --with-ensurepip=install --enable-optimizations"
  217. fi
  218. PKGURL="https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz"
  219. PKGDIR="Python-3.7.4"
  220. download $PKGURL
  221. echo "################################################################################"
  222. echo "Building Python"
  223. echo "################################################################################"
  224. echo "Note there are some test failures"
  225. cd $PKGDIR
  226. echo -n -e "\033]0;Build_Env: Python: configure\007"
  227. # removed --enable-toolbox-glue as no longer a config option
  228. ./configure $PY_CONF
  229. echo -n -e "\033]0;Build_Env: Python: make\007"
  230. $MAKE
  231. echo -n -e "\033]0;Build_Env: Python: make install\007"
  232. $MAKE install
  233. ############################################################################
  234. # upgrade pip
  235. ############################################################################
  236. $PIP install --upgrade pip wheel
  237. ############################################################################
  238. # Download and install salt python dependencies
  239. ############################################################################
  240. echo -n -e "\033]0;Build_Env: PIP Dependencies\007"
  241. cd $BUILDDIR
  242. echo "################################################################################"
  243. echo "Installing Salt Dependencies with pip (normal)"
  244. echo "################################################################################"
  245. $PIP install -r $SRCDIR/requirements/static/pkg/py$PY_VERSION/darwin.txt \
  246. --target=$PYDIR/site-packages \
  247. --ignore-installed \
  248. --no-cache-dir
  249. echo "--------------------------------------------------------------------------------"
  250. echo "Create Symlink to certifi for openssl"
  251. echo "--------------------------------------------------------------------------------"
  252. ln -s $PYDIR/site-packages/certifi/cacert.pem $INSTALL_DIR/openssl/cert.pem
  253. echo -n -e "\033]0;Build_Env: Finished\007"
  254. cd $BUILDDIR
  255. echo "################################################################################"
  256. echo "Build Environment Script Completed"
  257. echo "################################################################################"