|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +# Assuming the script is run at mxnet/tools/pip_package |
| 4 | +# This script builds from scratch the dependencies of mxnet into static |
| 5 | +# librareis and statically links them to produce a (mostly) standalone |
| 6 | +# libmxnet.so, then packages it into the python wheel. |
| 7 | +# It assumes the build environment to be a sandbox that doesn't have the .so |
| 8 | +# objects for the dependencies, i.e. zlib, openblas, libjpeg, libpng, libtiff |
| 9 | +# and opencv. |
| 10 | + |
| 11 | +# Install necessary build tools |
| 12 | +if [ -n "$(command -v apt-get)" ]; then |
| 13 | + sudo apt-get update; |
| 14 | + sudo apt-get install -y build-essential git python-pip zip pkg-config cmake |
| 15 | +elif [ -n "$(command -v yum)" ]; then |
| 16 | + sudo yum install -y cmake |
| 17 | + sudo yum groupinstall -y "Development Tools" |
| 18 | + sudo yum install -y python27 python27-setuptools python27-tools python-pip |
| 19 | +else |
| 20 | + echo "Need a package manager to install build tools, e.g. apt/yum" |
| 21 | + exit 1 |
| 22 | +fi |
| 23 | +sudo pip install -U pip setuptools wheel |
| 24 | + |
| 25 | +# Set up path as temporary working directory |
| 26 | +DEPS_PATH=$PWD/../../deps |
| 27 | +mkdir $DEPS_PATH |
| 28 | + |
| 29 | +# Dependencies can be updated here. Be sure to verify the download link before |
| 30 | +# changing. The dependencies are: |
| 31 | +ZLIB_VERSION=1.2.6 |
| 32 | +OPENBLAS_VERSION=0.2.19 |
| 33 | +JPEG_VERSION=8.4.0 |
| 34 | +PNG_VERSION=1.5.10 |
| 35 | +TIFF_VERSION=3.8.2 |
| 36 | +OPENCV_VERSION=2.4.13 |
| 37 | + |
| 38 | +# Setup path to dependencies |
| 39 | +export PKG_CONFIG_PATH=$DEPS_PATH/lib/pkgconfig:$DEPS_PATH/lib64/pkgconfig:$PKG_CONFIG_PATH |
| 40 | +export CPATH=$DEPS_PATH/include:$CPATH |
| 41 | + |
| 42 | +# Position Independent code must be turned on for statically linking .a |
| 43 | +export CC="gcc -fPIC" |
| 44 | +export CXX="g++ -fPIC" |
| 45 | + |
| 46 | +# Download and build zlib |
| 47 | +curl -L https://github.com/LuaDist/zlib/archive/$ZLIB_VERSION.zip -o $DEPS_PATH/zlib.zip |
| 48 | +unzip $DEPS_PATH/zlib.zip -d $DEPS_PATH |
| 49 | +mkdir $DEPS_PATH/zlib-$ZLIB_VERSION/build |
| 50 | +cd $DEPS_PATH/zlib-$ZLIB_VERSION/build |
| 51 | +cmake -D CMAKE_BUILD_TYPE=RELEASE \ |
| 52 | + -D CMAKE_INSTALL_PREFIX=$DEPS_PATH \ |
| 53 | + -D BUILD_SHARED_LIBS=OFF .. |
| 54 | +make -j$(nproc) |
| 55 | +make install |
| 56 | +cd - |
| 57 | + |
| 58 | +# download and build openblas |
| 59 | +curl -L https://github.com/xianyi/OpenBLAS/archive/v$OPENBLAS_VERSION.zip -o $DEPS_PATH/openblas.zip |
| 60 | +unzip $DEPS_PATH/openblas.zip -d $DEPS_PATH |
| 61 | +cd $DEPS_PATH/OpenBLAS-$OPENBLAS_VERSION |
| 62 | +make FC=gfortran -j $(($(nproc) + 1)) |
| 63 | +make PREFIX=$DEPS_PATH install |
| 64 | +cd - |
| 65 | +ln -s $DEPS_PATH/lib/libopenblas_haswellp-r0.2.19.a $DEPS_PATH/lib/libcblas.a |
| 66 | + |
| 67 | +# download and build libjpeg |
| 68 | +curl -L https://github.com/LuaDist/libjpeg/archive/$JPEG_VERSION.zip -o $DEPS_PATH/libjpeg.zip |
| 69 | +unzip $DEPS_PATH/libjpeg.zip -d $DEPS_PATH |
| 70 | +cd $DEPS_PATH/libjpeg-$JPEG_VERSION |
| 71 | +./configure --disable-shared --prefix=$DEPS_PATH |
| 72 | +make -j$(nproc) |
| 73 | +make test |
| 74 | +make install |
| 75 | +cd - |
| 76 | + |
| 77 | +# download and build libpng |
| 78 | +curl -L https://github.com/LuaDist/libpng/archive/$PNG_VERSION.zip -o $DEPS_PATH/libpng.zip |
| 79 | +unzip $DEPS_PATH/libpng.zip -d $DEPS_PATH |
| 80 | +mkdir $DEPS_PATH/libpng-$PNG_VERSION/build |
| 81 | +cd $DEPS_PATH/libpng-$PNG_VERSION/build |
| 82 | +cmake -D CMAKE_BUILD_TYPE=RELEASE \ |
| 83 | + -D CMAKE_INSTALL_PREFIX=$DEPS_PATH \ |
| 84 | + -D PNG_CONFIGURE_LIBPNG=-fPIC \ |
| 85 | + -D BUILD_SHARED_LIBS=OFF .. |
| 86 | +make -j$(nproc) |
| 87 | +make install |
| 88 | +cd - |
| 89 | + |
| 90 | +# download and build libtiff |
| 91 | +curl -L https://github.com/LuaDist/libtiff/archive/$TIFF_VERSION.zip -o $DEPS_PATH/libtiff.zip |
| 92 | +unzip $DEPS_PATH/libtiff.zip -d $DEPS_PATH |
| 93 | +cd $DEPS_PATH/libtiff-$TIFF_VERSION |
| 94 | +./configure --disable-shared --prefix=$DEPS_PATH |
| 95 | +make -j$(nproc) |
| 96 | +make install |
| 97 | +cd - |
| 98 | + |
| 99 | +# download and build opencv since we need the static library |
| 100 | +curl -L https://github.com/Itseez/opencv/archive/$OPENCV_VERSION.zip -o $DEPS_PATH/opencv.zip |
| 101 | +unzip $DEPS_PATH/opencv.zip -d $DEPS_PATH |
| 102 | +mkdir $DEPS_PATH/opencv-$OPENCV_VERSION/build |
| 103 | +cd $DEPS_PATH/opencv-$OPENCV_VERSION/build |
| 104 | +cmake -D WITH_1394=OFF \ |
| 105 | + -D WITH_AVFOUNDATION=OFF \ |
| 106 | + -D WITH_CUDA=OFF \ |
| 107 | + -D WITH_VTK=OFF \ |
| 108 | + -D WITH_CUFFT=OFF \ |
| 109 | + -D WITH_CUBLAS=OFF \ |
| 110 | + -D WITH_NVCUVID=OFF \ |
| 111 | + -D WITH_EIGEN=ON \ |
| 112 | + -D WITH_VFW=OFF \ |
| 113 | + -D WITH_FFMPEG=OFF \ |
| 114 | + -D WITH_GSTREAMER=OFF \ |
| 115 | + -D WITH_GTK=OFF \ |
| 116 | + -D WITH_JASPER=OFF \ |
| 117 | + -D WITH_JPEG=ON \ |
| 118 | + -D WITH_PNG=ON \ |
| 119 | + -D WITH_QUICKTIME=OFF \ |
| 120 | + -D WITH_TBB=ON \ |
| 121 | + -D WITH_TIFF=OFF \ |
| 122 | + -D WITH_V4L=OFF \ |
| 123 | + -D WITH_LIBV4L=OFF \ |
| 124 | + -D WITH_DSHOW=OFF \ |
| 125 | + -D WITH_MSMF=OFF \ |
| 126 | + -D WITH_OPENCL=OFF \ |
| 127 | + -D WITH_OPENCLAMDFFT=OFF \ |
| 128 | + -D WITH_OPENCLAMDBLAS=OFF \ |
| 129 | + -D BUILD_SHARED_LIBS=OFF \ |
| 130 | + -D BUILD_opencv_apps=OFF \ |
| 131 | + -D BUILD_opencv_gpu=OFF \ |
| 132 | + -D BUILD_opencv_video=OFF \ |
| 133 | + -D BUILD_opencv_contrib=OFF \ |
| 134 | + -D BUILD_opencv_nonfree=OFF \ |
| 135 | + -D BUILD_opencv_flann=OFF \ |
| 136 | + -D BUILD_opencv_features2d=OFF \ |
| 137 | + -D BUILD_opencv_calib3d=OFF \ |
| 138 | + -D BUILD_opencv_objdetect=OFF \ |
| 139 | + -D BUILD_opencv_ml=OFF \ |
| 140 | + -D BUILD_opencv_photo=OFF \ |
| 141 | + -D BUILD_DOCS=OFF \ |
| 142 | + -D BUILD_PACKAGE=OFF \ |
| 143 | + -D CMAKE_BUILD_TYPE=RELEASE \ |
| 144 | + -D CMAKE_INSTALL_PREFIX=$DEPS_PATH .. |
| 145 | +make -j $(nproc) |
| 146 | +make install # user will always have access to home, so no sudo needed |
| 147 | +cd - |
| 148 | + |
| 149 | +# Although .so building is explicitly turned off for most libraries, sometimes |
| 150 | +# they still get created. So, remove them just to make sure they don't |
| 151 | +# interfere, or otherwise we might get libmxnet.so that is not self-contained. |
| 152 | +rm $DEPS_PATH/{lib,lib64}/*.{so,so.0} |
| 153 | + |
| 154 | +# Go to the parent path and build mxnet |
| 155 | +cd ../../ |
| 156 | +cp make/pip_$(uname | tr '[:upper:]' '[:lower:]')_cpu.mk config.mk |
| 157 | +make -j $(nproc) |
| 158 | + |
| 159 | +# Generate wheel. The output is in the mxnet/tools/pip_package/dist path. |
| 160 | +cd tools/pip_package |
1 | 161 | python setup.py bdist_wheel
|
0 commit comments