blob: a1af18bad528c8acf6d7300cbe0cb7f6c7a38e06 [file] [log] [blame]
#!/usr/bin/env bash
# Assuming the script is run at mxnet/tools/pip_package
# This script builds from scratch the dependencies of mxnet into static
# librareis and statically links them to produce a (mostly) standalone
# libmxnet.so, then packages it into the python wheel.
# It assumes the build environment to be a sandbox that doesn't have the .so
# objects for the dependencies, i.e. zlib, openblas, libjpeg, libpng, libtiff
# and opencv.
# Install necessary build tools
if [ -n "$(command -v apt-get)" ]; then
sudo apt-get update;
sudo apt-get install -y build-essential git python-pip zip pkg-config cmake
elif [ -n "$(command -v yum)" ]; then
sudo yum install -y cmake
sudo yum groupinstall -y "Development Tools"
sudo yum install -y python27 python27-setuptools python27-tools python-pip
else
echo "Need a package manager to install build tools, e.g. apt/yum"
exit 1
fi
sudo pip install -U pip setuptools wheel
# Set up path as temporary working directory
DEPS_PATH=$PWD/../../deps
mkdir $DEPS_PATH
# Dependencies can be updated here. Be sure to verify the download link before
# changing. The dependencies are:
ZLIB_VERSION=1.2.6
OPENBLAS_VERSION=0.2.19
JPEG_VERSION=8.4.0
PNG_VERSION=1.5.10
TIFF_VERSION=3.8.2
OPENCV_VERSION=2.4.13
# Setup path to dependencies
export PKG_CONFIG_PATH=$DEPS_PATH/lib/pkgconfig:$DEPS_PATH/lib64/pkgconfig:$PKG_CONFIG_PATH
export CPATH=$DEPS_PATH/include:$CPATH
# Position Independent code must be turned on for statically linking .a
export CC="gcc -fPIC"
export CXX="g++ -fPIC"
# Download and build zlib
curl -L https://github.com/LuaDist/zlib/archive/$ZLIB_VERSION.zip -o $DEPS_PATH/zlib.zip
unzip $DEPS_PATH/zlib.zip -d $DEPS_PATH
mkdir $DEPS_PATH/zlib-$ZLIB_VERSION/build
cd $DEPS_PATH/zlib-$ZLIB_VERSION/build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$DEPS_PATH \
-D BUILD_SHARED_LIBS=OFF ..
make -j$(nproc)
make install
cd -
# download and build openblas
curl -L https://github.com/xianyi/OpenBLAS/archive/v$OPENBLAS_VERSION.zip -o $DEPS_PATH/openblas.zip
unzip $DEPS_PATH/openblas.zip -d $DEPS_PATH
cd $DEPS_PATH/OpenBLAS-$OPENBLAS_VERSION
make FC=gfortran -j $(($(nproc) + 1))
make PREFIX=$DEPS_PATH install
cd -
ln -s $DEPS_PATH/lib/libopenblas_haswellp-r0.2.19.a $DEPS_PATH/lib/libcblas.a
# download and build libjpeg
curl -L https://github.com/LuaDist/libjpeg/archive/$JPEG_VERSION.zip -o $DEPS_PATH/libjpeg.zip
unzip $DEPS_PATH/libjpeg.zip -d $DEPS_PATH
cd $DEPS_PATH/libjpeg-$JPEG_VERSION
./configure --disable-shared --prefix=$DEPS_PATH
make -j$(nproc)
make test
make install
cd -
# download and build libpng
curl -L https://github.com/LuaDist/libpng/archive/$PNG_VERSION.zip -o $DEPS_PATH/libpng.zip
unzip $DEPS_PATH/libpng.zip -d $DEPS_PATH
mkdir $DEPS_PATH/libpng-$PNG_VERSION/build
cd $DEPS_PATH/libpng-$PNG_VERSION/build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$DEPS_PATH \
-D PNG_CONFIGURE_LIBPNG=-fPIC \
-D BUILD_SHARED_LIBS=OFF ..
make -j$(nproc)
make install
cd -
# download and build libtiff
curl -L https://github.com/LuaDist/libtiff/archive/$TIFF_VERSION.zip -o $DEPS_PATH/libtiff.zip
unzip $DEPS_PATH/libtiff.zip -d $DEPS_PATH
cd $DEPS_PATH/libtiff-$TIFF_VERSION
./configure --disable-shared --prefix=$DEPS_PATH
make -j$(nproc)
make install
cd -
# download and build opencv since we need the static library
curl -L https://github.com/Itseez/opencv/archive/$OPENCV_VERSION.zip -o $DEPS_PATH/opencv.zip
unzip $DEPS_PATH/opencv.zip -d $DEPS_PATH
mkdir $DEPS_PATH/opencv-$OPENCV_VERSION/build
cd $DEPS_PATH/opencv-$OPENCV_VERSION/build
cmake -D WITH_1394=OFF \
-D WITH_AVFOUNDATION=OFF \
-D WITH_CUDA=OFF \
-D WITH_VTK=OFF \
-D WITH_CUFFT=OFF \
-D WITH_CUBLAS=OFF \
-D WITH_NVCUVID=OFF \
-D WITH_EIGEN=ON \
-D WITH_VFW=OFF \
-D WITH_FFMPEG=OFF \
-D WITH_GSTREAMER=OFF \
-D WITH_GTK=OFF \
-D WITH_JASPER=OFF \
-D WITH_JPEG=ON \
-D WITH_PNG=ON \
-D WITH_QUICKTIME=OFF \
-D WITH_TBB=ON \
-D WITH_TIFF=OFF \
-D WITH_V4L=OFF \
-D WITH_LIBV4L=OFF \
-D WITH_DSHOW=OFF \
-D WITH_MSMF=OFF \
-D WITH_OPENCL=OFF \
-D WITH_OPENCLAMDFFT=OFF \
-D WITH_OPENCLAMDBLAS=OFF \
-D BUILD_SHARED_LIBS=OFF \
-D BUILD_opencv_apps=OFF \
-D BUILD_opencv_gpu=OFF \
-D BUILD_opencv_video=OFF \
-D BUILD_opencv_contrib=OFF \
-D BUILD_opencv_nonfree=OFF \
-D BUILD_opencv_flann=OFF \
-D BUILD_opencv_features2d=OFF \
-D BUILD_opencv_calib3d=OFF \
-D BUILD_opencv_objdetect=OFF \
-D BUILD_opencv_ml=OFF \
-D BUILD_opencv_photo=OFF \
-D BUILD_DOCS=OFF \
-D BUILD_PACKAGE=OFF \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=$DEPS_PATH ..
make -j $(nproc)
make install # user will always have access to home, so no sudo needed
cd -
# Although .so building is explicitly turned off for most libraries, sometimes
# they still get created. So, remove them just to make sure they don't
# interfere, or otherwise we might get libmxnet.so that is not self-contained.
rm $DEPS_PATH/{lib,lib64}/*.{so,so.0}
# Go to the parent path and build mxnet
cd ../../
cp make/pip_$(uname | tr '[:upper:]' '[:lower:]')_cpu.mk config.mk
make -j $(nproc)
# Generate wheel. The output is in the mxnet/tools/pip_package/dist path.
cd tools/pip_package
python setup.py bdist_wheel