Skip to content

Instantly share code, notes, and snippets.

@Prince781
Last active May 8, 2021 04:05
Show Gist options
  • Save Prince781/049697b088955d285cec7e005ad5dd9e to your computer and use it in GitHub Desktop.
Save Prince781/049697b088955d285cec7e005ad5dd9e to your computer and use it in GitHub Desktop.
setup software in custom directory
#!/bin/bash
# vim: tw=0
if [ -z $SOFTWARE ]; then
echo "SOFTWARE undefined"
exit 1
fi
mkdir -p $SOFTWARE
mkdir -p $SOFTWARE/usr/share/man
mkdir -p $SOFTWARE/usr/{lib,bin,include}
mkdir -p $SOFTWARE/etc
if [ ! -e $SOFTWARE/lib ]; then
ln -sT $SOFTWARE/usr/lib $SOFTWARE/lib
fi
if [ ! -e $SOFTWARE/bin ]; then
ln -sT $SOFTWARE/usr/bin $SOFTWARE/bin
fi
if [ ! -e $SOFTWARE/usr/lib64 ]; then
ln -sT $SOFTWARE/usr/lib $SOFTWARE/usr/lib64
fi
if [ ! -e $SOFTWARE/man ]; then
ln -sT $SOFTWARE/usr/share/man $SOFTWARE/man
fi
if [ ! -e $SOFTWARE/include ]; then
ln -sT $SOFTWARE/usr/include $SOFTWARE/include
fi
if [ ! -e $SOFTWARE/share ]; then
ln -sT $SOFTWARE/usr/share $SOFTWARE/share
fi
if [ ! -e $SOFTWARE/etc/ld.so.conf ]; then
echo "$SOFTWARE/lib" > $SOFTWARE/etc/ld.so.conf
fi
OLDDIR=`pwd`
TEMP=$OLDDIR/temp
quit() {
cd $OLDDIR
ldconfig -r $SOFTWARE
read -p "Delete temp directory? ($TEMP) [[y]/n]:" response
if [[ "$response" != "n" ]]; then
rm -rf $TEMP
fi
exit $1
}
quit_prompt() {
read -p "Quit? [y/[n]]:" response
if [[ "$response" == "y" ]]; then
quit $@
fi
}
extract() {
filename=$1
if [ -z "$filename" ]; then
return 1
fi
ext=`expr match $filename '.*\(\.tar\.\w\+\|\.tgz\)'`
name=${filename%%$ext}
if [ ! -e "$name$ext" ]; then
echo "Error extracting extension."
return 1
fi
if [ ! -d $TEMP/$name ]; then
tar -xf $name$ext
fi
cd $TEMP/$name
return 0
}
download() {
url=$1
name=$2
fname=
if [ ! -z $name ]; then
fname=$name
else
fname=`basename $1`
fi
if [[ ! -e "$fname" ]] && ! wget $url -O "$fname"; then
return 1
fi
# extract
extract $fname
}
exec_configure() {
./configure --prefix=$SOFTWARE/usr --exec-prefix=$SOFTWARE/usr $@ CFLAGS="-I$SOFTWARE/usr/include" LDFLAGS="-L$SOFTWARE/lib -Wl,-rpath=$SOFTWARE/usr/lib"
}
exec_make() {
make DESTDIR=$SOFTWARE/usr install
}
exec_autogen() {
./autogen.sh && exec_configure $@
}
exec_autoconf() {
autoconf && exec_configure $@
}
exec_cmake() {
mkdir build \
&& cd build \
&& cmake -DCMAKE_SYSTEM_LIBRARY_PATH=$SOFTWARE \
-DCMAKE_INSTALL_PREFIX=$SOFTWARE/usr $@ ..
}
exec_cmake_nvim() {
mkdir .deps \
&& cd .deps \
&& cmake ../third-party;
if ! make; then
quit_prompt 1
else
cd .. && exec_cmake $@
fi
}
install_software() {
local exec_prog=$1
local name=$2
local args=${@:3}
if ! $exec_prog $args; then
quit_prompt 1
elif ! make -j`nproc`; then
quit_prompt 1
elif ! make install; then
quit_prompt 1
else
echo "Installed $name"
fi
}
resolve_dependencies() {
for i in $@; do
pkg_$i
done
}
pkg_oh-my-zsh() {
# Install oh-my-zsh
if [ ! -e $HOME/.oh-my-zsh ]; then
sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
fi
}
pkg_bear() {
# Install Build EAR
if [ ! -e $SOFTWARE/bin/bear ]; then
echo "Installing Bear 2.3.9 ..."
download https://github.com/rizsotto/Bear/archive/2.3.9.tar.gz Bear-2.3.9.tar.gz \
&& install_software exec_cmake "Bear"
cd $TEMP
fi
}
pkg_ltrace() {
# Install ltrace
cat >$TEMP/value.c.patch <<EOF
--- value.c 2017-12-01 21:41:04.816491724 -0500
+++ value.c 2017-12-01 21:41:13.260482720 -0500
@@ -282,10 +282,6 @@
if (value_extract_word(valp, &l, NULL) < 0)
return -1;
- /* We need "long" to be long enough to hold platform
- * pointers. */
- typedef char assert__long_enough_long[-(sizeof(l) < sizeof(void *))];
-
value_common_init(ret_val, valp->inferior, valp,
valp->type->u.ptr_info.info, 0);
ret_val->u.value = l; /* Set the address. */
EOF
cat >$TEMP/lens_default.c.patch <<EOF
--- lens_default.c 2017-12-01 21:44:46.960309877 -0500
+++ lens_default.c 2017-12-01 21:44:55.852302659 -0500
@@ -342,9 +342,6 @@
struct expr_node *length, size_t maxlen, int before,
const char *open, const char *close, const char *delim)
{
- /* We need "long" to be long enough to cover the whole address
- * space. */
- typedef char assert__long_enough_long[-(sizeof(long) < sizeof(void *))];
long l;
if (expr_eval_word(length, value, arguments, &l) < 0)
return -1;
EOF
if [ ! -e $SOFTWARE/bin/ltrace ]; then
echo "Installing ltrace 0.7.3 ..."
download https://www.ltrace.org/ltrace_0.7.3.orig.tar.bz2 ltrace-0.7.3.tar.bz2 \
&& patch --ignore-whitespace <$TEMP/value.c.patch \
&& patch --ignore-whitespace <$TEMP/lens_default.c.patch \
&& install_software exec_configure "ltrace"
cd $TEMP
fi
}
pkg_bashdb() {
# Install bashdb
if [ ! -e $SOFTWARE/bin/bashdb ]; then
echo "Installing bashdb 4.4-0.94..."
download https://sourceforge.net/projects/bashdb/files/bashdb/4.4-0.94/bashdb-4.4-0.94.tar.gz/download bashdb-4.4-0.94.tar.gz \
&& install_software exec_configure "bashdb"
cd $TEMP
fi
}
pkg_git() {
# Install git
if [ ! -e $SOFTWARE/bin/git ]; then
echo "Installing git 2.19 ..."
download https://github.com/git/git/archive/v2.19.1.tar.gz git-2.19.1.tar.gz \
&& install_software exec_autoconf "git"
cd $TEMP
fi
}
pkg_meson() {
# Install meson
if [ ! -e $SOFTWARE/bin/meson ]; then
resolve_dependencies python-latest ninja
echo "Installing meson 0.46.1 ..."
download https://github.com/mesonbuild/meson/releases/download/0.46.1/meson-0.46.1.tar.gz \
&& python3 setup.py build \
&& python3 setup.py install --prefix=$SOFTWARE/usr
cd $TEMP
fi
}
pkg_ninja() {
# Install ninja-build
if [ ! -e $SOFTWARE/bin/ninja ]; then
echo "Installing ninja 1.8.2 ..."
download https://github.com/ninja-build/ninja/archive/v1.8.2.tar.gz ninja-1.8.2.tar.gz \
&& python3 configure.py --bootstrap \
&& cp $(find . -type f -name ninja) $SOFTWARE/bin
cd $TEMP
fi
}
# @binary = "python" or "python3", etc
# @major-minor = major and minor version number
# @patch = patch number
compare_python_versions() {
local binary=$1
local major_minor=$2
local patch=$3
local vnumbers=( $($binary --version | sed 's/Python \([[:digit:]]\.[[:digit:]]\)\.\([[:digit:]]\)/\1 \2/g') )
if (( $(echo "${vnumbers[0]} < $major_minor" | bc -l) )); then
return 1
elif (( $(echo "${vnumbers[0]} == $major_minor" | bc -l) )); then
if (( $(echo "${vnumbers[1]} < $patch" | bc -l) )); then
return 1
else
return 0
fi
else
return 0
fi
# 0 = system Python version is at least supplied version
# 1 = otherwise
}
pkg_python-latest() {
# if ! compare_python_versions python3 3.6 5; then
echo "$version detected, but Python 3.6.5 required. Installing"
download https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz \
&& install_software exec_configure "python"
cd $TEMP
# fi
}
pkg_glibc-latest() {
echo "Installing glibc 2.27 ..."
download https://ftp.gnu.org/gnu/libc/glibc-2.27.tar.xz \
&& install_software exec_configure "glibc"
cd $TEMP
}
pkg_gcc-latest() {
download https://ftp.gnu.org/gnu/gcc/gcc-8.1.0/gcc-8.1.0.tar.gz \
&& install_software exec_configure "gcc"
cd $TEMP
}
pkg_libattr() {
if [ ! -e $SOFTWARE/lib/libattr.so ]; then
echo "Installing libattr 2.4.47 ..."
download http://download.savannah.gnu.org/releases/attr/attr-2.4.47.src.tar.gz attr-2.4.47.tar.gz \
&& install_software exec_configure "libattr" \
&& make install-lib \
&& make install-dev
cd $TEMP
fi
}
pkg_libarchive() {
if [ ! -e $SOFTWARE/lib/libarchive.so ]; then
echo "Installing libarchive 3.3.2"
download https://www.libarchive.org/downloads/libarchive-3.3.2.tar.gz \
&& install_software exec_configure "libarchive"
cd $TEMP
fi
}
pkg_libcap() {
if [ ! -e $SOFTWARE/lib/libcap.so ]; then
resolve_dependencies libattr
echo "Installing libcap 2.24 ..."
download https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.24.tar.xz \
&& make DESTDIR=$SOFTWARE/usr install \
&& cp -r libcap $SOFTWARE/include/libcap \
&& sleep 10
cd $TEMP
fi
}
pkg_fakeroot() {
if [ ! -e $SOFTWARE/lib/libfakeroot/libfakeroot.so ]; then
resolve_dependencies libcap
echo "Installing fakeroot 1.22 ..."
download http://ftp.debian.org/debian/pool/main/f/fakeroot/fakeroot_1.22.orig.tar.bz2 fakeroot-1.22.tar.bz2 \
&& install_software exec_configure "fakeroot"
cd $TEMP
fi
}
pkg_pacman() {
if [ ! -e $SOFTWARE/bin/pacman ]; then
resolve_dependencies fakeroot libarchive
echo "Installing pacman 5.1.0 ..."
download https://sources.archlinux.org/other/pacman/pacman-5.1.0.tar.gz \
&& install_software exec_configure "pacman"
cd $TEMP
fi
}
pkg_wget() {
if [ ! -e $SOFTWARE/bin/wget ]; then
echo "Installing wget 1.19 ..."
download http://ftp.gnu.org/gnu/wget/wget-1.19.1.tar.gz \
&& install_software exec_configure "wget"
cd $TEMP
fi
}
declare -A packages
packages=( ["bashdb"]="pkg_bashdb" \
["ltrace"]="pkg_ltrace" \
["bear"]="pkg_bear" \
["oh-my-zsh"]="pkg_oh-my-zsh" \
["meson"]="pkg_meson" \
["ninja"]="pkg_ninja" \
["python-3.6.5"]="pkg_python-latest" \
["glibc-2.27"]="pkg_glibc-latest" \
["gcc-8.1.0"]="pkg_gcc-latest" \
["pacman"]="pkg_pacman" \
["libattr"]="pkg_libattr" \
["git"]="pkg_git" \
["wget"]="pkg_wget" )
if (( $# < 1 )); then
echo "Usage: $0 <list of packages>"
printf "Packages: "
for pkg in "${!packages[@]}"; do
printf "$pkg "
done
echo ""
exit 1
fi
mkdir -p $TEMP
cd $TEMP
requested_packages=${@:1}
for pkg in ${requested_packages[@]}; do
func=${packages[$pkg]}
if [ -z $func ]; then
echo "Warning: no package $pkg found"
else
$func
fi
done
echo "Finished installing all software."
quit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment