Last active
May 8, 2021 04:05
-
-
Save Prince781/049697b088955d285cec7e005ad5dd9e to your computer and use it in GitHub Desktop.
setup software in custom directory
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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