我必须在只有用户访问权限的计算机上运行 C++ 软件。在运行我感兴趣的程序之前,我必须先安装一堆依赖项:
所有这些都使用 GNU Autotools,我必须将几个特定选项传递给./configure
.该编译器也是非标准的(它针对 BlueGene/Q 进行交叉编译)。为了具有一定的可重复性,我编写了一个 Bash 脚本来获取源代码,对其进行编译并将其安装到$HOME/local
:
base_flags="-O2 -finline-limit=50000 -Wall -Wpedantic $color_flags"
if ! [[ -d gmp-6.1.1 ]]; then
wget https://gmplib.org/download/gmp/gmp-6.1.1.tar.xz
tar -xf gmp-6.1.1.tar.xz
fi
pushd gmp-6.1.1
cflags="$base_flags"
cxxflags="$base_flags"
if ! [[ -f Makefile ]]; then
./configure $base_configure CFLAGS="$cflags"
fi
if ! [[ -f build-succeeded ]]; then
nice make $make_smp_flags
make install
touch build-succeeded
pushd $prefix/lib
rm -f *.so *.so.* # Force static linkage.
popd
fi
# Similar stanzas for the other projects.
在我拥有 root 访问权限的个人计算机上,我为我想要安装的所有软件构建 RPM 包,让 RPM 构建在 openSUSE 项目托管的开放构建服务上,并使用 Ansible 安装它们。在远程计算机上工作感觉就像从头开始的 Linux 左右,我无法升级或卸载某些东西,而且我必须记住所使用的版本和标志。
我能想到的就是尝试通过设置来模拟 RPM 包DESTDIR
,--prefix
这样我就可以 TAR 构建产品,然后将其解压缩到$HOME/local
.然后我会编写一些卸载程序/更新程序,列出存档内容并从$HOME/local
.
有更好的方法来做到这一点吗?