使用CMake的fixup_bundle捆绑仅支持linux的应用程序

时间:2016-04-29 09:40:29

标签: cmake bundle

我们开发了一些基于OpenCV,Boost,LibVLC和Caffe的CV应用程序。我们的一些客户希望将它部署在过时的(或不受欢迎的)Linux发行版上,因此我们必须捆绑它的所有依赖项(以及一些vlc插件),其中大多数都可以在任何实际的发行版中找到,但是我们有libcaffe的自定义构建版本在我们的回购所以,现在我用这个bash脚本来解决它:

#!/bin/bash

set -uex
export LD_LIBRARY_PATH=./contrib/caffe.arch32/lib/

function copy_deps {
  libs=$(LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux.so.2 "$1"  | cut -d" " -f 3 | sort |uniq | grep -v '^$')
  for lib in $libs
  do
    cp -un "$lib" ./bundle
  done
}

mkdir -p bundle

mkdir -p ./bundle/vlc/plugins
cp -r /usr/lib/vlc/plugins ./bundle/vlc

rm -rf ./bundle/vlc/plugins/lua
rm -rf ./bundle/vlc/plugins/gui
rm -rf ./bundle/vlc/plugins/visualization

for plugin in $(find ./bundle/vlc/plugins -name "*.so")
do
  copy_deps "$plugin"
done

copy_deps ./detector

cp /lib/ld-linux.so.2 ./bundle

cp ./detector ./bundle
cp ./config.ini ./bundle
mkdir -p ./bundle/config
cp -r ./config/nn ./bundle/config
cp -r ./config/neuron ./bundle/config

echo "LD_LIBRARY_PATH=./ ./ld-linux.so.2 ./detector 2> /dev/null" > ./bundle/run.sh
chmod +x ./bundle/run.sh
zip -q -r bundle.zip bundle

它工作正常,但仅适用于可执行构建(我们也需要共享库),仅适用于x86_32发行版。我们使用cmake构建我们的项目,所以在阅读了我注意到的文档之后,fixup_bundle是用于捆绑的cmake-way。关于fixup_bundle的所有示例和博客都非常简单,或与OSX或Windows相关。所以,我附加了我的CMakeLists.txt

set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
set(BUNDLE_NAME ${PROJECT_NAME})
set(BUNDLE_PATH "${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME}")
set(APPS ${BUNDLE_PATH})

list(APPEND DIRS ${CMAKE_INSTALL_PREFIX}/${LIBDIR} ${CAFFE_LINK_PATH} /lib/ /usr/lib)
list(APPEND LIBS)

INSTALL(CODE "
include(BundleUtilities)
fixup_bundle(\"${APPS}\" \"${LIBS}\" \"${DIRS}\")
" COMPONENT Runtime)

然后尝试运行make install,我注意到只有我们的自定义libcaffe被捆绑,没有提升,没有opencv,没有VLC。为什么?如何捆绑所有依赖项?

操作系统:Arch Linux。

0 个答案:

没有答案
相关问题