Skip to content

Instantly share code, notes, and snippets.

@eminence
Last active January 22, 2024 06:36
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save eminence/85961d47244a140fde89314837d0db0a to your computer and use it in GitHub Desktop.
Save eminence/85961d47244a140fde89314837d0db0a to your computer and use it in GitHub Desktop.
#!/bin/sh
## https://gist.github.com/eminence/85961d47244a140fde89314837d0db0a
set -e
PWD=`pwd`
DD=$PWD/downloads/ # Download Directory
function download {
BASE=`basename $1`
mkdir -p $DD
if [ -e $DD/$BASE ]; then
echo "$BASE is already downloaded, skipping."
return 0
fi
curl -o $DD/$BASE -L $1
}
echo -n "Do you want to download packages into $DD/ ? [y/N] "
read do_download
if [ "$do_download" == "y" ]; then
download https://github.com/tmux/tmux/releases/download/2.6/tmux-2.6.tar.gz
download https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
download http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz
download https://github.com/google/protobuf/releases/download/v3.4.1/protobuf-cpp-3.4.1.tar.gz
download https://github.com/mobile-shell/mosh/releases/download/mosh-1.3.2/mosh-1.3.2.tar.gz
download https://www.openssl.org/source/openssl-1.0.2l.tar.gz
download https://github.com/telmich/gpm/archive/1.20.7.tar.gz
file downloads/*
echo ""
echo "Unpacking all the tarballs"
(cd downloads; ls *.tar.gz | xargs -n1 tar -zxf)
else
echo "You are expected to manually put the necessary files into $DD/"
fi
TMUX_SRC_DIR=$DD/tmux-2.6
LIBEVENT_SRC_DIR=$DD/libevent-2.1.8-stable
NCURSES_SRC_DIR=$DD/ncurses-6.0
PROTOBUF_SRC_DIR=$DD/protobuf-3.4.1
MOSH_SRC_DIR=$DD/mosh-1.3.2
OPENSSL_SRC_DIR=$DD/openssl-1.0.2l
GPM_SRC_DIR=$DD/gpm-1.20.7
#INSTALL_DIR=$PWD/prefix/
INSTALL_DIR=/rd/gen/lxd/do_not_delete/$PLATIDENT/prefix
echo ""
echo "========================================"
echo "About to build the following packages:"
(cd $DD; ls -1 *.tar.gz)
echo ""
echo "Everything will be installed to ${INSTALL_DIR}"
echo "Temporary build dir: ${PWD}"
echo "Press enter to continue or ctrl-c to exit"
read c
export CFLAGS="-I${INSTALL_DIR}/include -fPIC"
export CXXFLAGS=$CFLAGS
export PATH="${INSTALL_DIR}/bin:${PATH}"
export LDFLAGS="-L${INSTALL_DIR}/lib -Wl,-rpath,${INSTALL_DIR}/lib"
export PKG_CONFIG_PATH="${INSTALL_DIR}/lib/pkgconfig"
export LD_LIBRARY_PATH="${INSTALL_DIR}/lib"
MAKEOPTS=-j4
cd $LIBEVENT_SRC_DIR
make clean || echo
./configure --enable-static=yes --enable-shared=yes --prefix=${INSTALL_DIR} && make $MAKEOPTS && make install
echo "libevent done. Press enter to continue"
read c
cd $OPENSSL_SRC_DIR
make clean || echo
./config no-shared -fPIC --prefix=${INSTALL_DIR} && make $MAKEOPTS && make install
echo "Openssl done. Press enter to continue"
read c
echo "Building protobuf..."
cd $PROTOBUF_SRC_DIR
make clean || echo
./configure --disable-shared --prefix=${INSTALL_DIR}; make $MAKEOPTS && make install
echo "protobuf done. Press enter to continue"
read c
echo "Building ncursesw..."
cd $NCURSES_SRC_DIR
make clean || echo
./configure --enable-pc-files --enable-widec --without-gpm --with-pkg-config-libdir=${PKG_CONFIG_PATH} --prefix=${INSTALL_DIR} && make $MAKEOPTS && make install
echo "Ncursesw done. Press enter to continue"
read c
echo "Building ncurses..."
cd $NCURSES_SRC_DIR
make clean || echo
./configure --enable-pc-files --without-gpm --with-pkg-config-libdir=${PKG_CONFIG_PATH} --prefix=${INSTALL_DIR} && make $MAKEOPTS && make install
echo "Ncurses done. Press enter to continue"
read c
echo "Building tmux..."
cd $TMUX_SRC_DIR
make clean || echo
./configure --prefix=${INSTALL_DIR} && make $MAKEOPTS && make install
echo "tmux done. Press enter to continue"
read c
echo "Building mosh..."
cd $MOSH_SRC_DIR
make clean || echo
./configure --prefix=${INSTALL_DIR} && make $MAKEOPTS && make install
echo "Mosh done"
echo "Everything done"
echo "Installed to ${INSTALL_DIR}"
@andersk
Copy link

andersk commented Nov 29, 2017

Bashism nits:

  • function download { is a bashism, use download () { instead.
  • == is a bashism, use = instead.
  • export CXXFLAGS=$CFLAGS needs to be quoted as export CXXFLAGS="$CFLAGS".

Consider running shellcheck to see some other bugs, but these ones break the script on /bin/sh -> dash systems even without, e.g., unusual characters in the directory name.

Also, ftp.gnu.org encourages the use of https.

@andersk
Copy link

andersk commented Nov 29, 2017

Also, because POSIX doesn’t believe in first-order logic, set -e is not tripped by the failure of the first command in an && chain. Use separate commands instead. I got this error (which is puzzling in its own right, but should have at least triggered a script failure).

gcc -DHAVE_CONFIG_H -I. -I../include  -D_GNU_SOURCE -DNDEBUG -I/tmp/m/prefix//include -fPIC  --param max-inline-insns-single=1200 -c ../ncurses/./base/lib_hline.c -o ../objects/lib_hline.o
In file included from ./curses.priv.h:325:0,
                 from ../ncurses/lib_gen.c:19:
_30028.c:1372:15: error: expected ‘)’ before ‘int’
../include/curses.h:1943:56: note: in definition of macro ‘mouse_trafo’
 #define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)
                                                        ^
Makefile:1022: recipe for target '../objects/lib_gen.o' failed
make[1]: *** [../objects/lib_gen.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory '/tmp/m/downloads/ncurses-6.0/ncurses'
Makefile:113: recipe for target 'all' failed
make: *** [all] Error 2
Ncursesw done.  Press enter to continue

@andersk
Copy link

andersk commented Nov 29, 2017

Maybe add -O2 to CFLAGS unless you meant to disable optimization? (Typical configure scripts default to -O2 only if CFLAGS is unset.)

@andersk
Copy link

andersk commented Nov 29, 2017

-I${INSTALL_DIR}/include should be unnecessary if pkg-config is installed (and I don’t think this works if it isn’t).

@javabrett
Copy link

@andersk Thanks for the notes. Curiously I did not see that ncurses error - I'm building in a Docker based on latest Fedora (because I am looking for a portable build for a RH-ish OS) - I guess the compilers differ.

What I am looking at now is a different set of ncurses configure options to try and get a typical binary output i.e. matching what you would see in a dist with ncurses installed.

@javabrett
Copy link

@ozancaglayan
Copy link

@andersk @javabrett the ncurses build failure is fixed by exporting CPPFLAGS="-P"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment