From f38933fe6e216db426d83f7dd30a86e6829656f9 Mon Sep 17 00:00:00 2001 From: fzheng96 Date: Thu, 2 May 2019 14:04:50 -0700 Subject: [PATCH 1/2] FFMpeg and GRPC are now built statically --- CMakeLists.txt | 5 ++ cmake/Dependencies.cmake | 5 +- cmake/Modules/FindFFmpeg.cmake | 10 ++-- cmake/Modules/FindGRPC.cmake | 6 +- deps.sh | 102 +++++++++++++++++++++++---------- 5 files changed, 88 insertions(+), 40 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e6aa957..353806fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ project(Scanner) option(BUILD_CUDA "" ON) option(BUILD_TESTS "" ON) option(ENABLE_PROFILING "" OFF) +option(BUILD_STATIC "" OFF) if (BUILD_TESTS) enable_testing() @@ -127,6 +128,10 @@ set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG") add_subdirectory(scanner) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic") + add_library(scanner SHARED $ $ diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index acea305e..32a49619 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -67,6 +67,8 @@ find_package(Storehouse REQUIRED CONFIG "${STOREHOUSE_DIR}") find_package(TinyToml REQUIRED) +get_filename_component(JPEG_PATH "${JPEG_LIBRARIES}" DIRECTORY) + set(PYBIND11_PYTHON_VERSION 3) find_package(pybind11 REQUIRED) @@ -94,11 +96,10 @@ set(SCANNER_LIBRARIES "${STOREHOUSE_LIBRARIES}" "${OPENSSL_LIBRARIES}" "${PYTHON_LIBRARIES}" - "${JPEG_LIBRARY}" "-lz" "-ldl" ) - +list(APPEND SCANNER_LIBRARIES "${JPEG_LIBRARIES}") include_directories( "." "${CMAKE_CURRENT_BINARY_DIR}" # for protobuf generated files diff --git a/cmake/Modules/FindFFmpeg.cmake b/cmake/Modules/FindFFmpeg.cmake index b2269196..02c2dbb9 100644 --- a/cmake/Modules/FindFFmpeg.cmake +++ b/cmake/Modules/FindFFmpeg.cmake @@ -34,27 +34,27 @@ PATHS ${_FFMPEG_AVCODEC_INCLUDE_DIRS} /usr/include /usr/local/include /opt/local PATH_SUFFIXES ffmpeg libav ) -find_library(FFMPEG_LIBAVCODEC +find_library(FFMPEG_LIBAVCODEC libavcodec.a NAMES avcodec PATHS ${_FFMPEG_AVCODEC_LIBRARY_DIRS} /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) -find_library(FFMPEG_LIBAVFORMAT +find_library(FFMPEG_LIBAVFORMAT libavformat.a NAMES avformat PATHS ${_FFMPEG_AVFORMAT_LIBRARY_DIRS} /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) -find_library(FFMPEG_LIBAVUTIL +find_library(FFMPEG_LIBAVUTIL libavutil.a NAMES avutil PATHS ${_FFMPEG_AVUTIL_LIBRARY_DIRS} /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) -find_library(FFMPEG_LIBSWRESAMPLE +find_library(FFMPEG_LIBSWRESAMPLE libswresample.a NAMES swresample PATHS ${_FFMPEG_AVUTIL_LIBRARY_DIRS} /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) -find_library(FFMPEG_LIBSWSCALE +find_library(FFMPEG_LIBSWSCALE libswscale.a NAMES swscale PATHS ${_FFMPEG_AVCODEC_LIBRARY_DIRS} /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) diff --git a/cmake/Modules/FindGRPC.cmake b/cmake/Modules/FindGRPC.cmake index cb819711..3a8d3c3d 100644 --- a/cmake/Modules/FindGRPC.cmake +++ b/cmake/Modules/FindGRPC.cmake @@ -27,15 +27,15 @@ else() ${GRPC_DIR}/include) endif() -find_library(GRPCPP_UNSECURE_LIBRARY grpc++_unsecure +find_library(GRPCPP_UNSECURE_LIBRARY libgrpc++_unsecure.a grpc++_unsecure PATHS ${GRPC_DIR}/lib) -find_library(GRPC_LIBRARY grpc +find_library(GRPC_LIBRARY libgrpc.a grpc PATHS ${GRPC_DIR}/lib) -find_library(GPR_LIBRARY gpr +find_library(GPR_LIBRARY libgpr.a gpr PATHS ${GRPC_DIR}/lib) diff --git a/deps.sh b/deps.sh index 8a1c0731..32a10ae6 100644 --- a/deps.sh +++ b/deps.sh @@ -17,6 +17,7 @@ BUILD_DIR=$LOCAL_DIR/thirdparty/build DEFAULT_INSTALL_DIR=$LOCAL_DIR/thirdparty/install FILES_DIR=$LOCAL_DIR/thirdparty/resources PYTHON_VERSION=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))') +GRPC_PATH=$LOCAL_DIR/grpc/libs/opt POSITIONAL=() @@ -229,7 +230,7 @@ echo "" FFMPEG_DIR=$INSTALL_PREFIX OPENCV_DIR=$INSTALL_PREFIX PROTOBUF_DIR=$INSTALL_PREFIX -GRPC_DIR=$INSTALL_PREFIX +GRPC_DIR=$GRPC_PATH CAFFE_DIR=$INSTALL_PREFIX HALIDE_DIR=$INSTALL_PREFIX PYBIND_DIR=$INSTALL_PREFIX @@ -310,6 +311,14 @@ if [[ $INSTALL_NONE == true ]]; then elif [[ $INSTALL_ALL == false ]]; then # Ask about each library + echo -n "Do you want to build statically? [y/N]: " + read yn + if [[ $yn == y ]] || [[ $yn == Y ]]; then + BUILD_STATIC=true + else + BUILD_STATIC=false + fi + echo "Required dependencies: " if [[ -z ${WITH_OPENCV+x} ]]; then if [[ $HAS_BREW == true ]] && brew ls --versions opencv > /dev/null; then @@ -581,28 +590,40 @@ if [[ $INSTALL_GRPC == true ]] && [[ ! -f $BUILD_DIR/grpc.done ]] ; then # gRPC 1.16.0 echo "Installing gRPC 1.16.0..." cd $BUILD_DIR - rm -fr grpc - git clone -b v1.16.0 https://github.com/grpc/grpc && \ + if [[ $BUILD_STATIC == true ]] ; then + rm -fr grpc + git clone -b v1.16.0 https://github.com/grpc/grpc && + cd grpc && git submodule update --init --recursive && \ + CPPFLAGS=-I$INSTALL_PREFIX/include LDFLAGS=-L$INSTALL_PREFIX/lib make -j$cores && \ + CPPFLAGS=-I$INSTALL_PREFIX/include LDFLAGS=-L$INSTALL_PREFIX/lib make install prefix=$INSTALL_PREFIX + find . -type f -name "*.a" -exec cp '{}' $DEFAULT_INSTALL_DIR/lib/ ';' + touch $BUILD_DIR/grpc.done \ + || { echo 'Installing gRPC failed!' ; exit 1; } + else + rm -fr grpc + git clone -b v1.16.0 https://github.com/grpc/grpc && \ cd grpc && git submodule update --init --recursive && \ CPPFLAGS=-I$INSTALL_PREFIX/include LDFLAGS=-L$INSTALL_PREFIX/lib make -j$cores && \ CPPFLAGS=-I$INSTALL_PREFIX/include LDFLAGS=-L$INSTALL_PREFIX/lib make install prefix=$INSTALL_PREFIX && \ touch $BUILD_DIR/grpc.done \ || { echo 'Installing gRPC failed!' ; exit 1; } - if [[ "$OSTYPE" == "linux-gnu" ]]; then - # Linux - ldconfig -n $INSTALL_PREFIX/lib - elif [[ "$OSTYPE" == "darwin"* ]]; then - # OS X - install_name_tool -id "@rpath/libgrpc++_unsecure.dylib" \ - $INSTALL_PREFIX/lib/libgrpc++_unsecure.dylib - install_name_tool -id "@rpath/libgrpc.dylib" \ - $INSTALL_PREFIX/lib/libgrpc.dylib - install_name_tool -id "@rpath/libgpr.dylib" \ - $INSTALL_PREFIX/lib/libgpr.dylib - install_name_tool -change libgpr.dylib @rpath/libgpr.dylib \ - $INSTALL_PREFIX/lib/libgrpc++_unsecure.dylib - install_name_tool -change libgrpc_unsecure.dylib @rpath/libgrpc_unsecure.dylib \ - $INSTALL_PREFIX/lib/libgrpc++_unsecure.dylib + + if [[ "$OSTYPE" == "linux-gnu" ]]; then + # Linux + ldconfig -n $INSTALL_PREFIX/lib + elif [[ "$OSTYPE" == "darwin"* ]]; then + OS X + install_name_tool -id "@rpath/libgrpc++_unsecure.dylib" \ + $INSTALL_PREFIX/lib/libgrpc++_unsecure.dylib + install_name_tool -id "@rpath/libgrpc.dylib" \ + $INSTALL_PREFIX/lib/libgrpc.dylib + install_name_tool -id "@rpath/libgpr.dylib" \ + $INSTALL_PREFIX/lib/libgpr.dylib + install_name_tool -change libgpr.dylib @rpath/libgpr.dylib \ + $INSTALL_PREFIX/lib/libgrpc++_unsecure.dylib + install_name_tool -change libgrpc_unsecure.dylib @rpath/libgrpc_unsecure.dylib \ + $INSTALL_PREFIX/lib/libgrpc++_unsecure.dylib + fi fi echo "Done installing gRPC 1.16.0" fi @@ -615,7 +636,7 @@ if [[ $INSTALL_FFMPEG == true ]] && [[ ! -f $BUILD_DIR/ffmpeg.done ]] ; then # Linux CMDS="--extra-version=0ubuntu0.16.04.1 --toolchain=hardened - --cc=cc --cxx=g++" + --cc=cc --cxx=g++ -std=c++17" # ... elif [[ "$OSTYPE" == "darwin"* ]]; then # Mac OSX @@ -625,17 +646,38 @@ if [[ $INSTALL_FFMPEG == true ]] && [[ ! -f $BUILD_DIR/ffmpeg.done ]] ; then # FFMPEG cd $BUILD_DIR rm -fr ffmpeg - git clone -b n3.3.1 https://git.ffmpeg.org/ffmpeg.git && cd ffmpeg && \ - ./configure --prefix=$INSTALL_PREFIX \ - --enable-shared --disable-stripping \ - --disable-decoder=libschroedinger \ - --enable-avresample \ - --enable-libx264 \ - --enable-nonfree \ - --enable-gpl \ - --enable-gnutls \ - $(echo $CMDS) && \ - make -j${cores} && make install && touch $BUILD_DIR/ffmpeg.done \ + if [[ $BUILD_STATIC == true ]] ; then + git clone -b n3.3.1 https://git.ffmpeg.org/ffmpeg.git && cd ffmpeg && \ + ./configure --prefix=$INSTALL_PREFIX \ + --enable-shared --disable-stripping \ + --disable-decoder=libschroedinger \ + --enable-avresample \ + --enable-libx264 \ + --enable-nonfree \ + --enable-gpl \ + --enable-gnutls \ + --enable-pic \ + --extra-ldexeflags=-pie \ + $(echo $CMDS) && \ + make -j${cores} && make install + find . -type f -name "*.a" -exec cp '{}' $DEFAULT_INSTALL_DIR/lib/ ';' + else + git clone -b n3.3.1 https://git.ffmpeg.org/ffmpeg.git && cd ffmpeg && \ + ./configure --prefix=$INSTALL_PREFIX \ + --enable-shared --disable-stripping \ + --disable-decoder=libschroedinger \ + --enable-avresample \ + --enable-libx264 \ + --enable-nonfree \ + --enable-gpl \ + --enable-gnutls \ + --enable-pic \ + --extra-ldexeflags=-pie \ + $(echo $CMDS) && \ + make -j${cores} && make install + fi + + touch $BUILD_DIR/ffmpeg.done \ || { echo 'Installing ffmpeg failed!' ; exit 1; } echo "Done installing ffmpeg 3.3.1" fi From 40a071c16c8c8a37c3858520933797bde02da4b7 Mon Sep 17 00:00:00 2001 From: fzheng96 Date: Thu, 2 May 2019 14:11:17 -0700 Subject: [PATCH 2/2] Fixed install_dir for grpc --- deps.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/deps.sh b/deps.sh index 32a10ae6..a25e5c7f 100644 --- a/deps.sh +++ b/deps.sh @@ -17,7 +17,6 @@ BUILD_DIR=$LOCAL_DIR/thirdparty/build DEFAULT_INSTALL_DIR=$LOCAL_DIR/thirdparty/install FILES_DIR=$LOCAL_DIR/thirdparty/resources PYTHON_VERSION=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))') -GRPC_PATH=$LOCAL_DIR/grpc/libs/opt POSITIONAL=() @@ -230,7 +229,7 @@ echo "" FFMPEG_DIR=$INSTALL_PREFIX OPENCV_DIR=$INSTALL_PREFIX PROTOBUF_DIR=$INSTALL_PREFIX -GRPC_DIR=$GRPC_PATH +GRPC_DIR=$INSTALL_PREFIX CAFFE_DIR=$INSTALL_PREFIX HALIDE_DIR=$INSTALL_PREFIX PYBIND_DIR=$INSTALL_PREFIX @@ -636,7 +635,7 @@ if [[ $INSTALL_FFMPEG == true ]] && [[ ! -f $BUILD_DIR/ffmpeg.done ]] ; then # Linux CMDS="--extra-version=0ubuntu0.16.04.1 --toolchain=hardened - --cc=cc --cxx=g++ -std=c++17" + --cc=cc --cxx=g++" # ... elif [[ "$OSTYPE" == "darwin"* ]]; then # Mac OSX