Skip to content

Instantly share code, notes, and snippets.

@adriweb
Created January 28, 2024 14:12
Show Gist options
  • Save adriweb/96d6513d6c15d027431f12f73b717610 to your computer and use it in GitHub Desktop.
Save adriweb/96d6513d6c15d027431f12f73b717610 to your computer and use it in GitHub Desktop.
#! /bin/bash
# This script, aimed at users, automates the compilation and installation of tilp & gfm
# from the Git repositories.
# It's mirrored at http://lpg.ticalc.org/prj_tilp/download/install_tilp.sh
#
# **********
# IMPORTANT:
# **********
# * please read below for prerequisites (build dependencies) or peculiarities (e.g. 64-bit Fedora).
# * you should remove equivalent packages, if any, before running this script.
#
# Copyright (C) Lionel Debroux 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2018
# Copyright (C) Adrien "Adriweb" Bertrand 2015
# Copyright (C) Fabian "Vogtinator" Vogt 2016
# libti* and tilp are compiled with a proposed set of configuration options,
# but you may wish to use others. The complete list is available through
# `./configure --help` run in $SRCDIR/tilp/tilibs/libticonv/trunk, $SRCDIR/tilp/tilibs/libtifiles/trunk,
# $SRCDIR/tilp/tilibs/libticables/trunk, $SRCDIR/tilp/tilibs/libticalcs/trunk,
# $SRCDIR/tilp/tilp_and_gfm/gfm/trunk and $SRCDIR/tilp/tilp_and_gfm/tilp/trunk.
# **********************************************************************
# MANDATORY dependencies for compiling and running libti*, gfm and tilp:
# **********************************************************************
# (Debian and Fedora package names are given as examples, install respectively with `apt-get install ...` and `yum install ...`)
# * Git (git, git)
# * Suitable C compiler + C++ compiler (the newer, the better):
# * GCC + G++: (gcc + g++, gcc + gcc-c++)
# * Clang (clang, clang), preferably version 3.0 and later.
# * GNU make (make, make). BSD make might work.
# (on Debian, you can install "build-essential" to get gcc, g++ and make)
# * pkg-config (pkg-config, pkgconfig)
# * GNU autoconf (autoconf, autoconf)
# * GNU automake (automake, automake)
# * GNU libtool (libtool, libtool)
# * glib 2.x development files (libglib2.0-dev, glib2-devel)
# * zlib development files (zlib1g-dev, zlib-devel)
# * libusb development files (libusb-1.0-0-dev, libusb1-devel)
# (libusb 1.0 preferred, libticables' libusb 0.1 backend based on libusb-dev or libusb-devel in maintenance mode now)
# * GTK+ 2.x development files (libgtk2.0-dev, gtk2-devel)
# * Glade development files (libglade2-dev, libglade2-devel)
# * GNU gettext (gettext, gettext)
# * GNU bison (bison, bison)
# * GNU flex (flex, flex)
# * GNU groff (groff, groff)
# * GNU texinfo (texinfo, texinfo)
# * XDG utils (xdg-utils, xdg-utils)
# * libarchive (libarchive-dev)
# * intltool (intltool)
# ******************************************************************************
# Default prefix where the binaries will be installed, e.g.
# $HOME, /usr, /usr/local, /opt/tilp.
# Note that you can set the value of PREFIX interactively through e.g.:
# $ PREFIX="$HOME" <path>/install_tilp.sh
# ******************************************************************************
# IMPORTANT NOTES:
# ----------------
# * for compilation to succeed, you may have to execute
# $ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:[{$PREFIX}]/lib/pkgconfig
# (where [{$PREFIX}] is the contents of the PREFIX line below, without the quotes).
# The main cause for having to execute this line is installing to e.g. PREFIX=$HOME or /usr/local,
# but it may be necessary when installing to PREFIX=/usr, if your distro doesn't store
# libraries into the standard /usr/lib path.
#
# * after successful installation, you may have to add $PREFIX/bin to $PATH,
# and $PREFIX/lib to $LD_LIBRARY_PATH, for the SVN versions of libti*, tilp & gfm
# to get picked up.
if [ "x$PREFIX" = "x" ]; then
# Default to replacing system packages (if any), because
# 1) distro packages are usually outdated;
# 2) /usr/local subdirs are less likely to be in $PATH / $LD_LIBRARY_PATH / $PKG_CONFIG_PATH
# than /usr subdirs => more spurious install issues which waste both user and maintainer time.
PREFIX="/usr"
fi
# ******************************************************************************
# Default place where the sources will be stored, if it's not de
# Note that you can set the value of SRCDIR thusly:
# $ SRCDIR="/opt/src" <path>/install_tilp.sh
# ******************************************************************************
if [ "x$SRCDIR" = "x" ]; then
SRCDIR="$HOME/lpg"
fi
# ******************************************************************************
# Default values for the C and C++ compilers, if these variables are not set
# in the environment or the command-line (before the invocation of install_tilp.sh).
# ******************************************************************************
if [ "x$CC" = "x" ]; then
#CC=clang
CC=gcc
fi
if [ "x$CXX" = "x" ]; then
#CXX=clang++
CXX=g++
fi
# Don't use "yes" if you just want master for tilibs.
USE_TILIBS_EXPERIMENTAL2="yes"
# Subroutine: clone/update repository copies.
handle_repository_copies() {
module_name="$1"
echo "=== Downloading $module_name ==="
if [ -d "$module_name" -a -d "$module_name/.git" ]; then
echo "Updating $module_name"
cd "$module_name"
git pull || return 1
else
echo "Cloning $module_name"
git clone "https://github.com/debrouxl/$module_name" "$module_name" || return 1
cd "$module_name"
fi
if [ "$module_name" = "tilibs" ]; then
if [ "x$USE_TILIBS_EXPERIMENTAL2" = "xyes" ]; then
echo "Checking out the 'experimental2' branch"
git checkout experimental2 || return 1
fi
fi
cd ..
}
# Subroutine: checkout/update, `configure`, `make` and `make install` the given module
install_one_module() {
echo "=== $2 ==="
module_name="$1/$2"
shift # Swallow the two first arguments, so as to be able to pass the rest to configure.
shift
cd "$module_name/trunk"
echo "Configuring $module_name"
# Add --libdir=/usr/lib64 on e.g. 64-bit Fedora 14, which insists on searching for 64-bit libs in /usr/lib64.
# Or modify PKG_CONFIG_PATH as described above.
mkdir -p m4 || return 1
autoreconf -i -v -f || return 1
./configure "--prefix=$PREFIX" CC=$CC CXX=$CXX $@ || return 1
echo "Building $module_name"
make || return 1
echo "Installing $module_name"
make install || return 1
cd -
}
# Subroutine: `make uninstall` the given module
remove_one_module() {
echo "=== $2 ==="
module_name="$1/$2"
cd "$module_name/trunk" || return 1
echo "Uninstalling $module_name"
make uninstall || return 1
cd -
}
# Subroutine: perform quick rough sanity check on compilers and PREFIX.
rough_sanity_checks() {
echo "Creating output folder if necessary"
mkdir -p "$SRCDIR/tilp" || return 1
echo "Performing a quick rough sanity check on compilers"
# Test CC, which also checks whether the user can write to SRCDIR
cat << EOF > "$SRCDIR/tilp/hello.c"
#include <stdio.h>
int main(int argc, char * argv[]) {
printf("Hello World !\n");
return 0;
}
EOF
"$CC" "$SRCDIR/tilp/hello.c" -o "$SRCDIR/tilp/hello" || return 1
"$SRCDIR/tilp/hello" || return 1
echo "CC=$CC exists and is not totally broken"
# Test CXX, which also checks whether the user can write to SRCDIR
cat << EOF > "$SRCDIR/tilp/hello.cc"
#include <cstdio>
int main(int argc, char * argv[]) {
printf("Hello World !\n");
return 0;
}
EOF
"$CXX" "$SRCDIR/tilp/hello.cc" -o "$SRCDIR/tilp/hello" || return 1
"$SRCDIR/tilp/hello" || return 1
echo "CXX=$CXX exists and is not totally broken"
echo "Checking whether $PREFIX can be written to"
mkdir -p $PREFIX
if [ "$?" -ne 0 ]; then
echo -e "\033[1mNo, cannot create $PREFIX. Perhaps you need to run the script as root ?\nAborting.\033[m"
return 1
fi
TEMPFILE=`mktemp $PREFIX/XXXXXXXXXXX`
if [ "$?" -ne 0 ]; then
echo -e "\033[1mNo, cannot write to $PREFIX. Perhaps you need to run the script as root ?\nAborting.\033[m"
return 1
fi
cat << EOF > "$TEMPFILE"
This is a test file
EOF
if [ "$?" -ne 0 ]; then
echo -e "\033[1mNo, cannot write to $PREFIX. Perhaps you need to run the script as root ?\nAborting.\033[m"
return 1
fi
rm "$TEMPFILE"
}
listdeps() {
echo "Debian and derivatives (Ubuntu 14.04 LTS \"Trusty\", Debian 8 \"Jessie\", Ubuntu 16.04 LTS \"Xenial\", Debian 9 \"Stretch\":"
echo -e " apt-get install build-essential git autoconf automake autopoint libtool libtool-bin libglib2.0-dev zlib1g-dev libusb-1.0-0-dev libgtk2.0-dev libglade2-dev gettext bison flex groff texinfo xdg-utils libarchive-dev intltool\n"
echo "Fedora 23, Fedora 26:"
echo -e " dnf install git gcc gcc-c++ make pkgconfig autoconf automake libtool glib2-devel zlib-devel libusb1-devel gtk2-devel libglade2-devel gettext bison flex groff texinfo xdg-utils libarchive-devel intltool xz\n"
echo "CentOS 7:"
echo -e " yum install git gcc gcc-c++ make pkgconfig autoconf automake libtool glib2-devel zlib-devel libusb1-devel gtk2-devel libglade2-devel gettext bison flex groff texinfo xdg-utils libarchive-devel intltool xz\n"
echo "OpenSUSE 42.1:"
echo -e " zypper install git gcc gcc-c++ make pkg-config autoconf automake libtool glib2-devel zlib-devel libusb-1_0-devel gtk2-devel libglade2-devel gettext-tools bison flex groff texinfo xdg-utils libarchive-devel intltool xz\n"
echo "Alpine 3.3:"
echo -e " apk add git gcc g++ make pkgconfig autoconf automake libtool glib-dev zlib-dev libusb-dev gtk+-dev libglade-dev gettext-dev bison flex groff texinfo xdg-utils libarchive-dev intltool xz\n"
echo "Arch Linux 2015.06.01 + upgrades:"
echo -e " pacman -S git gcc make pkgconfig autoconf automake libtool glib2 zlib libusb gtk2 libglade gettext bison flex groff texinfo xdg-utils libarchive intltool xz\n"
echo "Slackware 14.2:"
echo -e " slackpkg install git gcc binutils make pkgconfig autoconf automake libtool glib2 zlib libusb gtk+2 libglade gettext bison flex groff texinfo xdg-utils libarchive intltool xz ca-certificates libmpc glibc cyrus-sasl curl perl m4 less kernel-headers pkg-config guile gc libffi libcroco libxml2 lzo nettle acl eudev pango cairo pixman fontconfig freetype libpng harfbuzz expat mesa libdrm libX11 xproto kbproto libxcb libpthread-stubs libXau libXdmcp libXext xextproto libXdamage damageproto libXfixes fixesproto libXxf86vm xf86vidmodeproto libXrender renderproto gdk-pixbuf2 atk libxshmfence libXinerama libXi libXrandr libXcursor libXcomposite\n"
echo "MacOS X:"
echo -e " brew install gettext libarchive autoconf automake pkgconfig libtool glib lzlib libusb gtk+ libglade sdl bison flex texinfo libiconv intltool"
echo -e " brew link --force gettext (you can use 'brew unlink' later. Also, adjust PKG_CONFIG_PATH if needed/possible)."
}
# The main part of the script starts here.
# Shall we list build deps ?
if [ "x$1" = "x--listdeps" ]; then
echo "Build dependencies for libticonv, libtifiles, libticables, libticalcs, gfm and tilp:"
listdeps
exit 0
fi
# First of all, platform-specific adjustments.
UNAME=`uname`
# On MacOS X 10.11, locally compiled programs are _really_ supposed to be installed to /usr/local.
if [ "x$PREFIX" = "x/usr" ]; then
if [ "x$UNAME" = "xDarwin" ]; then
echo "Modern MacOS X versions don't like programs installing to /usr, using /usr/local instead"
PREFIX="/usr/local"
fi
fi
# On MacOS X 10.11+, need to fiddle with PKG_CONFIG_PATH.
if [ "x$UNAME" = "xDarwin" ]; then
echo "Modifying PKG_CONFIG_PATH on MacOS X"
if [ "x$PKG_CONFIG_PATH" = "x" ]; then
PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:$PREFIX/lib/pkgconfig:/usr/local/opt/libarchive/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/opt/X11/lib/pkgconfig"
else
PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:$PREFIX/lib/pkgconfig:/usr/local/opt/libarchive/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/opt/X11/lib/pkgconfig"
fi
export PKG_CONFIG_PATH
fi
LIBDIR="$PREFIX/lib"
# Some 64-bit Linux distros use /lib64 or /usr/lib64.
if [ "x$UNAME" = "xLinux" ]; then
echo "Determining whether $PREFIX/lib64 is probably used"
ldd /usr/bin/getent | grep "=>" | grep /lib64/ || echo "No, $PREFIX/lib64 is probably not used"
ldd /usr/bin/getent | grep "=>" | grep /lib64/ && echo "Yes, $PREFIX/lib64 is probably used, will use it for LIBDIR" && LIBDIR="$PREFIX/lib64"
fi
# Go on.
echo Will use "PREFIX=$PREFIX"
echo Will use "SRCDIR=$SRCDIR"
if [ "x$USE_TILIBS_EXPERIMENTAL2" = "xyes" ]; then
echo "***** Will checkout the experimental2 branch of tilibs *****"
fi
echo Will use "PATH=$PATH"
echo Will use "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
echo Will use "PKG_CONFIG_PATH=$PKG_CONFIG_PATH"
echo Will use "LIBDIR=$LIBDIR"
echo Will use "CC=$CC"
echo Will use "CXX=$CXX"
echo -e "\033[4mBefore proceeding further, make sure that you're ready to go (look inside the install script):\033[m"
echo -e "1) configured \033[1mPREFIX\033[m and \033[1mSRCDIR\033[m the way you wish"
echo -e " (as well as \033[1mCC\033[m and \033[1mCXX\033[m if you're into using non-GCC compilers when the distro defaults to GCC);"
echo -e "2) configured \033[1mPKG_CONFIG_PATH\033[m if necessary"
echo -e "3) \033[1mpurged any installed distro packages\033[m for libticonv, libtifiles, libticables, libticalcs, gfm, tilp."
echo -e "4) installed the build dependencies listed in the script. For instance:"
listdeps
echo -e "\033[4mOtherwise, either the build will fail, or the system may not use the just-built version (e.g. if you didn't purge the distro packages) !\033[m"
echo -e "\033[1mENTER to proceed, CTRL + C to abort\033[m."
read
rough_sanity_checks || exit 1
cd "$SRCDIR/tilp"
if [ "x$1" != "x--remove" ]; then
handle_repository_copies tilibs || exit 1
handle_repository_copies tilp_and_gfm || exit 1
install_one_module tilibs libticonv "--libdir=$LIBDIR" --enable-iconv || exit 1
# Useful configure options include --disable-nls.
install_one_module tilibs libtifiles "--libdir=$LIBDIR" || exit 1
# Useful configure options include --disable-nls, --enable-logging
install_one_module tilibs libticables "--libdir=$LIBDIR" --enable-logging --enable-libusb10 || exit 1
# Useful configure options include --disable-nls.
install_one_module tilibs libticalcs "--libdir=$LIBDIR" || exit 1
install_one_module tilp_and_gfm gfm "--libdir=$LIBDIR" || exit 1
install_one_module tilp_and_gfm tilp "--libdir=$LIBDIR" || exit 1
else
remove_one_module tilp_and_gfm tilp || exit 1
remove_one_module tilp_and_gfm gfm || exit 1
remove_one_module tilibs libticalcs || exit 1
remove_one_module tilibs libticables || exit 1
remove_one_module tilibs libtifiles || exit 1
remove_one_module tilibs libticonv || exit 1
fi
echo "=================================================="
echo "=== libti* + gfm + tilp installed successfully ==="
echo "=================================================="
echo ""
echo ""
echo ""
echo "=================================================="
echo "IMPORTANT NOTES IMPORTANT NOTES"
echo "=================================================="
echo "If you want to use TILP as a non-root user, follow the instructions in $SRCDIR/tilp/tilibs/libticables/trunk/CONFIG"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment