打包具有依赖性的软件——我应该深入到什么程度?
Packaging software with dependencies - How deep should I go?
我正在开发一个跨平台软件,想将它作为 zip 包分发。
对于Linux,我没有将依赖项与包一起打包,对于Windows,我也在包中分发了dll。
For Mac OS X 我有一个脚本可以递归地将所有 dylib 文件复制到构建文件夹并更改链接。
当然,这会导致我可能不应该打包的文件列表,例如libsystem_malloc.dylib
, libremovefile.dylib
.
我应该直接使用安装在 /usr/local/*
中的 dylibs 还是有任何其他系统方法不包括每个 OS X 安装中可用的文件?
如果有帮助的话,大多数(好的,现在全部)依赖项都是 Homebrew 包。
对于任何感兴趣的人,这是递归复制和重新链接的 bash 代码:
while true; do
INSTALLED=0
for dylib in *.dylib; do
LIBS=`otool -L $dylib`
if [ "x$LIBS" != "x" ]; then
echo "$dylib is using:"
for lib in $LIBS{@:2}; do
if echo $lib | grep --quiet 'dylib$'; then
echo " $lib"
new_lib=`echo $lib | sed 's|.*/\(.*\.dylib\)||'`
if [ -e $PD_APP_LIB/$new_lib ]; then
echo "$PD_APP_LIB/$new_lib already exists, skipping copy."
else
install -vp $lib $PD_APP_LIB
INSTALLED=1
fi
install_name_tool -id @loader_path/$new_lib $PD_APP_LIB/$new_lib
install_name_tool -change $lib @loader_path/$new_lib $dylib
fi
done
echo " "
fi
done
if [ $INSTALLED -eq 0 ]; then
break
fi
done
现在,我只打包来自 /usr/local/
的库,脚本是:
while true; do
INSTALLED=0
for dylib in *.dylib; do
LIBS=`otool -L $dylib`
if [ "x$LIBS" != "x" ]; then
echo "$dylib is using:"
for lib in $LIBS{@:2}; do
# The following line has been changed
if echo $lib | grep --quiet '^/usr/local/.*dylib$'; then
echo " $lib"
new_lib=`echo $lib | sed 's|.*/\(.*\.dylib\)||'`
if [ -e $PD_APP_LIB/$new_lib ]; then
echo "$PD_APP_LIB/$new_lib already exists, skipping copy."
else
install -vp $lib $PD_APP_LIB
INSTALLED=1
fi
install_name_tool -id @loader_path/$new_lib $PD_APP_LIB/$new_lib
install_name_tool -change $lib @loader_path/$new_lib $dylib
fi
done
echo " "
fi
done
if [ $INSTALLED -eq 0 ]; then
break
fi
done
我正在开发一个跨平台软件,想将它作为 zip 包分发。
对于Linux,我没有将依赖项与包一起打包,对于Windows,我也在包中分发了dll。
For Mac OS X 我有一个脚本可以递归地将所有 dylib 文件复制到构建文件夹并更改链接。
当然,这会导致我可能不应该打包的文件列表,例如libsystem_malloc.dylib
, libremovefile.dylib
.
我应该直接使用安装在 /usr/local/*
中的 dylibs 还是有任何其他系统方法不包括每个 OS X 安装中可用的文件?
如果有帮助的话,大多数(好的,现在全部)依赖项都是 Homebrew 包。
对于任何感兴趣的人,这是递归复制和重新链接的 bash 代码:
while true; do
INSTALLED=0
for dylib in *.dylib; do
LIBS=`otool -L $dylib`
if [ "x$LIBS" != "x" ]; then
echo "$dylib is using:"
for lib in $LIBS{@:2}; do
if echo $lib | grep --quiet 'dylib$'; then
echo " $lib"
new_lib=`echo $lib | sed 's|.*/\(.*\.dylib\)||'`
if [ -e $PD_APP_LIB/$new_lib ]; then
echo "$PD_APP_LIB/$new_lib already exists, skipping copy."
else
install -vp $lib $PD_APP_LIB
INSTALLED=1
fi
install_name_tool -id @loader_path/$new_lib $PD_APP_LIB/$new_lib
install_name_tool -change $lib @loader_path/$new_lib $dylib
fi
done
echo " "
fi
done
if [ $INSTALLED -eq 0 ]; then
break
fi
done
现在,我只打包来自 /usr/local/
的库,脚本是:
while true; do
INSTALLED=0
for dylib in *.dylib; do
LIBS=`otool -L $dylib`
if [ "x$LIBS" != "x" ]; then
echo "$dylib is using:"
for lib in $LIBS{@:2}; do
# The following line has been changed
if echo $lib | grep --quiet '^/usr/local/.*dylib$'; then
echo " $lib"
new_lib=`echo $lib | sed 's|.*/\(.*\.dylib\)||'`
if [ -e $PD_APP_LIB/$new_lib ]; then
echo "$PD_APP_LIB/$new_lib already exists, skipping copy."
else
install -vp $lib $PD_APP_LIB
INSTALLED=1
fi
install_name_tool -id @loader_path/$new_lib $PD_APP_LIB/$new_lib
install_name_tool -change $lib @loader_path/$new_lib $dylib
fi
done
echo " "
fi
done
if [ $INSTALLED -eq 0 ]; then
break
fi
done